一切皆文件
Linux的哲学之一就是一切皆文件,因此,网络连接socket也可以抽象为一种文件,例如/dev/tcp/114.114.114.114/53
或者/dev/tcp/www.baidu.com/80
使用文件描述符
echo "SOMETHING" >& FD #使用>&后面接文件描述符的方式可以重定向到指定的文件描述符中
对于绑定文件描述符的操作在shell中的进程池中也有用到,通过将文件描述符绑定在管道文件上就实现了,读写这个管道的特性,利用管道特性实现了进程池的操作,而这次实现的是文件描述符绑定socket,通过这个文件描述符传输信息
使用管道和socket连接检测端口连通性
正常情况下我们都是使用telnet或者nc检测端口连通性,但在特殊情况下(例如精简的容器中、未配置软件源且禁止联通外网的系统中)telnet和nc就不行了,他们自己本身的下载都是问题,因此采用bash内建的exec和管道特性,加上Linux本身具有的一切皆文件哲学的实现,就可以完成不利用外部软件的情况下测试端口连通性
$ exec 100<> /dev/tcp/114.114.114.114/53 # 使用tcp连接114.114.114.114 53端口
$ if [ $? -eq 0 ];then echo SUCCESS;else echo FAILD;fi
使用管道和文件描述符查看网页
exec 100<> /dev/tcp/www.baidu.com/80 # 使用tcp协议连接www.baidu.com的80端口,并将这个socket输入和输出绑定到文件描述符100上
echo -e "GET / HTTP/1.0\n" 1>& 100 # 发送HTTP1.0协议的GET请求,并将标准输出写入到文件描述符100中
cat 0<& 100 # 将文件描述符100中的内容输入重定向至cat
其实上述过程中1>&
和0<&
中的1和0都可以省略,因为默认的标准输出的文件描述符就是1,默认的输入重定向描述符就是0