You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:53:45