【发布时间】:2010-01-15 09:26:17
【问题描述】:
我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印 1,否则打印 0。
我正在研究一个涉及cat < /dev/tcp/hostname/port 的解决方案,但我没有找到解决方案。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。感谢您的帮助!
【问题讨论】:
标签: bash tcp monitoring expect
我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印 1,否则打印 0。
我正在研究一个涉及cat < /dev/tcp/hostname/port 的解决方案,但我没有找到解决方案。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。感谢您的帮助!
【问题讨论】:
标签: bash tcp monitoring expect
所有其他解决方案都使用 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
【讨论】:
grep -c 检查匹配是一种反模式。只要grep -q 会告诉你是否匹配。另请参阅useless use of wc。
test $?——优雅而惯用的表达方式是if netcat "$SERVER" "$PORT" | grep -F -q "$EXPECTED"; then...
我建议您使用 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,您想要一种逐行的方法。
【讨论】:
这是 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
【讨论】: