【问题标题】:TCP connection, bash onlyTCP 连接,仅限 bash
【发布时间】:2011-12-07 13:52:08
【问题描述】:

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

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

还有我的问题:

  1. &lt;&gt; 通常用于重定向 IO。那里是什么意思?它可以在其他情况下使用吗?怎么样?
  2. 为什么它有效,而/dev/tcp 不存在?
  3. 为什么是 5?可以是另一个号码吗?允许的值是多少?
  4. 为什么需要exec? (假设实际上没有执行

谢谢。

【问题讨论】:

    标签: linux bash sockets tcp


    【解决方案1】:

    通常用于重定向 IO。那里是什么意思?它可以在其他情况下使用吗?怎么样?

    同样——输入和输出被重定向到 fd 5。

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

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

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

    是的,它可以是任何值,但您需要确保您没有使用已在使用的 fd。

    为什么需要执行? (假设没有实际执行)

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

    【讨论】:

    • 这个答案有一个重要的警告。 Bash 只会尊重“/dev/tcp”if 对它的支持在构建 bash 时启用。特别是,Red Hat 在启用 bash 的情况下构建它,而 Debian 没有(或者至少在我上次检查时他们没有,那是很久以前的事了)。不要期望这在所有 shell 中都可以工作,也不能在所有 bash 中工作。
    【解决方案2】:

    我只能回答执行部分:

    没有给出命令的执行可以用来改变 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.
    

    【讨论】:

    • 这些是在编译 bash (--enable-net-redirections) 时必须启用的扩展。并非所有 Linux 发行版都以这种方式编译 bash。例如 Debian 和 Ubuntu 不启用它。
    • 好点!我非常感谢有关兼容性的警告。
    猜你喜欢
    • 2010-09-29
    • 2011-10-04
    • 2016-03-31
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2016-05-01
    • 2016-06-23
    • 2014-11-13
    相关资源
    最近更新 更多