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


120

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

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

我可以看到服务器正在 问候消息,但是我必须按Ctrl+ c退出netcat命令。

发送后如何退出 问候


抱歉,由于噪音,我重新阅读了手册页并找到了 -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.
luckydonald

Answers:


204

如果您正在使用bash,则最好写

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

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

这也可以发送给其他主机,例如:

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

这些不是文件系统上的“真实”设备,而是bash“特殊” 别名Bash手册中还有其他信息。


24
好的,您是对的,让我明确指出这不适用于ZSH。
jturolla

1
这比用netcat进行处理更好。谢谢你的提示!
johnboiles,2015年

3
这可能是我见过的最神奇的事情。
freb 2015年

4
出于某种原因,我需要使用127.0.0.1,而不是对localhost在Ubuntu 14.04。(是的,我确实有localhost/etc/hosts
tuomassalo

3
/dev/udp/不是真实文件。它只是bash专门解释的文件名。
Peter Eisentraut '16

46

-q1在netcat上找不到该选项。相反,我使用了该-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的工作原理是:如SimonW所说:“ echo -n“ test” | nc -4u -w0 localhost 9999“
Simon Unsworth

14

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

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

因此,

echo "hi" | nc -cu localhost 8000

应该可以。


3
需要注意的重要一点是,这仅适用于GNU netcat,而不适用于BSD netcat。
MarSoft'3

为了清楚起见,对于基于Linux的netcat,-c选项需要使用命令作为参数,该命令“通过/ bin / bash执行给定参数” -commandlinux.com/man-page/man1/nc.1.html
Blake Neal

5

Netcat每换行发送一个数据包。很好。如果您做的事情更复杂,那么您可能还需要其他东西。

当我意识到这一点时,我正和Wireshark混在一起。不知道是否有帮助。


3
我认为这仅适用于TCP。使用UDP,它将在一个数据包中发送多行(如果合适的话)。
sleske 2014年

1
不,只需测试echo -n "hello\nworld" >/dev/udp/localhost/514,您将获得2条线
bebbo

5

我有同样的问题,但是我使用-w 0选项仅发送一个数据包然后退出。您应该使用以下命令:

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

nc 1.10-41 + b1不接受-w0。错误:无效的等待时间0
palik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.