【问题标题】:How can I match a pattern over TCP?如何通过 TCP 匹配模式?
【发布时间】:2010-01-15 09:26:17
【问题描述】:

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

我正在研究一个涉及cat < /dev/tcp/hostname/port 的解决方案,但我没有找到解决方案。也许涉及期望的事情?我更喜欢 bash 脚本解决方案。感谢您的帮助!

【问题讨论】:

    标签: bash tcp monitoring expect


    【解决方案1】:

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

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

    简而言之:

    < /dev/tcp/host/port grep -q 'expected value'
    echo $(( 1 - $? ))
    

    【讨论】:

      【解决方案2】:

      你可以使用netcat:

      echo "GET /"|netcat google.com 80
      

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

      【讨论】:

        【解决方案3】:
        #!/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...
        • 根据你的优雅,就是这样。我更喜欢这个顺序。
        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          我建议您使用 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,您想要一种逐行的方法。

          【讨论】:

            【解决方案6】:

            这是 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)

            【讨论】:

              猜你喜欢
              • 2018-09-25
              • 2019-04-25
              • 1970-01-01
              • 2022-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-16
              相关资源
              最近更新 更多