如何在Expect脚本中正确Spawn BASH命令?
解决Expect脚本Spawn BASH命令的交互问题
嘿,我来帮你搞定这个Expect脚本的问题!你遇到的错误大概率是因为提示符匹配不对、send命令没加回车,或者缺少关键的等待步骤。下面我给你拆解正确的写法和常见坑点:
基础可用的Expect脚本模板
先给你一个能正常运行的示例,你可以基于这个修改:
#!/usr/bin/expect -f # 可选:开启调试模式,方便排查匹配问题(会输出详细的交互日志) exp_internal 1 # Spawn bash进程,如果你系统里bash路径特殊,可写绝对路径比如/bin/bash spawn bash # 等待bash的提示符,这里用正则匹配常见的$结尾的提示符(适配普通用户) expect -re {\$ $} # 发送第一条命令,记得加\r模拟回车!这是很多人踩的坑 send "ls -l ~/\r" # 等待命令执行完毕,再次出现提示符 expect -re {\$ $} # 发送退出命令,结束bash进程 send "exit\r" # 等待bash进程完全退出 expect eof
常见错误原因&解决办法
提示符匹配不准确
不同环境的bash提示符可能不一样:普通用户可能是user@hostname:~$,root用户是#,甚至有的自定义提示符会带特殊字符。
解决办法:用正则表达式匹配更灵活,或者同时匹配多种可能:expect { "# " { puts "Detected root prompt"; } -re {\$ $} { puts "Detected user prompt"; } }Send命令没加
\r
你输入命令后必须按下回车bash才会执行,所以send的内容末尾一定要加\r,比如send "pwd\r",而不是send "pwd"。脚本权限不足
别忘了给你的Expect脚本加执行权限:chmod +x your_script.expect,否则没法直接运行。没有等待进程结束
如果脚本提前退出,可能会导致bash进程没完成交互就被终止,一定要加上expect eof来等待bash进程彻底结束。
进阶:处理bash内的交互命令
如果需要在spawn的bash里执行需要交互的命令(比如sudo输密码、ssh登录),可以这么写:
#!/usr/bin/expect -f spawn bash expect -re {\$ $} send "sudo apt update\r" # 等待sudo的密码提示 expect "Password:" send "your_sudo_password\r" # 等待命令执行完回到bash提示符 expect -re {\$ $} send "exit\r" expect eof
按照上面的方法调整你的脚本,应该就能正常执行Spawn BASH的交互操作啦!
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

