Linux下利用shell简单调试udp和tcp
Linux下利用shell简单调试udp和tcp
背景
Linux环境下,有时候需要简单地进行下udp和tcp的测试,又不想去写C之类的代码,可以尝试下用Python或者直接用Shell来处理,简单方便,高效快捷。这里主要讲讲使用Shell的方式。
- 服务端主要使用 nc (netcat) 。
- 客户端主要使用
/dev/tcp
、/dev/udp
。
nc: — arbitrary TCP and UDP connections and listens
The nc (or netcat) utility is used for just about anything under the sun
involving TCP, UDP, or UNIX-domain sockets. It can open TCP connections,
send UDP packets, listen on arbitrary TCP and UDP ports, do port scan‐
ning, and deal with both IPv4 and IPv6.
/dev/(tcp|udp)
虽然:/dev/(tcp|udp)
看起来很像一个文件系统中的文件,并且位于 /dev 这个设备文件夹下
但是:这个文件并不存在,而且并不是一个设备文件。
是一个 bash
的 一个特性。可以看官方说明:https://www.gnu.org/software/bash/manual/bash.html
/dev/(tcp|udp)/host/port
If host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open the corresponding (tcp|udp) socket.
下面来看看具体的实现方式,以下方案都亲测有效!
服务端
使用 nc (netcat) 命令创建一个简单的 TCP /UDP服务器
TCP
#!/bin/bash
# 定义监听的端口号
port=12345
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -l $port | while IFS= read -r line; do
echo "$line"
done
done
UDP
UDP服务端就是nc
加 -u
参数
#!/bin/bash
# 定义监听的端口号
port=12345
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -u -l $port | while IFS= read -r line; do
echo "$line"
done
done
客户端
TCP
tcp是使用/dev/tcp
echo "hello" > /dev/tcp/127.0.0.1/12345
UDP
udp使用/dev/tcp
echo "hello" > /dev/udp/127.0.0.1/12345
扩展 – 进制与字符串处理
发送十六进制数据:
echo "07E8011A" | xxd -r -p > /dev/udp/127.0.0.1/12345
xxd
命令:
make a hexdump or do the reverse.
xxd creates a hex dump of a given file or standard input. It can also
convert a hex dump back to its original binary form. Like uuencode(1)
and uudecode(1) it allows the transmission of binary data in a `mail-
safe’ ASCII representation, but has the advantage of decoding to stan‐
dard output. Moreover, it can be used to perform binary file patching.