shell 实现tcp/udp通信
原创
©著作权归作者所有:来自51CTO博客作者tcspecial的原创作品,请联系作者获取转载授权,否则将追究法律责任
Linux下通信调试非常方便,系统提供了大量的网络调试工具,如 tcpdump,nc,lsof,netstat 可以快速调试tcp,udp服务。看到一篇文章shell 不借助上述工具,通过重定向也可实现通信,太神奇了。
Linux 下特殊文件,/dev/[tcp|udp/host/port , 只要读取该文件,系统会建立与host:port的socket连接,达到通信的目的,类似于命令 nc host port 。
[scada@linux ~]$ exec 8<> /dev/tcp/localhost/echo # exec连接echo服务,在/proc/self/fd显示连接
[scada@linux ~]$ ll /proc/self/fd
总用量 0
lrwx------. 1 scada scada 64 10月 11 09:52 0 -> /dev/pts/3
lrwx------. 1 scada scada 64 10月 11 09:52 1 -> /dev/pts/3
lrwx------. 1 scada scada 64 10月 11 09:52 2 -> /dev/pts/3
lr-x------. 1 scada scada 64 10月 11 09:52 3 -> /proc/34388/fd
lrwx------. 1 scada scada 64 10月 11 09:52 8 -> socket:[294041]
[scada@linux ~]$ exec 8>&- # close(8)
[scada@linux ~]$ cat 8<> /dev/tcp/localhost/echo # tcp方式连接系统echo服务(fd=8),然后可以收发信息。echo代表端口7,可通过查询: cat /etc/services | grep echo
hello world
hello world
[scada@linux ~]$ ps -ef|grep cat # 查找cat pid
scada 34277 34175 0 09:41 pts/3 00:00:00 cat
scada 34310 34251 0 09:44 pts/4 00:00:00 grep cat
[scada@linux ~]$ lsof -p 34277 # 查看cat资源使用情况
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cat 34322 scada 0u CHR 136,3 0t0 6 /dev/pts/3
cat 34322 scada 1u CHR 136,3 0t0 6 /dev/pts/3
cat 34322 scada 2u CHR 136,3 0t0 6 /dev/pts/3
cat 34322 scada 8u IPv4 293428 0t0 TCP linux.kettas:57967->linux.kettas:echo (ESTABLISHED) # 与xinetd建立tcp连接
[scada@linux ~]$ cat 8<> /dev/udp/localhost/echo # udp方式连接echo服务,nc -u localhost 7
hello world
hello world
[scada@linux sh]$ (echo -e "HEAD / HTTP/1.1\n\n\n\n\n";sleep 2)|telnet www.baidu.com 80 # telnet连接百度服务器,并请求服务器头信息
Trying 180.97.33.108...
Connected to www.baidu.com.
Escape character is '^]'.
HTTP/1.1 302 Moved Temporarily
Date: Sat, 11 Oct 2014 02:04:56 GMT
Content-Type: text/html
Content-Length: 215
Connection: Keep-Alive