shell发送TCP/UDP消息
通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。
发UDP消息
格式 /dev/udp/ip/port
例子:向本地10001端口发送数据,可以使用
echo "hello" > /dev/udp/localhost/10001
如果需要循环向特定udp端口发送数据,则:
while true
do
echo "xxxx" > /dev/udp/localhost/10001
done
发TCP消息
exec 9<>/dev/tcp/10.100.70.139/19006 #创建tcp链接
echo -e "stats" >&9 #发送消息
关闭链接:
exec 9>&-
exec 9<&-
exec 9>/dev/tcp/192.168.0.136/5000
其中9为执行的文件描述符。可以是与每个套接字相关联的唯一的非负整数。文件描述符0,1和2分别保留给stdin,stdout和stderr。因此,必须指定3或更高(以未使用者为准)作为文件描述符。
这里> 重定向符表示该文件描述符,单向套接字只能写入,<>即代表示双向TCP套接字可读可写。
shell创建TCP/UDP服务端和客户端
使用nc (Netcat) 命令创建一个简单的 TCP /UDP服务器
TCP
服务端
#!/bin/bash
# 定义监听的端口号
port=10266
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -l $port | while IFS= read -r line; do
echo "$line"
done
done
客户端
echo "hello" > /dev/tcp/10.223.218.209/10266
UDP
服务端,就是nc 加-u参数
#!/bin/bash
# 定义监听的端口号
port=10266
# 创建一个简单的 server,监听指定的端口,并打印接收到的信息
while true; do
nc -u -l $port | while IFS= read -r line; do
echo "$line"
done
done
客户端
echo "hello" > /dev/udp/10.223.218.209/10266
shell给tcp或udp服务发送16进制报文指令
指令:
(sleep 2;echo "000F737D61747573" | xxd -r -p ;sleep 1)|nc 192.168.137.1 15000|hexdump -C
说明:上面为tcp示例(给nc添加参数-u可改为udp,但没验证,理论上可行)
示例功能:给192.168.137.1上的15000端口tcp服务发送16进制报文内容000F737D61747573并将响应报文以16进制格式回显出来
shell处理进制数和字节
shell 10进制转16进制数
dec2hex(){
printf "%x" $1
}
a=$(dec2hex 2131165531)
echo $a
10进制转16进制:15 > 0xf
printf '%x\n' 15
16进制转10进制:0xf > 15
printf '%d\n' 0xF
echo $((16#f))
16进制转8进制:0xF > 17
printf '%o\n' 0xF
8进制转10进制:8#17 > 15
echo $((8#17))
2进制转10进制:2#1111 > 15
echo $((2#1111))
还可以利用bc输出进制数
Linux 小技巧:bc输出进制 倒叙正序输出 查看汇编_ Zach-Zona的博客-CSDN博客
十六进制字符串到字节
linux shell脚本:十六进制字符串到字节 - 码客
shell字符串倒叙
方法1,使用rev
[root@rdma55 ~]# echo "ABC"|rev
CBA
方法2,使用awk
awk '{ for(i=length($0);i>0;i--){printf substr($0,i,1)}; printf "\n"}' file.txt
[root@rdma55 ~]# echo "ABC"|awk '{ for(i=length($0);i>0;i--){printf substr($0,i,1)}; printf "\n"}'
CBA
shell判断大小端序
方法一
echo -n I | od -o | head -n1 | cut -f2 -d" " | cut -c6
输出:1为小端模式,0为大端模式;
解析:od命令的作用为将指定内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示;
方法二
echo -n I | od -o | head -n1 | awk '{print $2}'| cut -c6
输出:1为小端模式,0为大端模式;
解析:awk命令为文本处理。
方法三
lscpu | grep -i byte
输出:Byte Order: Little Endian;
解析:grep -i 为不区分大小写匹配;
注意:在低版本的Linux可能不支持lscpu命令。
方法四
dpkg-architecture | grep -i end
输出:
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little
DEB_TARGET_ARCH_ENDIAN=little
解析:dpkg-architecture命令是列出dpkg打包的一些环境参数;
【Shell】通过shell脚本调用tcp/udp socket
技术标签: Linux Shell Shell
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//80
-
echo -e "GET / HTTP/1.1\r\nhost: \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)从显示当前时间
-
#!/bin/bash
-
cat </dev/tcp/time./13
(5)检查Internet连接
-
#!/bin/bash
-
HOST=
-
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//80: No such file or directory
- 除了bash之外,已知可以在其他shell(如ksh或zsh)中使用套接字支持。