grep的的高山VS Ubuntu的不同的行为与管从NC

问题描述 投票:1回答:1

我要检查,如果我的世界服务器可达。这是作为搬运工健康检查。在Ubuntu上所有的罚款,对高山的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

因为你也许想知道你正在测试的内容,请求中包含的:

  1. 在此之后22字节的内容
  2. 协议版本字节00,04
  3. 后这个16个字节的主机名
  4. 2个端口字节
  5. 握手字节的结束
  6. 此后1个字节的内容
  7. 给我的状态字节

如果成功返回包含的玩家数量,所以我要检查,如果其英寸

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”
  • 高山3.9泊坞窗,grep的错误(没有输出,返回1)

问:为什么不处理的grep高山和Ubuntu一样,则这个输出?即使我存储在一个变量的值,并呼应这给grep它无法处理此字符串。即使我只是用grep的“玩家”。

见解释答案

解决方案:

  • grep的-F ...,只有精确匹配 回声 “$ BIN” | grep的-fq“玩家” &&回声确定
  • 或转换NC二进制输出文本 回声 “$ BIN” | OD -c -A N | TR -d '\ n' | grep的-q“玩家” &&回声确定
grep pipe minecraft alpine
1个回答
1
投票

我试图与不同壳/ grep的变化,以重新创建在Alpine 3.9泊坞的结果,在退出和启动每个测试一个新的容器,然后双重检查。

下面是我得到了什么:

  • 高山3.9,灰分,BusyBox的grep的:没有确定。
  • 高山3.9,庆典,BusyBox的grep的:没有确定。
  • 高山3.9,灰分,GNU的grep:OK。
  • 高山3.9时,bash,GNU的grep:OK。
  • 高山3.9,灰分,BusyBox的grep -F:OK。

如此看来,grep的确实是差的根本原因,以及它的方式处理来自NC二进制输出。

随着高山3.9和GNU grep的,如果我们忽略-q和回声,我们会得到以下的输出:

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

这可能表明,GNU和BusyBox的grep的可能有不同的处理二进制文件。

通过了BusyBox的grep的,https://github.com/mirror/busybox/blob/master/findutils/grep.c浏览,我们可以发现以下意见,下的grep的选项列表:

/* ignored: -a "assume all files to be text" */
/* ignored: -I "assume binary files have no matches" */

所以仔细估算,BusyBox的grep的总会给零个结果的二进制数据(默认选项) - 这也说明了其行为。

随着-F - “fgrep一样模式”,BusyBox的grep的将逐字匹配"players":二进制字符流,所以此工程。

© www.soinside.com 2019 - 2024. All rights reserved.