在alpine和ubuntu上使用nc管道的grep的不同行为
我想检查是否可以访问Minecraft服务器。这被用作docker的健康检查。在Ubuntu上一切正常,在alpine linux上则不然 这将从公共服务器请求json中的状态字符串:在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 因为您可能想知道您正在测试什么,所
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
因为您可能想知道您正在测试什么,所以请求包含:
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)
- grep-F…,仅精确匹配 echo“$bin”| grep-Fq“玩家”和echo ok
- 或将nc二进制输出转换为文本 echo“$bin”| od-c-A n | tr-d'\n'| grep-q'players'&echo ok
- 阿尔卑斯山3.9,灰烬,忙碌的人格雷普:不好
- 阿尔卑斯山3.9,bash,BusyBox grep:不好
- 阿尔卑斯山3.9,灰烬,GNU格雷普:好的
- 阿尔卑斯山3.9,巴什,GNU格雷普:好的
- 阿尔卑斯山3.9,灰烬,巴士箱
:正常grep-F
-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将二进制文件转换为文本的解决方案。