joh*_*doe 13 linux bash io-redirection devices
尝试呼叫时/dev/tcp/www.google.com/80
,键入
/dev/tcp/www.google.com/80
Run Code Online (Sandbox Code Playgroud)
巴什说no such file or directory
。在网上查看其他人的代码时,他们使用的语法如
3<>/dev/tcp/www.google.com/80
Run Code Online (Sandbox Code Playgroud)
我注意到这也有效:
</dev/tcp/www.google.com/80
为什么需要这些符号来调用 bash 中的某些东西?
Sté*_*las 31
因为这是 shell(ksh 的,由 bash 复制的)的一个特性,并且仅是 shell。
/dev/tcp/...
不是真正的文件,shell 会拦截重定向到/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 -
是专门处理的文件路径的另一个示例。open("-")
它没有执行 a ,而是直接从文件描述符 0 (stdin) 中读取。cat
许多文本实用程序都这样做,shell 不用于重定向。要读取-
文件的内容,您需要cat ./-
, 或cat < -
(或cat - < -
)。但是,在没有 have 的系统上/dev/stdin
,bash
将对来自该(虚拟)文件的重定向执行类似的操作。GNUawk
对/dev/stdin
、/dev/stdout
、/dev/stderr
甚至在确实具有此类文件的系统上也执行相同的操作,这可能会在 Linux 等系统上引起一些意外,因为这些文件的行为不同。
zsh
还具有 TCP(和 Unix 域流)套接字支持,但这是通过ztcp
(and zsocket
) 内置函数完成的,因此它比 ksh/bash 方法的限制要少。特别是,它还可以充当 ksh/bash 无法做到的服务器。尽管如此,它仍然比您在真正的编程语言中所能做的要有限得多。
您似乎混淆了想法或阅读文件并执行命令。数据和指令的区别。
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
Run Code Online (Sandbox Code Playgroud)