Назад | Перейти на главную страницу

Grep regex Stdout для telnet

Я пытаюсь использовать grep, чтобы получить результат регулярного выражения и передать результаты на лету в telnet, запускающий открытый порт, на сервер узла.

Grep получает непрерывные, но с разным интервалом команды от запущенной программы, grep выдает номер, а затем передает его по telnet. Вот моя попытка примера:

echo "TEST 1234\r\n" | grep -e "[0-9]{4}" | telnet 127.0.0.1 1234

Я не могу изменить строковый формат эхо-спуфинга. Эхо без grep успешно отправляет строку в telnet. Похоже, что grep не отправляет на stdOut.

Я ожидаю, что telnet получит данные из канала, например:

1234
7645
8376

Любая помощь в том, как этого добиться?

Я не уверен, как вы пришли к выводу, что grep не выводит свой вывод на стандартный вывод, это просто неверно.

Я бы посоветовал вам протестировать это, добавляя по одному шагу конвейера за раз, чтобы увидеть, где возникают проблемы.
Сначала вы обнаружите, что ваша команда echo буквально печатает \r\n в конце (вы можете захотеть echo -e) и что ваша команда grep ничего не печатает (потому что ваш шаблон на самом деле не совпадает).

Однако, если вы исправите узор (либо grep -e "[0-9]\{4\}" или grep -E "[0-9]{4}") вы заметите, что он печатает всю строку для всех совпадающих строк, а не только для соответствующей части (вы можете захотеть grep -o).

Что-то вроде этого кажется более разумным началом вашего конвейера:

 echo -e "TEST 1234\r\n" | grep -o -e "[0-9]\{4\}" 

Вы сможете продолжить с этого момента (однако я бы предложил рассмотреть возможность использования nc вместо того telnet).

Тебе не нужно telnet для этого в оболочке Bash есть встроенная функция, например:

exec {stream}<>/dev/tcp/127.0.0.1/1234
printf "TEST 1234\r\n" >&${stream}
grep -o "[0-9]\{4\}" <&${stream}

Вам нужно изменить grep на:

grep -e "[0-9]\{4\}"