如何让Telnet Expect脚本仅将自定义输出写入日志文件?
解决Expect脚本冗余输出问题
嘿,这个问题我太懂了!你看到的冗余信息其实是telnet命令本身吐出来的(比如Trying 192.168.5.100...或者Connected to 192.168.5.100这类),和你用send_user输出的内容混在了一起。要解决这个问题,只要把telnet的所有输出都屏蔽掉,只保留你自定义的提示信息就行,给你两种简单的方案:
方案一:给spawn命令加输出重定向
直接在spawn调用telnet的时候,把它的标准输出和错误输出都重定向到/dev/null,彻底丢弃冗余内容:
#!/usr/bin/expect set IP 192.168.5.100 # 将telnet的stdout和stderr全部丢到/dev/null,屏蔽冗余输出 catch {spawn -noecho telnet $IP >/dev/null 2>&1} set timeout 3 expect { timeout { send_user "Telnet timed out waiting for $IP\n" ; exit } "onnection refused" { send_user "Connection was refused to $IP\n" ; exit } "No route" { send_user "System $IP is unknown\n" ; exit} "login:" } send_user "Success\n" ; exit
这里的>/dev/null 2>&1是关键:>/dev/null把标准输出扔掉,2>&1把错误输出也重定向到和标准输出一样的地方(也就是/dev/null),这样telnet产生的所有冗余信息都不会出现在输出里,只有你用send_user写的内容会被保留。
方案二:用Expect内置的log_user命令
Expect有个内置的log_user参数,默认值是1(显示spawn进程的输出),把它设为0就能直接关闭spawn进程的所有输出,而且不会影响send_user的内容:
#!/usr/bin/expect log_user 0 ;# 关闭Expect对spawn进程输出的默认日志 set IP 192.168.5.100 catch {spawn telnet $IP} set timeout 3 expect { timeout { send_user "Telnet timed out waiting for $IP\n" ; exit } "onnection refused" { send_user "Connection was refused to $IP\n" ; exit } "No route" { send_user "System $IP is unknown\n" ; exit} "login:" } send_user "Success\n" ; exit
这个方法更简洁,不需要处理重定向,直接通过Expect的内置配置就能达到目的。
调用方式
不管用哪种方案,你在Bash脚本里调用这个Expect脚本时,直接把输出追加到日志文件就行:
./telnet_check.exp >> server_status.log
这样日志里就只会有你想要的Success或者各种错误提示,再也没有冗余信息啦!
内容的提问来源于stack exchange,提问作者Lucas Rey




