You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:37:18