Я пытаюсь использовать 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\}"