TCP连接,仅限bash

36

我在一份脚本中找到了这行代码。虽然我大致明白它的作用——打开一个双向TCP连接——但是我需要对语法进行解释。以下是该行代码:

exec 5<>"/dev/tcp/${SERVER}/${PORT}"

我的问题:

  1. <>通常用于重定向IO。那在这里它是什么意思?它能在其他情况下使用吗?如何使用?
  2. /dev/tcp不存在,为什么它可以工作?
  3. 为什么是5?它可以是另一个数字吗?允许使用哪些值?
  4. 为什么需要使用exec?(考虑到实际上没有任何东西被执行)

谢谢。

2个回答

22
< 和 > 通常用于重定向IO。那是什么意思?它在其他上下文中可用吗?怎么用?
答:它的意思是将输入和输出重定向到文件描述符5。在另一个上下文中也可以使用,但需要确保不使用已经在使用的文件描述符。
为什么它可以工作,而/dev/tcp不存在?
答:/dev/tcp是一个特殊的文件。如果主机是有效的主机名或Internet地址,并且端口是整数端口号或服务名,则bash会尝试打开到相应套接字的TCP连接。
为什么是数字5?它可以是另一个数字吗?允许的值是什么?
答:是的,它可以是任何值,但必须确保您没有使用已经在使用的文件描述符。
为什么需要exec?(假设实际上什么也没有被执行)
答:exec意味着重定向发生在当前shell中,而不是在子shell中。

9
这个回答有一个重要的提示。只有在构建bash时启用了对 "/dev/tcp" 的支持,Bash才会使用它。特别是,Red Hat 在构建bash时启用了支持,而Debian没有(或者至少我上次检查时是这样的,那已经很久了)。不要指望所有shell或所有版本的bash都可以使用它。 - William Pursell

6

我只能回答执行部分:

如果没有给出命令,exec 可以用于更改 I/O 重定向。在这种情况下,<> 意味着打开读写。5 是通道号(或文件描述符)。如果其他命令从通道 5 发送其输出 / 读取其输入,则这是有意义的。

对于 "/dev/tcp/${SERVER}/${PORT}",我不知道它是特定 Linux 版本的功能还是 bash 的功能(我认为是后者)。

-- 编辑:来自 bash 手册页面:--

 Bash handles several filenames specially when they are  used
 in redirections, as described in the following table:

      /dev/fd/fd
           If fd is a valid integer, file  descriptor  fd  is
           duplicated.
      /dev/stdin
           File descriptor 0 is duplicated.
      /dev/stdout
           File descriptor 1 is duplicated.
      /dev/stderr
           File descriptor 2 is duplicated.
      /dev/tcp/host/port
           If host is a valid hostname or  Internet  address,
           and  port  is  an  integer  port number or service
           name, bash attempts to open a  TCP  connection  to
           the corresponding socket.
      /dev/udp/host/port
           If host is a valid hostname or  Internet  address,
           and  port  is  an  integer  port number or service
           name, bash attempts to open a  UDP  connection  to
           the corresponding socket.

9
这些扩展需要在编译Bash时启用 (--enable-net-redirections),并非所有Linux发行版都以此方式编译Bash。例如,Debian和Ubuntu就没有启用这个功能。 - Nordic Mainframe
好观点!我非常感激有关兼容性警告的提醒。 - ktf
这在Debian上确实有效,并且已经有效多年了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接