Bash中的简单套接字服务器?

95

有没有一种方法可以快速绑定到TCP端口/IP地址并将所有信息简单地打印到STDOUT? 我有一个简单的调试解决方案,它将东西写入127.0.0.1:4444,我希望能够从bash绑定一个端口并打印出所有传输的内容。 有没有一种简单的方法可以做到这一点?


相关的内容:http://unix.stackexchange.com/questions/49936/dev-tcp-listen-instead-of-nc-listen - Ciro Santilli OurBigBook.com
4个回答

133
$ nc -k -l 4444 > filename.out

参见nc(1)


4
有没有不需要通过循环运行的方法,例如绑定端口直到进程被杀死?我一直在反复连接和断开套接字,如果不像这样运行 while true; do nc -l 4444; donenc 就会死掉。 - Naftuli Kay
在某些发行版中,您需要将其更改为“nc -k -l -p 4444”。 - Rostislav Matl
2
如果使用ncat而不是nc,您可以在使用完全相同的语法的同时拥有多个并发连接。 - Sietse van der Molen
2
使用ncat代替nc(它与nmap捆绑在一起,是nc的现代化版本)。 - Freedom_Ben

62

虽然你是在问如何在bash中实现,但是netcat的回答也是非常有效的:

  $ exec 3<>/dev/tcp/127.0.0.1/4444
  $ cat <&3

13
但是这对于听力并不起作用。我认为仅使用bash无法进行听取。 - Vijayender
8
这个解决方案确实需要一个监听服务器。如http://unix.stackexchange.com/a/49947/13746所述,Bash不能通过“/dev/tcp”实现这一点。 - xebeche
2
在听吗?这就是 xinetd 的用处!:D - anon
@Evi1M4chine 哇,这是一个来自过去的震撼... - RonJohn

18

那正如您所期望的那样运作:

 nc -k -l 4444 |bash

然后你

echo "ls" >/dev/tcp/127.0.0.1/4444

然后您将看到由bash执行的列表。

[简短的安全警告]
当然,如果您在计算机上让这样的东西运行,您就会为各种攻击打开大门,因为命令可以从您网络中任何主机上的任何用户帐户发送。这完全没有提供安全性(身份验证,识别),并且将所有传输的命令未经加密地发送到网络上,因此很容易被滥用。


2
如果您没有/dev/tcp,您可以运行:echo "ls" | nc 127.0.0.1 4444 - fzbd
1
@fzbd:没有/dev/tcp。这是一个特殊的bash文件,所以“ls”不会显示它。 - Marcin Fabrykowski
@MarcinFabrykowski 正确,但如果您在其他shell上运行这些命令,则没有可用的处理程序。如果您的bash未编译使用--enable-net-redirections也可能失败。 - fzbd

9

使用 @Freedom_Ben 提到的 ncat 添加答案:

ncat -k -l 127.0.0.1 4444

下面是man ncat中选项的解释:

-k, --keep-open            Accept multiple connections in listen mode
-l, --listen               Bind and listen for incoming connections

ncatnmap 一起提供并支持并发连接,而传统的 nc 命令则不支持。 - Serge Stroobandt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接