10

Можно ли «передать» экземпляр консольного приложения через netcat, чтобы netcat прослушивал новое соединение и перенаправлял stdin и stdout по сетевому соединению.

1 ответ1

16

Что ж, как описано в документации по Википедии и netcat , есть опция -e которая заставляет ее порождать (e xecute) программу при получении соединения, присоединяя сокет к stdin, stdout и stderr процесса.  Пример использования:

nc -l -p номер_порта -e имя_программы

Примеры обычно показывают, что /bin/sh или bash используются в качестве имени_программы.  Использование этой опции не рекомендуется, так как она в основном открывает портал анонимного доступа без пароля на вашем компьютере.  Конечно, это смягчается использованием программы с меньшей мощностью, чем у оболочки (той, которая не имеет возможности сбежать в оболочку), сводя к минимуму использование этой программы и сохраняя ее в секрете.  Тем не менее, первоначальные разработчики netcat чувствовали себя достаточно твердо, что эта опция была плохой идеей, что они отключили ее по умолчанию и включили ее в опцию компиляции «GAPING_SECURITY_HOLE».  Это кратко упоминается в этом учебном руководстве по NetCat и другой документации по netcat .

Поиск в Google привел меня к обсуждению этой проблемы на других сайтах Stack Exchange: переполнение стека и сбой сервера.  Несколько участников предложили следующую технику, чтобы сделать то же самое без использования опции -e (то есть в версии netcat , у которой отключена опция -e ):

На сервере:
mkfifo pipe_name
nc -l -p port_number <   |  > pipe_name

На клиенте:
nc  имя_сервера   номер порта

Пара заметок:

  • В некоторых версиях netcat -l подразумевает -p , поэтому вы должны просто -l а затем номер порта.
  • Возможно, вы захотите обернуть ваше решение в while true цикл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .