【发布时间】:2011-09-10 06:58:14
【问题描述】:
如何使用没有-e 选项的netcat 版本来模拟netcat -e?
我需要远程触发命令。我可以用 netcat 做到这一点 - 没有-e:
#!/bin/bash
netcat -l 8080 ;我的命令.sh
这样就可以了,但是我想根据命令的成功或失败来回复客户端(要有一种类似 REST 的界面)。
我该怎么做?
谢谢!
【问题讨论】:
-
您可以为此使用命名管道吗?
如何使用没有-e 选项的netcat 版本来模拟netcat -e?
我需要远程触发命令。我可以用 netcat 做到这一点 - 没有-e:
#!/bin/bash
netcat -l 8080 ;我的命令.sh
这样就可以了,但是我想根据命令的成功或失败来回复客户端(要有一种类似 REST 的界面)。
我该怎么做?
谢谢!
【问题讨论】:
最好的方法是切换到支持它的 netcat 版本。在 Debian/Ubuntu IIRC 上,您应该正确使用 netcat traditional,而不是 netcat openbsd:
sudo apt-get install netcat-traditional # netcat-openbsd
您可以选择明确指定您需要的版本:
nc.traditional server 6767 -e myscript.sh
nc.openbsd -l 6767
(注意选项使用的细微差别)。如您所见(如下) nc.traditional 可以作为独立二进制文件运行,仅取决于 libc 和 linux 本身,因此如果您没有安装权限,您应该能够只需删除独立二进制文件 某处(当然是具有exec 权限的文件系统)并像这样运行它
/home/user/bin/mynetcat server 6767 -e myscript.sh
HTH
$ ldd `which nc.{traditional,openbsd}`
/bin/nc.traditional:
linux-gate.so.1 => (0xb7888000)
libc.so.6 => /lib/libc.so.6 (0xb7709000)
/lib/ld-linux.so.2 (0xb7889000)
/bin/nc.openbsd:
linux-gate.so.1 => (0xb77d0000)
libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb76df000)
libc.so.6 => /lib/libc.so.6 (0xb7582000)
libpcre.so.3 => /lib/libpcre.so.3 (0xb754c000)
/lib/ld-linux.so.2 (0xb77d1000)
【讨论】:
mkfifo foo
nc -lk 2600 0<foo | /bin/bash 1>foo
然后只需 nc servername 2600 和 ./script.sh
使用 ctrl+c 杀死客户端
【讨论】: