如何在Ubuntu中用单行命令为交互式shell命令自动传递输入参数
Ubuntu 交互式Shell命令自动应答解决方案
你之前直接传参的方式失效,是因为这类交互式命令的输入是从标准输入(stdin)读取,而非读取命令行参数,因此参数无法被命令识别。可以选择以下三种方案解决:
方案1:使用Here Document按顺序传入输入
适合输入顺序固定的场景,将每一步的应答内容按交互顺序逐行写在EOF标记之间即可:
mycommand << EOF yes yes no # 按顺序补充剩余所有应答内容,一行对应一次输入 yes EOF
方案2:使用printf+管道传入输入
适合短应答的简单场景,用\n分隔每一步的应答内容,通过管道传给目标命令:
printf "yes\nyes\nno\nyes\n" | mycommand # 注意`\n`的数量和顺序要和交互步骤完全对应
如果所有应答都是yes,也可以直接用yes命令:
yes | mycommand
方案3:使用expect实现精准匹配应答(多步复杂交互场景推荐)
如果交互步骤可能变化、或者需要根据提示内容精准返回对应应答,推荐使用专门处理交互式命令的工具expect:
- 首先安装expect:
sudo apt update && sudo apt install expect -y
- 编写expect脚本(例:
auto_answer.exp),根据你的提示内容匹配对应应答:
#!/usr/bin/expect spawn mycommand # 匹配第一条提示内容,返回yes expect "第一条提示的关键字" send "yes\r" # 匹配确认提示,返回yes expect "确认提示的关键字" send "yes\r" # 依次补充剩余所有匹配规则 expect "是否启用调试模式" send "no\r" # 等待命令执行结束 expect eof
- 给脚本加执行权限后运行即可:
chmod +x auto_answer.exp ./auto_answer.exp
注意事项
- 部分安全相关的命令会直接读取终端(TTY)输入而非标准输入,这种场景下前两种方案会失效,必须使用expect模拟终端交互
- 应答内容如果包含特殊字符(引号、反斜杠、空格等),需要根据对应语法做转义处理
内容的提问来源于stack exchange,提问作者firasKoubaa
相关产品推荐
相关产品推荐

