Можно ли «передать» экземпляр консольного приложения через netcat, чтобы netcat прослушивал новое соединение и перенаправлял stdin
и stdout
по сетевому соединению.
1 ответ
Что ж, как описано в документации по Википедии и 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
цикл.