Netcat:使用nc -l port_number而不是nc -l -p port_number

时间:2013-03-10 04:02:05

标签: sockets unix debian netcat

这个问题遵循以下问题:Sockets working in openSUSE do not work in Debian?

在我的Debian系统上使用套接字时,我必须使用nc -l -p port_number来模拟我想要与之交谈的服务器。如果我使用的是nc -l port_number,则在使用套接字连接函数时会失败,而strerror(错误号码)会说“连接被拒绝”。

没有-p选项的Netcat在其他Linux发行版上运行良好,我应该如何更改配置?

2 个答案:

答案 0 :(得分:6)

不要调整你的套装。 netcat有多种实现方式;并非所有人都表现得一样。

特别是"传统"如果省略-p(" port")标志,netcat的版本(可能就是你在Debian系统上安装的那个版本)最终会做一些完全出乎意料的事情:它最终会对待它最后一个参数作为主机名,将其传递给inet_aton(),将其转换为无意义的IP地址(例如,1234将变为0.0.4.210),然后将继续忽略该IP使用自动分配的(可能是随机的)端口号在套接字上寻址和侦听。

这种行为显然很愚蠢,因此netcat的其他一些实现会假设你的意思是-p。但是,您使用的那个并不是,所以通过-p选项。

答案 1 :(得分:4)

我同意duskwuff最好在任何地方使用-p选项,但要回答你的问题:

您需要做的一件事是安装支持所需语法的netcat。我知道netcat-openbsd包支持它。我知道netcat-traditional包没有。还有一个netcat6包,但也没有。然后,您可以像这样显式请求OpenBSD版本的netcat:

nc.openbsd -l 4242

您可以选择使用替代系统将此版本的netcat设置为在发出nc命令时运行:

update-alternatives --set nc /bin/nc.openbsd

如果这是你安装的唯一的netcat,这将自动完成。

最后,您可以再次选择删除您不喜欢的netcat(netcat-traditionalnetcat6)。