TCP连接,仅限bash

gre*_*eth 27 sockets linux bash tcp

我在脚本中找到了这一行.虽然我在全球范围内了解它的作用 - 打开双向TCP连接 - 但我需要对语法进行一些解释.这是行:

exec 5<>"/dev/tcp/${SERVER}/${PORT}"
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. <并且>通常用于重定向IO.那是什么意思?它可以在另一个环境中使用吗?怎么样?
  2. 它为什么有效,/dev/tcp而不存在?
  3. 为什么5?可以是另一个号码吗?允许的值是多少?
  4. 为什么有exec必要?(没有任何实际执行)

谢谢.

tro*_*foe 17

<和>通常用于重定向IO.那是什么意思?它可以在另一个环境中使用吗?怎么样?

它是相同的 - 输入和输出被重定向到fd 5.

为什么它可以工作,而/ dev/tcp不存在?

这是一个特殊文件:如果host是有效的主机名或Internet地址,并且port是整数端口号或服务名,则bash会尝试打开与相应套接字的TCP连接.

为什么5?可以是另一个号码吗?允许的值是多少?

是的,它可以是任何值,但您需要确保不使用已经使用的fd.

为什么exec是必要的?(没有任何实际执行)

exec表示重定向发生在当前shell中,而不是在子shell中.

  • 这个答案有一个重要的警告.如果在构建bash时启用了对它的支持,Bash将仅支持"/ dev/tcp"*.特别是,Red Hat使用它来构建bash,而Debian没有(或者至少它们不是我最后一次检查,这是很久以前).不要指望这种方法适用于所有贝壳,也不适用于所有贝壳. (6认同)

ktf*_*ktf 6

我只能回答 exec 部分:

没有给出命令的 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.
Run Code Online (Sandbox Code Playgroud)

  • 这些是编译 bash 时必须启用的扩展(--enable-net-redirections)。并非所有 Linux 发行版都以这种方式编译 bash。例如 Debian 和 Ubuntu 不启用它。 (9认同)