如何使用 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 数据包?的主要内容,如果未能解决你的问题,请参考以下文章
如何将UDP数据包发送到scapy中的特定UDP dst端口?