You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让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

火山引擎 最新活动