在工作中(BSD nc 版本)和许多互联网示例中,ncat 可以监听 udp 并与以下选项一起使用:
-k
允许多个连接-w 0
当客户端断开连接时终止当前连接
我家里有以下东西
命令:Ncat:版本 7.60(https://nmap.org/ncat)
操作系统:Fedora 27
我无法使用-k
或-w 0
。
ncat -klu localhost 8000
Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.
nc -luw 0 localhost 8000
Ncat: Invalid -w timeout (must be greater than 0). QUITTING.
如何在我的 ncat 版本中保持活动状态并立即超时? (手册页没有帮助)
谢谢
答案1
首先,nc、ncat 和 netcat 在技术上都是不同的工具,彼此名称相同,但因此不一定提供完全相同的(可互操作的)功能/选项。
其次,尚不清楚工作中使用的是哪个版本,但在当前版本的 ncat 中,选项 k 不适用于 udp。它仅适用于 TCP。但是ncat即使在udp上也会继续监听,即使源断开连接,因为udp是无状态的(没有连接过程)。但它不会再收到任何数据包,除非源重新“连接”/从第一次使用的同一源端口重新发送(因为最新版本的 ncat 锁定到它们在 udp 上看到的第一个源端口,然后忽略所有不幸的是,除非您修改源代码,否则此行为是不可配置的。因此,唯一的“解决方法”是寻找另一个工具,或者用 python 编写自己的工具。这是我自己使用和编码的替代方案:
#! /usr/bin/python
from socket import socket,AF_INET,SOCK_DGRAM,SO_REUSEADDR,SOL_SOCKET
from time import sleep,ctime
import sys
if len(sys.argv)>2:
localIP = sys.argv[1]
localPort = int(sys.argv[2])
else:
print("Space-separated IP and Port are required")
exit()
print(f"listening on {localIP}:{localPort}")
bufSize = 1500
sock = socket(family=AF_INET, type=SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET,SO_REUSEADDR, 1)
sock.bind((localIP, localPort))
while True:
message, ipport = sock.recvfrom(bufSize)
print(ctime(), f"[{ipport[0]}:{ipport[1]}]",str(message)[2:-1])
它不是最简单的,但它还打印每个数据包的时间戳、IP 和端口。将其放在扩展名为“.py”的文件中,然后直接键入它作为命令来执行它(假设您已经正确设置了 python),并将其传递给要绑定的 IP 和端口(空格分隔)。 IP 可以是“0.0.0.0”或“127.0.0.1”,甚至“localhost”,以绑定到任何 localhost 接口(不包括引号)。如果您不需要时间戳或远程 ip/端口,请在打印函数的最后一行省略其相应的参数。例如,要仅获取消息,请将最后一行替换为:
print(str(message)[2:-1])
答案2
错误消息让您很好地了解需要做什么
ncat -klu localhost 8000
Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.
您必须提供一个收听程序才能ncat
使用。要让输入仅回显给发送者,您可以这样做:
ncat -e /bin/cat -klu localhost 8000
nc -luw 0 localhost 8000
Ncat: Invalid -w timeout (must be greater than 0). QUITTING.
nc
不支持零等待时间,所以只需使用其他东西
nc -luw 1 localhost 8000
不幸的是,nc 不支持亚秒级等待时间,但您可以使用功能更丰富的ncat
代替:
ncat -lu -w 100ms localhost 8000
答案3
现有的答案确实提供了有关如何解决此问题的宝贵信息。为了使用 ncat 将所有内容综合成一个好的解决方法,这里有一个 bash 单行代码来完成一个(几乎)立即可重用的 UDP 侦听器:
while [ /bin/true ]; do ncat -i 1ms -u -l 127.0.0.1 8000 2>/dev/null; done
仅使用这些参数单独运行 ncat 将接受单个 UDP 数据包,然后在收到数据包后 1 毫秒退出,并在 stderr 上报告它正在退出。将 stderr 重定向到 /dev/null 会抑制超时消息。将整个事情包装在无限 while 循环中将允许它在收到 UDP 数据包时(几乎)立即重新侦听。