Перенаправить 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