Различное поведение grep с pipe из nc на alpine vs ubuntu - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу проверить, доступен ли сервер Minecraft.Это используется для проверки работоспособности докера.В 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

Поскольку вы, возможно, хотите знать, что вы тестируете,запрос содержит:

  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"
  • На Alpine 3.9 в докере, ошибка grep (без вывода, возврат 1)

Вопрос: Почему процесс grep не выводит этот процесс на alpine и ubuntu одинаково?Даже если я сохраню значение в переменной и выведу его на grep, он не сможет обработать эту строку.Даже если я просто grep для «игроков».

См. Ответ для объяснения

Решения:

  • grep -F ..., только точное совпадение

    echo "$ bin" |grep -Fq 'Players' && echo ok

  • или преобразовать двоичный вывод nc в текст

    echo "$ bin" |od -c -A n |tr -d '\ n' |grep -q 'Players' && echo ok

1 Ответ

0 голосов
/ 07 февраля 2019

Я пытался воссоздать результаты в докере Alpine 3.9 с различными вариантами shell / grep, выходя и запуская новый контейнер для каждого теста, затем дважды проверял.

Вот что у меня есть:

  • Alpine 3.9, пепел, grey BusyBox: не в порядке.
  • Alpine 3.9, bash, grep BusyBox: не в порядке.
  • Alpine 3.9, ash, GNU grep: OK.
  • Alpine 3.9, bash, GNU grep: OK.
  • Alpine 3.9, ash, BusyBox grep -F: OK.

Таким образом, похоже, что grep действительно является основной причиной различия, и способ, которым он обрабатывает двоичный вывод из nc.

С Alpine 3.9 и GNU grep, если мы опускаем-q и echo, мы получим следующий вывод:

Двоичный файл (стандартный ввод) соответствует

Это может означать, что GNU и BusyBox grep могут обрабатыватьбинарные файлы по-разному.

Просматривая через grep BusyBox, 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 mode", grey BusyBox будет сопоставлять "players": буквально с потоком двоичных символов, так что это работает.

...