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


13

尝试致电时/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调用某些内容,需要使用这些符号?


2
您所说的“通话”是什么意思?收到错误消息后,请告诉我们您在做什么。您是否要执行它?即使google的首页是可执行代码,我也不推荐。
ctrl-alt-delor

/dev/tcp/www.google.com/80
约翰·多

我编辑了您的问题,说出我的意思。
ctrl-alt-delor

Answers:


29

因为那是shell(由kash复制,由bash复制)和shell的功能。

/dev/tcp/...如果不是真正的文件,则外壳程序会拦截尝试重定向到/dev/tcp/...文件的尝试,然后在这种情况下执行socket(...);connect(...)(建立TCP连接)而不是open("/dev/tcp/..."...)(打开该文件)。

请注意,它必须这样拼写。cat < /dev/./tcp/...否则///dev/tcp/...将无法正常运行,而是尝试打开这些文件(在大多数系统上不存在,并且会出现错误)。

重定向的方向也无关紧要。无论您使用3< /dev/tcp/...3> /dev/tcp/...3<> /dev/tcp/...或甚至3>> /dev/tcp/...不会有任何区别,你就可以到文件描述符读取和写入从/过该TCP套接字接收/发送数据。

当您执行时cat /dev/tcp/...,由于cat未实现相同的特殊处理而无法正常工作,它对open("/dev/tcp/...")每个文件(除外-)都执行类似操作,仅对shell(仅ksh,bash)起作用,并且仅对重定向目标起作用。

cat -是专门处理的文件路径的另一个示例。它不执行a而是open("-")直接从文件描述符0(stdin)中读取。cat而且许多文本实用程序都可以执行此操作,因此外壳程序不对其进行重定向。要读取-文件的内容,您需要cat ./-cat < -(或cat - < -)。但是,在没有have的系统上/dev/stdinbash它将对从该(虚拟)文件进行重定向执行类似的操作。GNU awk完成了同样的/dev/stdin/dev/stdout/dev/stderr甚至上确实有这样的文件,这可能会导致像Linux系统的一些惊喜,其中这些文件表现不同的系统。

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


4

您似乎在混淆这些想法,或者正在读取文件并执行命令。数据和指令之间的区别。

Google的首页不是可执行程序。如果是这样,运行它将是不安全的。

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

我们可以这样做,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

1
如果文件存在但不可执行,则将收到其他错误。
Barmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.