在alpine和ubuntu上使用nc管道的grep的不同行为

在alpine和ubuntu上使用nc管道的grep的不同行为,grep,pipe,minecraft,alpine,Grep,Pipe,Minecraft,Alpine,我想检查是否可以访问Minecraft服务器。这被用作docker的健康检查。在Ubuntu上一切正常,在alpine linux上则不然 这将从公共服务器请求json中的状态字符串: echo -e "\x16\x00\x04\x10\x6d\x63\x2e\x65\x6c\x64\x65\x72\x63\x72\x61\x66\x74\x2e\x64\x65\x63\xdd\x01\x01\x00" | nc mc.eldercraft.de 25565 因为您可能想知道您正在测试什么,所

我想检查是否可以访问Minecraft服务器。这被用作docker的健康检查。在Ubuntu上一切正常,在alpine linux上则不然

这将从公共服务器请求json中的状态字符串:

echo -e "\x16\x00\x04\x10\x6d\x63\x2e\x65\x6c\x64\x65\x72\x63\x72\x61\x66\x74\x2e\x64\x65\x63\xdd\x01\x01\x00" | nc mc.eldercraft.de 25565
因为您可能想知道您正在测试什么,所以请求包含:

  • 在此之后是22个内容字节
  • 协议版本字节00,04
  • 在此之后是16个主机名字节
  • 2端口字节
  • 握手结束字节
  • 在此之后是1个内容字节
  • 给我状态字节
  • 如果成功,返回包含玩家数量,所以我想检查它是否在

    echo -e "\x16\x00\x04\x10\x6d\x63\x2e\x65\x6c\x64\x65\x72\x63\x72\x61\x66\x74\x2e\x64\x65\x63\xdd\x01\x01\x00" | nc mc.eldercraft.de 25565 | grep -q '"players":' && echo "ok"
    
    • 在Ubuntu 16.04 lts上,“ok”
    • 在docker中的Alpine 3.9上,grep错误(无输出,返回1)
    问题: 为什么不在alpine和ubuntu上处理grep这个输出呢?即使我将该值存储在变量中并将其回显给grep,它也无法处理该字符串。即使我只是为“球员”而欢呼

    有关解释,请参见答案

    解决方案:

    • grep-F…,仅精确匹配

      echo“$bin”| grep-Fq“玩家”和echo ok

    • 或将nc二进制输出转换为文本

      echo“$bin”| od-c-A n | tr-d'\n'| grep-q'players'&echo ok


    我尝试在一台具有不同shell/grep变体的Alpine 3.9 Docker上重新创建结果,每次测试退出并启动一个新容器,然后再次检查

    以下是我得到的:

    • 阿尔卑斯山3.9,灰烬,忙碌的人格雷普:不好
    • 阿尔卑斯山3.9,bash,BusyBox grep:不好
    • 阿尔卑斯山3.9,灰烬,GNU格雷普:好的
    • 阿尔卑斯山3.9,巴什,GNU格雷普:好的
    • 阿尔卑斯山3.9,灰烬,巴士箱
      grep-F
      :正常
    因此,grep似乎确实是差异的根本原因,以及它处理nc的二进制输出的方式

    对于Alpine 3.9和GNU grep,如果省略
    -q
    和echo,我们将得到以下输出:

    二进制文件(标准输入)匹配

    这可能意味着GNU和BusyBox grep可能以不同的方式处理二进制文件

    浏览BusyBox的grep,我们可以在grep的选项列表下找到以下评论:

    /* ignored: -a "assume all files to be text" */
    /* ignored: -I "assume binary files have no matches" */
    
    所以仔细估计,BusyBox grep总是会为二进制数据(使用默认选项)提供零结果——这很好地解释了这种行为


    使用
    -F
    -“fgrep模式”,BusyBox grep将
    “players”:
    逐字匹配到二进制字符流,因此这是可行的

    您是否尝试过在Alpine上安装
    grep
    软件包,这是GNU grep?完成,不匹配。在Alpine上尝试使用
    bash
    ,而不是默认的
    ash
    ?也许shell有一些微妙的影响。alpine+/bin/bash,在那里它的工作grep-Fq'players'正在alpine sh上工作,可能是nc的输出类似于二进制,而sh处理的不是bash吗?谢谢!看起来我做错了什么,因为ubuntu bash+busybox grep对我有效,而ash+gnu grep对我无效。无论如何,添加了一个使用busybox将二进制文件转换为文本的解决方案。