如何通过echo等命令传入多输入值无交互执行shell脚本
问题原因
你之前执行的echo password | echo y | ./install.sh无法生效,是因为管道仅会把左侧命令的标准输出连接到右侧命令的标准输入,中间的echo y不会读取左侧echo password的输出内容,只会直接输出字符串y,最终传给install.sh的只有y这一个输入值,第二个需要输入密码的交互位拿不到对应内容,自然会执行失败。
可行方案
方案1:按顺序拼接输入通过管道传入(无额外依赖,最推荐)
交互式脚本是按提示顺序逐行读取标准输入的,你只需要把需要输入的两个值(先y,再root密码)按顺序用换行分隔(换行等价于手动输入时按的回车),一次性传给脚本即可。优先用兼容性最好的printf实现,避免不同shell下echo转义行为不一致的问题:
printf 'y\n替换成你的实际root密码\n' | ./install.sh
如果你使用的是bash/zsh这类常见shell,确认echo支持-e转义参数的话,也可以写为:
echo -e 'y\n替换成你的实际root密码' | ./install.sh
小提示:如果不想明文密码留在shell历史记录里,可以临时关闭命令记录,完整写法为
set +o history; printf 'y\n你的密码\n' | ./install.sh; set -o history
方案2:用here-string传入输入(适合bash/zsh环境)
如果不想用管道,也可以用shell的here-string语法直接传入拼接好的输入内容:
./install.sh <<< $'y\n替换成你的实际root密码\n'
其中$'...'是shell的ANSI-C引用语法,会自动把字符串内的\n解析为实际换行符。
方案3:用expect实现精准交互(适合逻辑复杂的脚本)
如果脚本的交互提示顺序不固定、或者需要匹配提示内容再发送输入,可以使用expect工具实现自动交互,单行写法如下:
expect -c 'spawn ./install.sh; expect "are you sure you want to install (y/n)"; send "y\r"; expect "enter root password:"; send "替换成你的实际root密码\r"; expect eof'
该方案会先匹配到对应提示文本再发送输入,不会因为输入顺序错位导致失败,缺点是需要提前安装expect工具。
内容的提问来源于stack exchange,提问作者Anshul
相关产品推荐
相关产品推荐

