Bash执行其他命令/调用脚本时如何自动填充预设交互输入
自动向交互脚本传入预设输入的实现方案
根据你的场景,有两种常用实现方式,按需选择即可:
- 固定顺序无分支的简单交互:用Here Document
如果你每次运行./script.sh时,需要输入的内容顺序、内容本身完全固定,直接在调用脚本时用Here Document把所有输入按手动输入的顺序逐行写入即可,示例:
说明:#!/bin/bash # 第二个脚本auto_run.sh的内容 ./script.sh <<'EOF' 预设用户名 第二个交互项的输入内容 第三个交互项的输入内容 y EOF- 开头
<<'EOF'的单引号不要漏,作用是让中间的输入内容原样传递,不会被bash解析$、反引号这类特殊字符 - 每一行内容对应一次手动输入,和你手动操作时的输入顺序完全一致,行尾默认相当于按了回车
- 如果输入项很少,也可以简写为管道形式:
echo -e "预设用户名\n第二个输入\n第三个输入\ny" | ./script.sh,输入项多的时候可读性差,不推荐
- 开头
- 交互有判断分支的复杂场景:用expect工具
如果./script.sh的交互逻辑不是完全线性的(比如输入不符合要求会重弹提示、需要根据前一步输出判断下一步输入),或者脚本直接读取终端设备绕过了标准输入,就用expect来模拟真实的终端交互:- 先安装expect:debian/ubuntu系执行
sudo apt install expect,rhel/centos系执行sudo dnf install expect - 第二个脚本写法示例:
说明:#!/usr/bin/expect # 启动目标脚本 spawn ./script.sh # 匹配到username?提示时,发送预设用户名,\r模拟回车动作 expect "username?" send "你的预设用户名\r" # 匹配后续的密码提示,发送对应密码 expect "password:" send "你的预设密码\r" # 匹配确认提示,发送y expect "请确认操作(y/n):" send "y\r" # 等目标脚本执行完,把控制权交回当前终端 interactexpect后面的字符串只需要写对应提示里能唯一匹配的关键字即可,不需要写完整提示内容;send末尾的\r不能漏,否则相当于只输入了内容没按回车确认。 - 先安装expect:debian/ubuntu系执行
注意:如果用Here Document/管道方式传参不生效,基本都是因为目标脚本直接读取
/dev/tty而非标准输入,这种情况直接换expect方案即可。
内容的提问来源于stack exchange,提问作者elefant1000
相关产品推荐
相关产品推荐

