【问题标题】:listen for returning UDP packets in bash监听在 bash 中返回的 UDP 数据包
【发布时间】:2020-10-05 21:48:43
【问题描述】:

出于学习目的,我使用了 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 绝对不是这个的正确选择...
  • @KarolyHorvath 实际上,对于小型和微型 IOT 设备来说,bash 是一个出色的工具,对于许多应用程序来说,bash 都可以很好地处理 UDP。而且,顺便说一句,这不是问题所在:他不是在征求意见。

标签: bash sockets


【解决方案1】:

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

nc -u 192.0.2.1 53

注意:使用 coproc 或命名管道从同一个 netcat 进程中读取和写入。不要先发包,然后尝试捕捉回复netcat。

尽管如此,Bash 确实是错误的语言。考虑使用 Python,它可以更好地处理 UDP 和二进制数据,只需多几行代码。

【讨论】:

  • 你能解释一下命名管道在这种情况下的用法吗?您是不是要将 UDP 数据包写入命名管道,然后将命名管道用作nc 的标准输入?如果是,那么为什么这种方法比将 UDP 数据包直接重定向到 nc 更好?
  • 您可以使用 coprocs 或命名管道与进程进行双向通信。如果您只想发送一个数据包并收到一个回复​​,则不需要它。
【解决方案2】:

“bash 绝对不是这个的正确选择”
“尽管如此,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+”关闭历史扩展来处理意外的(由我)扩展!在引号内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多