bash shell 的内置功能之一是通过/dev/tcp和/dev/udp设备文件打开TCP / UDP套接字。
以下介绍如何在shell中使用tcp/udp socket
- 在Bash Shell中打开或关闭TCP / UDP套接字
语法:
$ exec {file-descriptor} </ dev / {protocol} / {host} / {port}
file-descriptor:
与每个套接字相关联的唯一的非负整数。
文件描述符0,1和2分别保留给stdin,stdout和stderr。
因此,必须指定3或更高(以未使用者为准)作为文件描述符。
<>:
套接字对于读写都是打开的。根据需要,可以打开只读(<)或只写(>)的套接字。
protocol:
可以是tcp或udp。
host:
主机IP地址。
port:
主机端口。
例如:
要打开127.0.0.1的双向TCP套接字,使用端口5000和文件描述符3:
$ exec 3 <> /dev/tcp/127.0.0.1/5000
关闭读/写套接字。第一个命令关闭输入连接,后者关闭输出连接。
$ exec {file-descriptor} <& - $ exec {file-descriptor}>& -
- 在Bash Shell中读取或写入TCP / UDP套接字
要将$MESSSAGE参数中内容写入套接字:
$echo -ne $MESSAGE>&3
$printf $MESSAGE>&3
要从套接字读取消息并将其存储在$MESSAGE参数中:
$read -r -u -n $MESSAGE <&3
$MESSAGE = $(dd bs = $NUM_BYTES count = $COUNT <&3 2> /dev/null)
- Bash Shell中的TCP / UDP套接字示例
(1)通过udp发送信息到服务器(本机)的5000端口
#!/bin/bash
str1='hello,world'
echo $str1 > /dev/udp/127.0.0.1/5000
(2)获取远程网页并打印其内容
#!/bin/bash
exec 3<>/dev/tcp/xmodulo.com/80
echo -e "GET / HTTP/1.1\r\nhost: xmodulo.com\r\nConnection: close\r\n\r\n" >&3
cat <&3
(3)显示远程SSH服务器版本
#!/bin/bash
exec 3</dev/tcp/192.168.0.10/22
timeout 1 cat <&3
(4)从nist.gov显示当前时间
#!/bin/bash
cat </dev/tcp/time.nist.gov/13
(5)检查Internet连接
#!/bin/bash
HOST=www.mit.edu
PORT=80
(echo >/dev/tcp/${HOST}/${PORT}) &>/dev/null
if [ $? -eq 0 ]; then
echo "Connection successful"
else
echo "Connection unsuccessful"
fi
(6)对远程主机执行TCP端口扫描
#!/bin/bash
host=$1
port_first=1
port_last=65535
for ((port=$port_first; port<=$port_last; port++))
do
(echo >/dev/tcp/$host/$port) >/dev/null 2>&1 && echo "$port open"
done
【注意】
- 在bash中打开一个socket需要bash shell启用net-redirections(即使用“--enable-net-redirections”编译)。旧发行版可能禁用了bash的功能,在这种情况下,您将遇到错误: /dev/tcp/xmodulo.com/80: No such file or directory
- 除了bash之外,已知可以在其他shell(如ksh或zsh)中使用套接字支持。