我有一个嵌入式Linux应用程序,带有简单的交互式命令行界面。
我想从telnet(或网络,一般(访问命令行。
但是,该过程应在开发板打开时启动,并且是在唯一的实例中。因此,以下netcat
命令不是一个选项:
nc -l -p 4000 -e myapp
我能做到
nc -l -p 4000 | myapp
将远程命令发送到 MyApp,但这样我看不到myapp
输出。
有没有办法将标准输入和标准输出重定向到netcat
?
谢谢。
有没有办法将标准输入和标准输出重定向到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)
我发现通过使用 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