为什么使用 /dev/tcp 需要 < 或 >

为什么使用 /dev/tcp 需要 < 或 >

尝试拨打电话时/dev/tcp/www.google.com/80,请输入

/dev/tcp/www.google.com/80

巴什说no such file or directory。当在线查看其他人的代码时,他们使用以下语法

 3<>/dev/tcp/www.google.com/80

我注意到这也有效:

</dev/tcp/www.google.com/80

为什么需要这些符号来调用 bash 中的某些东西?

答案1

因为这是 shell(ksh 的,由 bash 复制的)的一个特性,而且只是 shell 的一个特性。

/dev/tcp/...不是真实文件,那么在这种情况下, shell 会拦截重定向到/dev/tcp/...文件的尝试,然后执行socket(...);connect(...)(建立 TCP 连接)而不是(打开该文件)。open("/dev/tcp/..."...)

请注意,它必须这样拼写。cat < /dev/./tcp/...///dev/tcp/...不起作用,并将尝试打开这些文件(在大多数系统上这些文件不存在,您会收到错误消息)。

重定向的方向也并不重要。无论您使用3< /dev/tcp/...or3> /dev/tcp/...3<> /dev/tcp/...or 甚至3>> /dev/tcp/...都没有任何区别,您将能够从该文件描述符读取和写入,以通过该 TCP 套接字接收/发送数据。

当您这样做时cat /dev/tcp/...,这不起作用,因为cat没有实现相同的特殊处理,它对open("/dev/tcp/...")每个文件(除了-)执行类似操作,只有 shell(仅 ksh、bash)执行此操作,并且仅针对重定向目标。

cat -是另一个专门处理文件路径的示例,这次是由cat而非 shell 处理。

不是执行 aopen("-")并从结果文件描述符中读取输入,而是cat直接从文件描述符 0 (stdin) 中读取。cat许多文本实用程序都会这样做,但 shell 不会进行重定向。要读取文件的内容-,您需要cat ./-, 或cat < -(或cat - < -)。然而,在没有 , 的系统上/dev/stdinbash将对来自该(虚拟)文件的重定向执行类似的操作。即使在确实有此类文件的系统上,GNU 也会对 、执行awk相同的操作/dev/stdin,这可能会在像 Linux 这样的系统上导致一些意外,因为这些文件的行为不同。/dev/stdout/dev/stderr

zsh还具有 TCP(和 Unix 域流)套接字支持,但这是通过ztcp(和zsocket) 内置函数完成的,因此它比 ksh/bash 方法的限制更少。特别是,它还可以充当 ksh/bash 无法做到的服务器。尽管如此,它仍然比你在真正的编程语言中可以做的事情要有限得多。

答案2

您似乎混淆了想法或读取文件并执行命令。数据和指令之间的区别。

谷歌的首页不是可执行程序。如果是的话,运行它就不安全了。

重定向字符(包括<>)用于将数据定向到命令中。

我们可以这样做cat < /dev/tcp/towel.blinkenlights.nl/23,但是这不起作用,/dev/tcp/www.google.com/80因为在我们发送之前该端口不会响应GET / HTTP/1.0\r\n\r\n

所以尝试一下

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80

相关内容