如何使用 netcat 只发送一个 UDP 数据包?

Posted

技术标签:

【中文标题】如何使用 netcat 只发送一个 UDP 数据包?【英文标题】:How to send only one UDP packet with netcat? 【发布时间】:2012-03-30 13:37:46 【问题描述】:

我只想在 UDP 数据包中发送一个短值,但运行命令

echo -n "hello" | nc -4u localhost 8000

我可以看到服务器正在获取 hello 内容,但我必须按 Ctrl+c 退出 netcat 命令。

发送hello后如何让它退出?


对不起,因为噪音,我重新阅读了手册页并找到了-q 选项。

 echo -n "hello" | nc -4u -q1 localhost 8000

有效(1 秒后退出)。

由于某种原因,它不适用于-q0

【问题讨论】:

debian 手册页:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever. 【参考方案1】:

我没有在我的 netcat 上找到 -q1 选项。相反,我使用了-w1 选项。下面是我用来向任何主机和端口发送 udp 数据包的 bash 脚本:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=$2:-$def_host
PORT=$3:-$def_port

echo -n "$1" | nc -4u -w1 $HOST $PORT

【讨论】:

OS X 的工作原理是:"echo -n "test" | nc -4u -w0 localhost 9999" 正如 SimonW 所说【参考方案2】:

如果你使用的是bash,你不妨写

echo -n "hello" >/dev/udp/localhost/8000

并避免 netcat 的所有特质和不兼容性。

这也适用于发送到其他主机,例如:

echo -n "hello" >/dev/udp/remotehost/8000

这些不是文件系统上的“真实”设备,而是 bash “特殊”aliases。 the Bash Manual 中有更多信息。

【讨论】:

好吧,你是对的,让我明确一点,这不适用于 ZSH。 这比使用 netcat 更好。感谢您的提示! 这可能是我见过的最神奇的事情了。 出于某种原因,我需要在 Ubuntu 14.04 上使用 127.0.0.1 而不是 localhost。 (是的,我在/etc/hosts 中有localhost。) /dev/udp/ 不是真实文件。它只是 bash 专门解释的文件名。【参考方案3】:

Netcat 每个换行发送一个数据包。所以你没事。如果你做任何更复杂的事情,那么你可能需要别的东西。

当我意识到这一点时,我正在玩弄 Wireshark。不知道有没有帮助。

【讨论】:

我认为这仅适用于 TCP。使用 UDP,它将在一个数据包中发送多行(如果它们适合)。 没有。只需测试echo -n "hello\nworld" >/dev/udp/localhost/514,您将得到 2 行【参考方案4】:

在当前的 netcat (v0.7.1) 上,您有一个 -c 开关:

-c, --close                close connection on EOF from stdin

因此,

echo "hi" | nc -cu localhost 8000

应该可以解决问题。

【讨论】:

需要注意的是,这仅适用于 GNU netcat,但不适用于 BSD netcat。 为了清楚起见,对于基于 Linux 的 netcat,-c 选项需要一个命令作为参数,它“通过 /bin/bash 执行给定参数” - commandlinux.com/man-page/man1/nc.1.html【参考方案5】:

我遇到了同样的问题,但我使用-w 0 选项只发送一个数据包并退出。 你应该使用这个命令:

echo -n "hello" | nc -4u -w0 localhost 8000

【讨论】:

nc 1.10-41+b1 不接受-w0。错误:无效的等待时间 0

以上是关于如何使用 netcat 只发送一个 UDP 数据包?的主要内容,如果未能解决你的问题,请参考以下文章

如何在QT中不断读取UDP数据包?

通过gopcap将数据包发送到127.0.0.1

如何将UDP数据包发送到scapy中的特定UDP dst端口?

如何使用GCDAsyncUdpSocket连续发送udp数据包

如何通过 NAT 通过公共 IP 发送 UDP 数据包?

如何发送具有确切大小的UDP数据包?