我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印1,否则为0。
我正在制定一个涉及cat < /dev/tcp/hostname/port
的解决方案,但解决方案使我望而却步。也许涉及期待的事情?我更喜欢bash脚本解决方案。帮助赞赏!
答案 0 :(得分:3)
所有其他解决方案都使用netcat进行网络支持,但是如果你的bash足够新并且使用--enable-net-redirections
进行编译,那么你可以取消它(据我所知,除了Debian和Ubuntu之外;如果我应该调整,请随时发表评论。
然后grep
可以进行实际测试。它的返回代码是一个shell(0表示成功,非零表示失败),所以你需要反转它,但是bash
处理它就好了。
简而言之:
< /dev/tcp/host/port grep -q 'expected value'
echo $(( 1 - $? ))
答案 1 :(得分:2)
答案 2 :(得分:2)
#!/bin/bash
EXPECTED="hello"
SERVER="example.com"
PORT="123"
netcat $SERVER $PORT | grep -F -q "$EXPECTED"
if [ $? ]; then
echo 1
else
echo 0
fi
答案 3 :(得分:1)
有一些例子here。你可以参考它。但是,您应该注意,它还取决于您的端口上运行的服务以及它所说的协议。
如果要连接到Web服务器,则公共端口为80.但是如果您运行自己的应用程序作为服务器运行,请确保您的脚本知道如何相互“交谈”。
您可以查看here的其他资源。它的傻瓜,所以如果你有傻瓜,那么你可能想尝试一下。 (你也可以“移植”到bash)
答案 4 :(得分:1)
我建议你使用popen方法。这样,您可以使用您喜欢的任何命令(即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
你想要一个逐行的方法。
答案 5 :(得分:0)
以下是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