如何用Expect脚本在已登录远程服务器执行非Linux原生命令
解决Expect登录后执行设备CLI命令的方法
你提到的configure terminal、copy startup-config ftp configuration-id 1是交换机、路由器这类网络设备的专属CLI命令,并非Linux shell命令。要在Expect脚本里执行这些命令,核心是直接控制远程登录会话的交互流程,不要通过bash脚本中转——中转后Expect无法捕获设备CLI的输出和提示符,没法继续后续操作。
具体实现步骤如下:
- 直接用Expect的
spawn调用ssh或telnet这类远程登录工具,替代调用bash脚本的方式,全程掌控会话输出。 - 匹配设备的登录成功提示符(比如
Switch>、Router#),确认进入设备CLI界面。 - 依次发送目标命令,每发一条后匹配对应的新提示符或交互提示,完成必要的确认操作。
示例Expect脚本
#!/usr/bin/expect # 设置超时时间,根据网络情况调整 set timeout 30 # 直接启动远程登录会话(以ssh为例,telnet同理) spawn ssh username@remote-device-ip # 处理登录密码提示 expect "password:" send "your-device-password\r" # 匹配设备的用户模式提示符(根据实际设备调整) expect "Switch>" # 进入配置模式 send "configure terminal\r" # 匹配配置模式提示符 expect "Switch(config)#" # 执行备份配置到FTP的命令 send "copy startup-config ftp configuration-id 1\r" # 处理命令执行中的交互提示,根据设备实际输出调整 expect { "Enter FTP server address:" { send "your-ftp-ip\r"; exp_continue } "Confirm copy? [yes/no]" { send "yes\r"; exp_continue } "Switch(config)#" } # 退出配置模式 send "exit\r" expect "Switch>" # 退出设备会话 send "logout\r" expect eof
关键注意事项
- 精准匹配提示符:不同设备的提示符格式差异大,必须根据实际设备的输出调整
expect后的匹配字符串,避免误触发。 - 处理多步交互:
copy这类命令可能会弹出多个确认提示,要用expect的多分支匹配块(如上例)逐个处理。 - 调试技巧:脚本执行异常时,可在开头添加
exp_internal 1开启调试模式,查看所有会话交互细节,快速定位问题。
内容的提问来源于stack exchange,提问作者David Palafox
相关产品推荐
相关产品推荐

