如何通过TCP匹配模式?

时间:2010-01-15 09:26:18

标签: bash tcp monitoring expect

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

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

6 个答案:

答案 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)

您可以使用netcat

echo "GET /"|netcat google.com 80

然后将输出传递给处理脚本

答案 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

另见:More on Using Bash's Built-in /dev/tcp File (TCP/IP)