在redhat上使用bash shell直接进行网络通信编程不是什么新鲜事情,但是我们不经常这样做,而且大多数的bash shell教程也没有讲太多这方面的内容。 在大多数时间里,选择调用更容易和更快捷的命令:netcat、mutt、curl或者wget等,而不是使用built-ins的socket编程。但是在一些极少case情况下,用户的运行机器没有安装这些工具或者用户为了安全考虑根本不会运行安装多余的软件,如果去获得批准安装这些工具是意见及繁琐的事情时,不得不考虑使用built-ins的socket编程。
1. Bash's Built-in /dev/tcp File (TCP/IP)
Bash shell使用built-ins的socket编程:在用于重定向时,Bash有几个特定的文件名有特定的用途/dev/tcp/$host/$port: 开启一个TCP的socket连接 和 /dev/udp/$host/$port: 开启一个UDP的socket连接。
- host: 可以取值为有效的主机域名或IP地址
- port: 可以取值为有效的端口号或服务名(在/etc/services中定义)
在linux系统上使用命令:man bash,然后查找TCP关键字,可以快速查找到下面的内容:
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a UDP connection to the corresponding socket.
注意:
Ping : ping没有端口port这个参数。
telnet:使用telnet来探测指定ip是否开放端口:telnet ip地址 端口。
ping是用来检测到目标主机是否正常连通的,用的是ICMP协议,三层协议,没有ping端口的说法。
端口是TCP或UDP的内容,是四层协议。
2. Bash socket programming with /dev/tcp
The following script fetches the front page from Google:
#exec 3<>/dev/tcp/www.google.com/80 #echo -e "GET / HTTP/1.1\r\nhost: http://www.google.com\r\nConnection: close\r\n\r\n" >&3 #cat <&3
第一行:exec 3<> 告诉bash打开一个文件描述符“3” (不能是0,1,2的任意数量),并通过文件描述符“3”来读取和写入数据到“伪设备”/dev/tcp/www.google.com/80(如果您在/dev目录运行ls命令,你会发现实际并不存在)。 第一行就是在80端口上建立一个与 www.google.com 的 TCP连接。
尽管 / dev/tcp/www.google.com/80 不存在 的 事实 , 你会发现 有 一个新 创建的文件 位于 / dev/fd/5:a symbolic link to something along the lines of “socket:[<some number>]”。
第二行: 向打开的socket写入数据,使用GET方式发送一个HTTP request到google主页
第三行: 从打开的socket读取数据,读取google主页发送回来的HTTP response应答,并输出到控台。
控制台的输出结果:
HTTP/1.1 302 Found
Location: http://www.google.ca/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=c0937b14e3b5e4a2:FF=0:TM=1304375672:LM=1304375672:S=qvrh_IjuRcStbI-i; expires=Wed, 01-May-2013 22:34:32 GMT; path=/; domain=.google.com
Date: Mon, 02 May 2011 22:34:32 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ca/">here</A>.
</BODY></HTML>
HTTP response输出结构:状态行、响应头response headers、空行、响应数据,请参考HTTP协议。
参考文章:
Using BASH for network socket operation