【bash】关于 devtcp${HOST}${PORT}

【bash】关于 devtcp${HOST}${PORT},第1张

Linux中的一个特殊文件: /dev/tcp  打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

我们可以通过重定向实现基于tcp/udp协议的软件通讯,/dev/tcp/host/port  只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口

如果主机以及端口存在,就建立一个socket 连接,将在 /proc/self/fd 目录下面,有对应的文件出现。

#  echo >/dev/tcp/8888/53

这条命令的意思是向8888的53端口建立一个连接,会把连接返回的东西丢弃,查看连接是否成功,成功代表端口开放状态。
如果相应的域名能够被解析,host可以是域名
印象中/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 这个文件夹吧,里面也不会有文件。还是感觉这种设计不是很合理,哪怕设计成额外的命令行参数也比现在设计成一个伪文件要对使用者的理解更友好一点。

如果想要在Linux服务器上打开TCP / UDP套接字,例如检查特定的地址/端口是否可达、获取远程网页、调试一个restful API、连接到远程IRC服务器等。但是如果所在的Linux服务器是非常严格的,以致于没有任提供何标准工具,如netcat,curl或wget可能可用,这时候只能通过bash shell去完成上述的工作。

事实上,bash shell 的内置功能之一是通过/ dev / tcp(和/ dev / udp)设备文件打开TCP / UDP套接字。,我们来了解如何打开TCP / UDP套接字,并从bash shell中的套接字读取和写入。
简而言之,您可以使用bash shell 中的以下语法打开TCP / UDP套接字。

$ exec ${file-descriptor} </dev/${protocol}/${host}/${port}

“文件描述符”是与每个套接字相关联的唯一的非负整数。文件描述符0,1和2分别保留给stdin,stdout和stderr。因此,你必须指定3或更高(以未使用者为准)作为文件描述符。

“<>”意味着套接字对于读写都是打开的,根据你的需要,你可以打开只读(<)或只写(>)的套接字。

“协议”字段可以是tcp或udp,“主机”和“端口”字段是不言自明的。

例如,要打开套接字,使用>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10740086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存