我知道/dev/tcp/<host>/<port>
这是一条由重定向中的某些 shell 专门处理的神奇路径。但根据man bash
:
如果运行 bash 的操作系统提供了这些特殊文件,bash 将使用它们;否则它将在内部模仿它们[...]
在我现在使用的 Linux 机器上,/dev/tcp
特殊文件不存在,因此 Bash 将仿真它。但是,是否真的有一个类 Unix 系统确实提供了/dev/tcp
与 Bash 支持的语义相同的特殊文件呢?
答案1
我认为 Bash 文档在这个主题上有些误导。看一下代码,甚至回到2.04版本,引入了网络重定向,/dev/tcp
工作/dev/udp
原理如下:
- 在构建时,
configure
脚本检查是否支持各种网络功能;如果是这样,如果启用了网络重定向(默认情况下是这种情况),则内置内部网络代码; - 在运行时,如果内部网络代码是内置的,
/dev/tcp
并且/dev/udp
(以正确的格式)在内部处理;否则,会产生一条警告(“/dev/(tcp|udp)/host/port not support withoutnetworking”),并且 Bash 会尝试打开系统上的给定路径; - 如果配置了网络重定向,则不会执行任何特殊操作。
这归结为:
- 如果启用网络重定向:
- 目标平台是否支持网络,
/dev/tcp
并且/dev/udp
始终在内部处理; - 否则,Bash 将发出警告并尝试“盲目”打开文件;如果系统以某种方式支持
/dev/(tcp|udp)/host/port
,则将使用它,否则重定向很可能会失败;
- 目标平台是否支持网络,
- 如果禁用网络重定向,则不执行任何特殊处理;如上所述,如果系统以某种方式支持
/dev/(tcp|udp)/host/port
,则将使用它,否则重定向很可能会失败。
/dev/tcp
确实存在于某些系统上,但据我所知,没有一个系统支持与 Bash 相同的抽象。在 Solaris 上,/dev/tcp
与工具一起使用来ndd
查询和更改网络配置。在XTI(也可以看看公开组如果您是会员),该t_open
函数可用于/dev/tcp
打开 TCP 连接,但它不使用基于路径的设置,有一个单独的数据结构来指定目标主机和端口(以及其他参数)。