如何安全读取密码并传递给多脚本?向需输入进程传字符串
解决办法
方法1:用环境变量传递(最推荐,安全又省事)
给子脚本加个小逻辑:先看有没有指定的环境变量,有就直接用这个变量当密码,没有再从终端读。这样父脚本只要把密码放到环境变量里导出,子脚本就能自动拿到,而且环境变量不会在ps/top的进程列表里暴露,也不会写到磁盘上,完全符合你的要求。
父脚本start_all.sh示例:
#!/bin/bash read -s -p "输入密码: " pass # -s 参数会隐藏输入的密码,更安全 echo export SCRIPT_PASS="$pass" # 后台启动所有子脚本 ./script1.sh & ./script2.sh & ./script3.sh & wait # 可选,加上这句会等所有子脚本跑完再退出父脚本
子脚本(比如script1.sh)修改密码读取部分:
#!/bin/bash # 先检查环境变量,没有再手动输入 if [ -n "$SCRIPT_PASS" ]; then pass="$SCRIPT_PASS" else read -s -p "输入密码: " pass echo fi # 这里写你原来使用$pass的业务逻辑...
方法2:用管道/Here-String传递(无需修改子脚本)
要是不想改动子脚本的代码,就直接把密码通过标准输入传给子脚本。这种方式也不会暴露密码,也不会写入磁盘。
父脚本示例:
#!/bin/bash read -s -p "输入密码: " pass echo # 用Here-String把密码直接喂给子脚本的read命令 ./script1.sh <<< "$pass" & ./script2.sh <<< "$pass" & ./script3.sh <<< "$pass" & wait
注意:这个方法要求子脚本里的read是从标准输入读取的(默认就是),如果子脚本的read指定了其他文件描述符则不适用。
方法3:自定义文件描述符传递
如果场景更复杂,还可以用自定义文件描述符来传递密码,灵活性更高。
父脚本示例:
#!/bin/bash read -s -p "输入密码: " pass echo # 把密码写入自定义文件描述符3 exec 3<<< "$pass" # 启动子脚本时将描述符3传递过去 ./script1.sh 3<&3 & ./script2.sh 3<&3 & ./script3.sh 3<&3 & exec 3<&- # 使用完毕后关闭文件描述符 wait
子脚本读取密码的部分:
#!/bin/bash read -s -u 3 pass # 从文件描述符3读取密码 # 后续业务逻辑...
内容的提问来源于stack exchange,提问作者SpaceMonkey
相关产品推荐
相关产品推荐

