在bash中侦听返回的UDP数据包

在bash中侦听返回的UDP数据包,bash,sockets,Bash,Sockets,出于学习目的,我使用了bash(4.0.33)网络支持,并尝试在bash中创建端口扫描程序。对于TCP,我使用打开了一个TCP/IP套接字 exec 3/dev/tcp/192.0.2.1/80 如果连接被拒绝或连接系统调用超时,则会采取适当的操作。但是,使用UDP,我可以轻松地使用 echo>/dev/udp/192.0.2.1/53 但是如何从正确的套接字读取返回的数据包呢?我的意思是,发送到192.0.2.1的UDP数据报具有来自临时端口范围的源端口,因此我不知道应该读取/dev/UDP/

出于学习目的,我使用了bash(4.0.33)网络支持,并尝试在bash中创建端口扫描程序。对于TCP,我使用打开了一个TCP/IP套接字

exec 3/dev/tcp/192.0.2.1/80

如果连接被拒绝或连接系统调用超时,则会采取适当的操作。但是,使用UDP,我可以轻松地使用

echo>/dev/udp/192.0.2.1/53


但是如何从正确的套接字读取返回的数据包呢?我的意思是,发送到192.0.2.1的UDP数据报具有来自临时端口范围的源端口,因此我不知道应该读取
/dev/UDP/192.0.2.1/
目录中的哪个套接字。或者,如果没有像tcpdump这样的外部实用程序,这不是可行的吗?

Bash的UDP支持不是很好,并且在许多发行版(尤其是Debian/Ubuntu和派生版本)上编译。推荐的工具是netcat:

nc -u 192.0.2.1 53
注意:使用coproc或命名管道从同一netcat进程进行读写。不要先发送数据包,然后尝试捕获netcat的回复

不过,Bash确实是一种错误的语言。考虑使用Python,它处理UDP和二进制数据的方式更好,只需要几行代码。

“BASH绝对不是这个”BR>的正确选择。 “尽管如此,Bash确实是一种错误的语言”
不确定为什么会断言(取决于disto)。这在pi-Z-W上对我有效:

#!/bin/bash
while true; do 
  nc -lu 16523 | (read line; 
  echo $line
  cmd=${line:0:9}
  echo $cmd
  if [ "$cmd" == "Send Date" ] ; then
    dt="!!D$(date +%y%m%d)"
    echo $dt > /dev/udp/192.168.2.165/16523
  elif [ "$cmd" == "Send Time" ] ; then
    tm="!!T$(date +%H%M%S)"
    echo $tm
    echo $tm > /dev/udp/192.168.2.165/16523
  else
    sleep 1s
    echo $line >> /home/pi/udp16523.log
  fi)
done
然后,另一个进程可以(比如每小时)发送时间
echo“!!T$(日期+%H%M%S)”>/dev/udp/192.168.2.165/16523


我确实必须用/etc/rc.local中的“set H+”关闭历史扩展,以处理的意外(由我)扩展!在引号内。

没有冒犯的意思,但即使你说这是为了学习,如果你永远不会使用它,学习又有什么意义呢?bash绝对不是这方面的正确选择…@KarolyHorvath事实上,bash是小型物联网设备的优秀工具,bash在许多应用程序中都能很好地处理UDP。顺便说一句,这不是问题:他不是在征求意见。你能解释一下命名管道在这种情况下的用法吗?您的意思是将UDP数据包写入命名管道,然后将命名管道用作
nc
的stdin吗?如果是,那么为什么这种方法比直接将UDP数据包重定向到
nc
?您可以使用coproc或命名管道与进程进行双向通信。如果您只想发送一个数据包并接收一个回复,则不需要它。