我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印 1,否则打印 0。
我正在研究一个涉及 的解决方案cat < /dev/tcp/hostname/port
,但该解决方案让我望而却步。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。帮助表示赞赏!
我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印 1,否则打印 0。
我正在研究一个涉及 的解决方案cat < /dev/tcp/hostname/port
,但该解决方案让我望而却步。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。帮助表示赞赏!
所有其他解决方案都使用 netcat 来提供网络支持,但如果您的 bash 足够新并使用--enable-net-redirections
它编译(据我所知,除 Debian 和 Ubuntu 之外的其他所有解决方案;如果我应该调整,请随时发表评论) )。
然后grep
就可以进行实际测试了。它的返回码是一个 shell(0 表示成功,非零表示失败),所以你需要反转它,但bash
处理得很好。
简而言之:
< /dev/tcp/host/port grep -q 'expected value'
echo $(( 1 - $? ))
#!/bin/bash
EXPECTED="hello"
SERVER="example.com"
PORT="123"
netcat $SERVER $PORT | grep -F -q "$EXPECTED"
if [ $? ]; then
echo 1
else
echo 0
fi
我建议您使用流行的方法。这样您就可以使用您喜欢的任何命令(即nc
)阅读并迭代地处理输出。如有必要,这一切都可以由 bash 脚本生成。
例如:
#!/usr/bin/env ruby
IO.popen("nc host 4560") do |stdout|
while line = stdout.gets
if line =~ /pattern/
puts "1"
else
puts "0"
end
end
end
显然你需要pattern
用你正在寻找的任何东西来代替。这具有比较每一行而不是命令的整个输出的优点。我不确定在你的情况下哪个更可取。我假设你提到expect
你想要一种逐行的方法。
这是 Bash shell 中涉及 HTTP 请求的脚本:
exec {stream}<>/dev/tcp/example.com/80
printf "GET / HTTP/1.1\nHost: example.com\nConnection: close\n\n" >&${stream}
grep Example <&${stream}
[ $? -eq 0 ] && echo Pattern match || echo Pattern not match