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

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

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

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

nc -l -p 4000 -e myapp

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

nc -l -p 4000 | myapp

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

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

Спасибо.


person Daniele Pallastrelli    schedule 30.03.2016    source источник


Ответы (3)


Есть ли способ перенаправить как 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)
person Maxim Egorushkin    schedule 30.03.2016
comment
С помощью предложенной вами команды мое приложение запускается только при подключении клиента (например, nc -e). Я хочу иметь возможность запускать свой процесс без какого-либо подключения. - person Daniele Pallastrelli; 30.03.2016
comment
@DanielePallastrelli Тогда ваше приложение должно быть TCP-сервером. Вы не можете перенаправить (по крайней мере, легко) дескрипторы открытых файлов запущенного процесса. - person Maxim Egorushkin; 30.03.2016
comment
Ну... когда я запускаю свое приложение, я могу сразу же перенаправить stdin/out на socat, который, в свою очередь, действует как сервер. Соединение может появиться позже. - person Daniele Pallastrelli; 30.03.2016
comment
Нет необходимости перенаправлять дескрипторы открытых файлов запущенного процесса: дескрипторы файлов могут быть перенаправлены (например, на socat) с самого начала. Тогда соединения могут появиться позже. - person Daniele Pallastrelli; 30.03.2016
comment
гораздо лучшее решение, чем другие. Работал на меня. 10x:] - person IdanB; 08.02.2020

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

#!/bin/bash

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

ИЗМЕНИТЬ

В конце концов я включил сервер telnet в свою библиотеку cli. Вы можете найти результат на GitHub: https://github.com/daniele77/cli

person Daniele Pallastrelli    schedule 31.03.2016
comment
Хорошая идея. Часть <&"${COPROC[0]}" >&"${COPROC[1]}" выглядит ненужной, поскольку bash сделает это за вас. Должно быть просто 2>&1, чтобы перенаправить stderr в stdout. - person Maxim Egorushkin; 31.03.2016

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

ncat -lnvp 443 -e myapp

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

person AK_    schedule 03.05.2018
comment
Подробная опция --verbose или -v — это то, что фиксирует stderr в приведенной выше команде (-lnvp). nmap.org/ncat/guide/ncat-output.html - person Florian Bidabé; 22.02.2021