Перенаправить stdin и stdout процесса в netcat

У меня есть встроенное приложение Linux с простым интерактивным интерфейсом командной строки.

Я хотел бы получить доступ к командной строке из Telnet (или сети, в целом).

Однако процесс должен быть запущен при включении платы и в уникальном случае. Итак, следующее netcat команда не является опцией:

nc -l -p 4000 -e myapp

я могу сделать

nc -l -p 4000 | myapp

отправлять удаленные команды в myapp, но так я не вижу myapp выход.

Есть ли способ перенаправить как stdin, так и stdout на netcat?

Благодарю.

4 ответа

Решение

Я обнаружил, что с помощью bash v. >= 4.0 я могу использовать coproc:

#!/bin/bash

coproc myapp
nc -kl -p 4000 <&"${COPROC[0]}" >&"${COPROC[1]}"

Есть ли способ перенаправить как stdin, так и stdout в netcat?

Есть socat, который является более продвинутым netcat, Вы можете перенаправить оба stdin а также stdout с этим. Например:

socat TCP4-LISTEN:5556,reuseaddr,fork EXEC:"cat - /etc/redhat-release"

В выше cat читает stdin а также /etc/redhat-release и выводит их в stdout,

А затем попробуйте использовать это:

$ echo "hello" | nc 127.0.0.1 5556
hello
Fedora release 22 (Twenty Two)

$ echo "hello 2" | nc 127.0.0.1 5556
hello 2
Fedora release 22 (Twenty Two)

Вы можете использовать ncat (из пакета nmap: apt install nmap) для этого, а также следовать:

ncat -lnvp 443 -e myapp

не забудь fflush(stdout); после каждого printf("%s",str); в вашем приложении

Только что нашел этот трюк, читающийman nc. Можно перенаправить как стандартный ввод, так и стандартный вывод в одно и то же приложение, используя именованные каналы .

Пример:

      # create named pipe
rm -f /tmp/f; mkfifo /tmp/f

# launch interactive 'sh' session redirected to/from listening nc
cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

С другого терминала:

      nc localhost 1234 # connect to the listening nc
$
$
$ ls -lah
total 16K
drwxrwxr-x  43 ky   ky    12K Jun 17 01:31 .
drwxr-xr-x 123 ky   ky    12K Jun 17 01:35 ..

О боже, это действительно работает. И если вы не против хранить все отправленные данные в файле, то этот подход также может использовать файл вместо именованного канала. Так:

      # create an empty file
echo -n '' > /tmp/session

# launch interactive 'sh' session redirected to/from listening nc
tail -f /tmp/session | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/session
Другие вопросы по тегам