Mac下Expect脚本报错'spawn command not found'的排查求助
解决你的Expect脚本“spawn command not found”问题
嘿,我一眼就揪出问题啦——你在Expect脚本里混用了Bash的内置命令,Expect解释器根本认不出echo和read -s这些语法,这才导致后续的spawn命令执行异常(其实脚本在执行到第一个Bash命令时就已经出错了,后面的命令自然没法正常解析)。
具体错误点
echo不是Expect的命令:Expect里要往终端输出内容,得用send_user,而不是Bash的echo。read -s是Bash的输入方式:Expect里要实现隐藏密码输入的效果,得用stty配合expect_user来处理,不能直接用Bash的read。- 你把Bash和Expect的语法混在一起写,Expect解释器完全懵了,自然会抛出“spawn command not found”的错误。
修正后的完整脚本
我帮你把脚本改成了纯Expect语法,还补充了登录后执行tail命令并保持交互的逻辑:
#!/usr/bin/expect -f # 用send_user替代echo输出提示信息 send_user "starting tail\n" send_user "password for the box? " # 隐藏密码输入:先关闭终端回显 stty -echo # 读取用户输入的密码 expect_user -re "(.*)\n" set theBoxPassword $expect_out(1,string) # 恢复终端回显 stty echo send_user "\n" # 启动ssh连接 spawn ssh root@10.0.0.10 # 匹配密码提示 expect "root@10.0.0.10's password: " # 发送密码 send "$theBoxPassword\r" # 匹配登录成功后的提示符(这里假设是#,如果是普通用户可能是$) expect "# " # 执行tail命令查看错误日志,替换成你实际的日志路径 send "tail -f /var/log/error.log\r" # 保持交互状态,避免脚本执行完就退出 interact
额外小贴士
- 你已经确认了
/usr/bin/expect存在,所以shebang行#!/usr/bin/expect -f是没问题的。 - 测试的时候可以直接用
/usr/bin/expect -f 你的脚本名.exp执行,方便快速排查问题。 - 如果你的远程服务器提示符不是
#,记得把expect "# "改成对应的提示符,比如普通用户的$。
内容的提问来源于stack exchange,提问作者mwdowns
相关产品推荐
相关产品推荐

