补充说明
expect 用脚本驱动需要人工输入的交互程序(如 ssh、ftp、passwd、telnet)。它启动子进程,按模式等待输出,再发送输入,适合批量登录、自动应答、设备配置等场景。语法基于 Tcl。
脚本核心是 spawn(启动程序)、expect(等待输出模式)、send(发送字符串)、interact(交还控制权)。超时由 set timeout 秒数 控制,exp_continue 可继续匹配后续模式。
注意:把密码写进脚本有泄露风险,生产环境应使用 SSH 密钥或专用自动化工具。expect 不能替代健壮的 API;输出格式变化容易导致脚本失败。Debian 与 RHEL 的软件包名均为 expect。
调试时可加 -d 查看匹配过程。expect eof 等待子进程结束,expect timeout 处理超时分支。发送特殊字符用 \r(回车)和 \n(换行),注意不同程序要求不同。
语法
expect [选项] [脚本 [参数 ...]]
选项
-c 命令:直接执行 Tcl/Expect 命令;-f 文件:从文件读取脚本;-i:进入交互式解释器;-d:输出调试信息;-D:启用 Tcl 调试器;--:结束选项解析。
实例
#!/usr/bin/expect -f
# 自动登录并执行命令
set timeout 10
spawn ssh user@192.0.2.10
expect "password:"
send "secret\r"
expect "$ "
send "uptime\r"
expect "$ "
send "exit\r"
expect eof
# 单行执行:连接后等待提示符并交还控制权
expect -c 'spawn ssh user@host; expect "password:"; send "pass\r"; interact'