ncat v7.6 UDP -k 和 -w 未按预期工作

ncat v7.6 UDP -k 和 -w 未按预期工作

在工作中(BSD nc 版本)和许多互联网示例中,ncat 可以监听 udp 并与以下选项一起使用:

  1. -k允许多个连接
  2. -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 数据包时(几乎)立即重新侦听。

相关内容