将进程标准和标准输出重定向到 netcat



我有一个嵌入式Linux应用程序,带有简单的交互式命令行界面。

我想从telnet(或网络,一般(访问命令行。

但是,该过程应在开发板打开时启动,并且是在唯一的实例中。因此,以下netcat命令不是一个选项:

nc -l -p 4000 -e myapp

我能做到

nc -l -p 4000 | myapp

将远程命令发送到 MyApp,但这样我看不到myapp输出。

有没有办法将标准输入和标准输出重定向netcat

谢谢。

有没有办法将标准输入和标准输出重定向到netcat

socat,是更高级的netcat。您可以使用它重定向stdinstdout。例如:

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)

我发现通过使用 bash v.>= 4.0,我可以使用coproc

#!/bin/bash
coproc myapp
nc -kl -p 4000 <&"${COPROC[0]}" >&"${COPROC[1]}"

编辑

我最终在我的 cli 库中合并了一个 telnet 服务器。您可以在 GitHub 上找到结果:https://github.com/daniele77/cli

您可以使用ncat(来自nmap包:apt install nmap(以及执行以下操作:

ncat -lnvp 443 -e myapp

不要忘记在应用中的每次printf("%s",str);fflush(stdout);

刚刚发现这个技巧阅读man nc .可以使用命名管道将 stdin 和 stdout 重定向到同一个应用程序。

例:

# 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

最新更新