Expect未清理或干扰FIFO?SSH密钥打包Zip异常排查
解决expect输出污染Zip文件的问题
问题核心是expect默认会将spawn启动信息、交互过程日志输出到标准输出,这些内容和zip命令的输出混合后,破坏了Zip文件的头部标识(PK),导致文件无效。以下是两种直接有效的解决方法:
方法1:关闭expect的日志输出
在expect脚本开头添加log_user 0命令,完全禁用expect的交互日志输出,仅保留程序本身的必要输出(ssh-keygen已加-q参数静默,不会产生额外输出)。
修改后的expect代码段:
expect -c " log_user 0 spawn ssh-keygen -q -t ed25519 -a100 -C '' -f /tmp/foo expect \"Overwrite\" send \"y\r\" expect \"passphrase\" send \"$passw\r\" expect \"again\" send \"$passw\r\" expect eof "&
方法2:重定向expect的输出到空设备
如果不想修改expect脚本逻辑,可直接将expect的标准输出和标准错误重定向到/dev/null,避免污染主脚本的stdout:
修改后的expect启动命令:
expect -c " spawn ssh-keygen -q -t ed25519 -a100 -C '' -f /tmp/foo expect \"Overwrite\" send \"y\r\" expect \"passphrase\" send \"$passw\r\" expect \"again\" send \"$passw\r\" expect eof " > /dev/null 2>&1 &
完整修改后的测试脚本
#!/bin/bash export SSH_ASKPASS_REQUIRE=never rm -f /tmp/foo /tmp/foo.pub mkfifo /tmp/foo /tmp/foo.pub passw=$(cat) # 采用方法1关闭expect日志输出 expect -c " log_user 0 spawn ssh-keygen -q -t ed25519 -a100 -C '' -f /tmp/foo expect \"Overwrite\" send \"y\r\" expect \"passphrase\" send \"$passw\r\" expect \"again\" send \"$passw\r\" expect eof "& zip -j - --fifo /tmp/foo /tmp/foo.pub
执行echo "password" | ./test.sh > test.zip后,生成的test.zip即可正常解压。
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

