利用Linux socat快速搭建TCP服务器
某些场合,需要在Linux上快速搭建一个TCP的服务器,接收客户端的连接,返回一些数据。
一般用于测试或者负载不大,安全性要求不高的场合,达到快速搭建的目的。
本文以客户端通过服务器的3334端口,获取服务器连接的modem网卡蜂窝信号强度为例,说明使用方法。
第一步:
假设服务器端获取modem网卡的命令及返回值如下:
其中,对我有用的如下字段:
signal quality: 100% (recent)
第二步:
随后在服务器下新建getSignalLevel.sh脚本,赋予a+x权限
#!/bin/sh -
while read command;
do
##echo got msg:$command
if [[ $command == battery* ]]; then
msg=`mmcli -m 0 | grep "signal quality:" | awk -F':' '{print $2}' | awk -F'%' '{print $1}'`
##echo battery levle:$msg
level=5;
if [ $msg>80 ]; then
level=5
elif [ $msg>60 ]; then
level=4
elif [ $msg>50 ]; then
level=3
elif [ $msg>30 ]; then
level=2
elif [ $msg>10 ]; then
level=1
else
level=0
fi
echo battery:$level
elif [[ $command == wifirssi* ]]; then
macs=`iw dev phy0-ap0 station dump | grep Station | awk -F' ' '{print $2}'`
for var in $macs
do
##echo $var
if [[ $var != c8:f0:9e:2e:34:40 ]]; then
rssi=`iw dev phy0-ap0 station get $var | grep signal: | awk -F' ' '{print $2}'`
echo wifirssi:$rssi
break 1
fi
done
fi
done
然后在服务器端执行如下命令:
socat -d -d tcp-l:3334,fork,reuseaddr exec:/etc/getSignalLevel.sh &
该shell命令的作用是监听3334端口,把收到的数据转发给getSignalLevel脚本处理;上述shell脚本中循环读取外部输入,如果是指定字符串打头["battery"],就转成0-4的int型singal level,并作为输出返回给socat,socat收到后通过3334端口返回给tcp client;
第三步:
起一个端口调试器,模拟客户端,输入命令,获取结果,运行截图如下:
注意,输入的battery:后面要带换行符,因为shell的read命令是检测回车换行作为字符截止的。
教程结束,enjoy!