/dev/udp
我最近了解到/dev/tcp
伪设备这里。它们是特定于某些 GNU/Linux 发行版的还是我可以在其他 UNIX 系统上找到它们?
它们以某种方式标准化了吗?
到目前为止,我已经能够在 OS X、Arch Linux 和 CentOS 上成功使用它们。
答案1
这是一个特点壳而不是操作系统。
例如,在 Solaris 10 上使用ksh88
shell:
% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open
但是,如果我们切换到bash
:
% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5
所以bash
解释了/dev/tcp
但 ksh88 没有。
在 Solaris 11 上ksh93
作为 shell:
% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2
所以我们可以看到它非常依赖于所使用的 shell。
答案2
要添加,从Bash 信息节点:
当多个文件名用于重定向时,Bash 会专门处理这些文件名,如下表所述。如果运行 Bash 的操作系统提供了这些特殊文件,bash 将使用它们;否则它将通过下面描述的行为在内部模拟它们。
'/dev/fd/FD' 如果 FD 是有效整数,则文件描述符 FD 是重复的。
'/dev/stdin' 文件描述符 0 重复。
'/dev/stdout' 文件描述符 1 重复。
'/dev/stderr' 文件描述符 2 重复。
'/dev/tcp/HOST/PORT' 如果 HOST 是有效的主机名或 Internet 地址,并且 PORT 是整数端口号或服务名称,Bash 会尝试打开相应的 TCP 套接字。
'/dev/udp/HOST/PORT' 如果 HOST 是有效的主机名或 Internet 地址,并且 PORT 是整数端口号或服务名称,Bash 会尝试打开相应的 UDP 套接字。