我有许多服务器,用于部署各种二进制文件。为此,我使用一个脚本将它们打包到档案中,发布到本地存储库,然后通过 ssh 连接到目标服务器并进行安装。
现在我有一个如下所示的脚本:
#!/bin/bash
packs=(app1 app2 app3 great_app main_server and_so_on)
for pack in ${packs[@]}; do
cd "$pack"
svn up
make redist-package
SERVER="$(cat ./server)"
ssh "$SERVER" <<< "wget 'http://dev-server/$pack'; install './$pack'" # ssh uses keys to authenticate
cd - &>/dev/null
done
这里,install
是一个特殊的脚本,用于解压和安装我们手工制作的小脚本emerge
。我删除了所有错误检查以避免脚本复杂化。
现在的问题是:我必须使用 对所有二进制文件进行签名bsign
。我希望用户输入一次密码,然后将其传递给bsign
。否则,为每个包单独输入相同的密码会很麻烦。
不幸的是,bsign
没有sudo -S
从 stdin 读取密码之类的功能。所以……我尝试使用 socat,但没有成功。我使用了socat
手册中的这一行,但没有结果:
socat - EXEC:'bsign -si .',pty,setsid,ctty <<< 'My password'
bsign
只是向我显示密码提示,就像没有 socat 一样。输入密码后,它就可以正常工作了。
我的猜测是,这是因为 bsign 运行 gpg,进而要求输入密码。是否有可能也socat
影响到这一点?gpg
bsign
更新:我找到了bsign
的选项-P --passphrase-fd0
,它应该告诉从iegpg
读取密码。明天会试试。fd 0
stdin
更新:失败,-P
不起作用。bsign
不过,这可能是由于我必须使用的错误(自定义补丁)导致的。