如何将Bash脚本执行的交换机命令结果重定向至文件?
解决Telnet登录交换机执行命令并保存结果的问题
问题根源
你之前的脚本仅写入命令文本而非执行结果,是因为Telnet是交互式会话,直接管道或重定向无法处理用户名、密码输入及交换机提示符的等待逻辑;而screen -L的重复写入问题,通常是因为会话重复创建或日志追加未做控制导致的。
可靠解决方案:使用Expect脚本
Expect是专门处理交互式命令行会话的工具,能精准匹配提示符、发送指令,完全避免screen的不稳定问题。
步骤1:编写Expect脚本(telnet_switch.exp)
#!/usr/bin/expect -f # 设置超时时间(按需调整) set timeout 15 # 接收外部传入的参数:交换机IP、用户名、密码、要执行的命令、输出文件路径 set switch_ip [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] set command [lindex $argv 3] set output_file [lindex $argv 4] # 启动Telnet会话 spawn telnet $switch_ip # 匹配用户名提示符(根据你的交换机实际提示修改) expect "Username:" send "$username\r" # 匹配密码提示符 expect "Password:" send "$password\r" # 匹配交换机命令行提示符(比如>或#,按需修改) expect ">" # 发送要执行的命令 send "$command\r" # 等待命令执行完成,回到提示符 expect ">" # 退出Telnet会话 send "exit\r" # 将会话日志写入指定文件 log_file -a $output_file # 等待会话结束 expect eof
步骤2:编写Bash调用脚本
#!/bin/bash # 配置参数 SWITCH_IP="192.168.1.100" USER="admin" PASS="your_switch_password" EXEC_CMD="show running-config" OUTPUT_FILE="switch_run_config.txt" # 给Expect脚本添加执行权限 chmod +x telnet_switch.exp # 调用Expect脚本 ./telnet_switch.exp $SWITCH_IP $USER $PASS "$EXEC_CMD" $OUTPUT_FILE
注意事项
- 交换机的提示符(如
>或#)、用户名/密码提示文本,需根据你的设备实际情况修改脚本中的expect匹配内容。 - 若执行耗时较长的命令(比如批量查询),可增大
set timeout的值。
改进Screen方案(仅作备选)
如果坚持使用screen,可通过以下方式避免重复写入:
#!/bin/bash SWITCH_IP="192.168.1.100" USER="admin" PASS="your_switch_password" EXEC_CMD="show running-config" OUTPUT_FILE="screen_output.txt" # 提前清空输出文件,避免追加重复内容 > $OUTPUT_FILE # 启动单例screen会话,指定日志文件并执行Telnet交互 screen -L -Logfile $OUTPUT_FILE -dmS telnet_task bash -c " # 用expect处理交互(避免直接here-doc的时序问题) expect << EOF spawn telnet $SWITCH_IP expect \"Username:\" send \"$USER\r\" expect \"Password:\" send \"$PASS\r\" expect \">\" send \"$EXEC_CMD\r\" expect \">\" send \"exit\r\" expect eof EOF " # 等待命令执行完成(按需调整等待时间) sleep 8 # 强制关闭screen会话 screen -S telnet_task -X quit
这个方案本质还是嵌套了Expect逻辑来处理交互,避免直接用here-doc导致的时序错误,从而减少重复写入的概率。
内容的提问来源于stack exchange,提问作者GillFile
相关产品推荐
相关产品推荐

