3

我正在尝试编写监控脚本。它应该连接到我服务器上的某个端口,读取输出,如果输出是预期值,则打印 1,否则打印 0。

我正在研究一个涉及 的解决方案cat < /dev/tcp/hostname/port,但该解决方案让我望而却步。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。帮助表示赞赏!

4

6 回答 6

3

所有其他解决方案都使用 netcat 来提供网络支持,但如果您的 bash 足够新并使用--enable-net-redirections它编译(据我所知,除 Debian 和 Ubuntu 之外的其他所有解决方案;如果我应该调整,请随时发表评论) )。

然后grep就可以进行实际测试了。它的返回码是一个 shell(0 表示成功,非零表示失败),所以你需要反转它,但bash处理得很好。

简而言之:

< /dev/tcp/host/port grep -q 'expected value'
echo $(( 1 - $? ))
于 2013-11-14T08:15:45.420 回答
2

你可以使用netcat

echo "GET /"|netcat google.com 80

然后将输出通过管道传输到您的处理脚本

于 2010-01-15T09:56:34.343 回答
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
于 2010-01-15T12:46:53.043 回答
1

这里有一些例子。你可以参考一下。但是,您应该注意,它还取决于您的端口上运行的服务以及它使用的协议。

如果您要连接到 Web 服务器,公共端口是 80。但是如果您将自己的应用程序作为服务器运行,请确保您的脚本知道如何相互“交谈”。

您可以在此处查看另一个资源。虽然它笨拙,所以如果你有笨拙,那么你可能想尝试一下。(你也可以“移植”到 bash)

于 2010-01-15T09:35:27.003 回答
1

我建议您使用流行的方法。这样您就可以使用您喜欢的任何命令(即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你想要一种逐行的方法。

于 2010-01-15T12:58:59.263 回答
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

另请参阅:有关使用 Bash 的内置 /dev/tcp 文件 (TCP/IP) 的更多信息

于 2017-07-20T17:48:47.127 回答