如何捕获命令行提示内容为不可修改的sh脚本自动应答
解决方案
原有代码的问题
- 语法逻辑错误:Shell 中判断
grep是否匹配到内容的正确写法是添加-q参数直接判断退出状态,你写的command.sh | grep 'Force' =0不符合 Shell 语法规范。 - 单向管道无法处理双向交互:普通管道只能把前一个命令的标准输出传给后一个命令的标准输入,无法实现「先读取目标脚本输出的提示,再把对应应答传给目标脚本的标准输入」的双向交互逻辑。
- 交互提示捕获失败:大部分脚本的交互提示默认输出到标准错误流(stderr),普通管道默认只会传递标准输出流(stdout),因此
grep根本抓不到提示内容。 - 无终端环境兼容问题:crontab 运行环境没有关联伪终端,很多依赖终端的交互脚本会直接卡住或报错。
推荐方案:使用 expect 实现自动应答
expect 是专门用于交互式程序自动应答的工具,完美适配你的需求。
第一步:安装expect
# Debian/Ubuntu 系 apt update && apt install -y expect # RHEL/CentOS 系 yum install -y expect
第二步:编写自动应答脚本
新建脚本文件 auto_respond.exp,内容如下:
#!/usr/bin/expect -f # 替换为你的目标脚本绝对路径 set target_script "/absolute/path/to/command.sh" # 启动目标脚本 spawn $target_script # 设置超时时间10秒,避免脚本异常卡住 set timeout 10 # 匹配输出的提示文本,返回对应应答 expect { "*Force*" { send "Force\r" exp_continue } "*Yes*" { send "Yes\r" exp_continue } timeout { puts "脚本执行超时" exit 1 } eof }
第三步:配置执行权限和crontab
# 给脚本加执行权限 chmod +x /absolute/path/to/auto_respond.exp
在 crontab 中直接配置该 expect 脚本即可,比如每分钟执行的配置:
* * * * * /absolute/path/to/auto_respond.exp >> /var/log/command_run.log 2>&1
注意事项
- 所有路径请使用绝对路径,避免 crontab 环境变量问题导致找不到文件。
- expect 匹配规则支持通配符
*,如果提示文本有特殊字符可以调整匹配规则保证命中。 - 如果目标脚本有多轮交互,可以在
expect块中新增对应的匹配规则即可。
内容的提问来源于stack exchange,提问作者nicopoal
相关产品推荐
相关产品推荐

