shell 实现tcp/udp通信

      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

   原文: http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html

猜你喜欢

转载自tcspecial.iteye.com/blog/2128381