linux shell /dev/tcp/${HOST}/${PORT} 简介
一、实验背景
Linux中的一个特殊文件: /dev/tcp 打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
我们可以通过重定向实现基于tcp/udp协议的软件通讯,/dev/tcp/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。
如果主机以及端口存在,就建立一个socket 连接,将在 /proc/self/fd 目录下面,有对应的文件出现。
# echo >/dev/tcp/8.8.8.8/53
这条命令的意思是向8.8.8.8的53端口建立一个连接,会把连接返回的东西丢弃,查看连接是否成功,成功代表端口开放状态。
如果相应的域名能够被解析,host可以是域名
二、How does it work?
印象中/dev/这个文件夹中保存着系统的设备文件,就以为 /dev/tcp/${HOST}/${PORT} 为一个存在在操作系统文件系统中的像设备一样的文件,但是这个文件并不存在的!
/dev/tcp/host/port 其实是一个 bash 的 feature,由于是 bash的 feature,因此在别的 shell下就不能生效,所以需要注意使用shell类型。
# cat /etc/shells
虽然:/dev/tcp/${HOST}/${PORT} 这个字符串看起来很像一个文件系统中的文件,并且位于 /dev 这个设备文件夹下
但是:这个文件并不存在,而且并不是一个设备文件。这只是 bash 实现的用来实现网络请求的一个接口,其实就像我们自己编写的一个命令行程序,按照指定的格式输入 host port参数,就能发起一个 socket连接完全一样。
其实很奇怪的是为什么这个接口的调用方式和访问文件系统是一样的,这会让很多人误以为这是一个文件,感觉不是特别合理。那么如果有这样的需求:如果真的有一个/dev/tcp/host/port文件该如何重定向? 可能 bash 的设计者在设计这个命令的调用方式的时候就默认不会存在 /dev/tcp 这个文件夹吧,里面也不会有文件。还是感觉这种设计不是很合理,哪怕设计成额外的命令行参数也比现在设计成一个伪文件要对使用者的理解更友好一点。
三、Bash Shell中的TCP / UDP套接字使用示例
如果想要在Linux服务器上打开TCP / UDP套接字,例如检查特定的地址/端口是否可达、获取远程网页、调试一个restful API、连接到远程IRC服务器等。但是如果所在的Linux服务器是非常严格的,以致于没有任提供何标准工具,如netcat,curl或wget可能可用,这时候只能通过bash shell去完成上述的工作。
事实上,bash shell 的内置功能之一是通过/ dev / tcp(和/ dev / udp)设备文件打开TCP / UDP套接字。,我们来了解如何打开TCP / UDP套接字,并从bash shell中的套接字读取和写入。
1、在Bash Shell中打开或关闭TCP / UDP套接字
简而言之,您可以使用bash shell 中的以下语法打开TCP / UDP套接字。
$ exec ${file-descriptor} </dev/${protocol}/${host}/${port}
“文件描述符”是与每个套接字相关联的唯一的非负整数。文件描述符0,1和2分别保留给stdin,stdout和stderr。因此,你必须指定3或更高(以未使用者为准)作为文件描述符。
“<>”意味着套接字对于读写都是打开的,根据你的需要,你可以打开只读(<)或只写(>)的套接字。
“协议”字段可以是tcp或udp,“主机”和“端口”字段是不言自明的。
例如,要打开www.example.com的双向TCP套接字,使用HTTP端口和文件描述符3:
$ exec 3 <> / dev/tcp /www.example.com/80
打开后,可以使用以下语法关闭读/写套接字,第一个命令关闭输入连接,后者关闭输出连接:
$ exec ${file-descriptor} <& -
$ exec ${file-descriptor}>& -
2、在Bash Shell中读取或写入TCP / UDP套接字
打开套接字后,你可以向套接字写入消息或从套接字读取消息。
要将存储在$MESSSAGE中的消息写入套接字:
$ echo -ne $MESSAGE >&3
$ printf $MESSAGE >&3
要从套接字读取消息并将其存储在$MESSAGE中:
$ read -r -u -n $MESSAGE <&3
$ MESSAGE=$(dd bs=$NUM_BYTES count=$COUNT <&3 2> / dev / null)
3、Bash Shell中的TCP / UDP套接字示例
这里我介绍几个打开和使用TCP套接字的shell脚本示例。
(1)获取远程网页并打印其内容
#!/bin/bashexec 3<>/dev/tcp/www.baidu.com/80
echo -e "GET /HTTP/1.1\r\nhost:www.baidu.com/\r\nConnection:close\r\n\r\n" >&3
(2)显示远程SSH服务器版本
#!/bin/bashexec 3</dev/tcp/192.168.1.104/22
timeout 1 cat <&3
(3)从nist.gov显示当前时间
#!/bin/bashcat </dev/tcp/time.nist.gov/13
(4)检查Internet连接
#!/bin/bashHOST=www.mit.edu
PORT=80
(echo >/dev/tcp/${HOST}/${PORT}) &>/dev/null
if [ $? -eq 0 ]; thenecho "Connection successfully!"
elseecho "Connection failed!"
fi
(5)对远程主机执行TCP端口扫描
#!/bin/bashhost=$1
port_first=1
port_last=65535
for ((port=$port_first; port<=$port_last; port++))
do(echo >/dev/tcp/$host/$port) >/dev/null 2>&1 && echo "$port open"
done
linux shell /dev/tcp/${HOST}/${PORT} 简介相关推荐
- linux shell json解析命令 jq 简介
jq简介 jq可以对json数据进行分片.过滤.映射和转换,和sed.awk.grep等命令一样,都可以让你轻松地把玩文本.它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的 ...
- linux shell shift命令 参数移动 简介
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: ru ...
- linux shell 用户切换命令 su 简介
Linux 系统有不同类型的用户,用户有不同类型的权限. 并非所有用户都可以执行所有命令,也不是所有用户都可以切换到其他用户.我们今天要介绍的内容就是如何在命令行中切换到其他用户. 要切换用户,首先需 ...
- linux脚本简介,Linux Shell脚本简介
Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...
- linux shell 宏定义_Linux系统和Shell命令行简介,走上数据分析之路
122Linux系统和Shell命令行简介,走上数据分析之路 本节作者:刘永鑫 中国科学院遗传与发育生物学研究所 版本1.0.2,更新日期:2020年8月31日 本项目永久地址:https://git ...
- Linux Shell 1/dev/null 21 含义
shell中可能经常能看到:echo log > /dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 /dev/null :代表空设备文件 :代表重定向到哪 ...
- 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介
DBA:Linux 面向 DBA 的 Linux Shell 脚本简介 作者:CasimirSaternos 学习一些在 Linux 上安装.运行和维护 Oracle 数据库所需的基本 bash sh ...
- linux快捷命令补齐,Linux Shell简介——自动补齐/命令行的历史记录/编辑命令行/可用的 Shell 快捷方式.doc...
Linux Shell简介--自动补齐/命令行的历史记录/编辑命令行/可用的 Shell 快捷方式 Unix (及后继者 Linux)在命令行下面诞生,因此,Unix 中的命令行有许多非常实用的功能. ...
- Linux Shell脚本入门教程系列之(十五) Shell函数简介
本文是Linux Shell脚本系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 上一篇之后,函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰 ...
最新文章
- EXSI 连接硬件USB pass-through
- Nginx基于TCP的四层负载均衡介绍
- 关于webcontrols的TreeView中转义符的处理问题
- 计算机网络体系小知识
- Redis Cluster日常操作命令梳理
- ie9 background 不显示
- 与TIME_WAIT相关的几个内核参数
- warframe计算机拒绝访问,Win10运行warframe出现蓝屏DRIVER_CORRUPTED_EXPOOL怎么办
- (转)淘淘商城系列——Solr集群搭建
- 128x64液晶驱动(添加详细)
- POJ2155 Matrix二维线段树经典题
- Openstack api 学习文档 restclient使用文档
- 拓端tecdat|R语言无监督学习:PCA主成分分析可视化
- 一个按照行来截取显示文章摘要的函数
- dstwo linux 模拟器,dstwo gba 模拟器-TempGBA下载V1.44 最新版-西西游戏下载
- 笔记本安装win10+ubuntu双系统超详细教程
- 中山大学3D游戏设计读书笔记 unity3D Note9
- 计算机二级office考试题库操作题,计算机二级考试MSOffice考试题库ppt操作题附答案...
- Win10安装TensorFlow出现过的问题汇总
- 入职以来一个月的心得体悟