有哪些 Linux shell 允许通过重定向器进行网络流量管理(向/dev/tcp/host/port 发送/接收数据)?

有哪些 Linux shell 允许通过重定向器进行网络流量管理(向/dev/tcp/host/port 发送/接收数据)?

按照此bash 教程,我已经成功获取了a的代码发出简单命令的网页通过使用这种方法:

$ exec 3<>/dev/tcp/www.google.com/80
$ echo -e "GET / HTTP/1.1\n\n" >&3
$ cat <&3

事实上,我得到了基本的 Google html 站点代码:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.es/?gfe_rd=cr&ei=HsiuVafkLpGt8weX7o-YAg
Content-Length: 258
Date: Tue, 21 Jul 2015 22:30:54 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.es/?gfe_rd=cr&amp;ei=HsiuVafkLpGt8weX7o-YAg">here</A>.
</BODY></HTML>

这个技巧对我来说非常有用。例如,我已经成功地使用它来发送Magic Packets(Wake on LAN)(类似例子)。

什么 shell 允许这样做通过使用简单的命令和重定向器将数据直接发送到网络的方法?
当然,除了 Bash。

此信息用于了解这些系统是否具有此功能:

  • 带有嵌入式Linux的路由器
  • 常见的 Android shell。
  • iOS (iPhone/iPad) 外壳。
  • 其他运行某种 Linux 的嵌入式设备(NAS、Compulab 的 Utilite、Odroid...等)。

答案1

这是 ATT ksh93 的一个功能添加在 bash 2.04 中。其他常见 shell 都没有它,特别是在任何 dash 变体、pdksh 或 mksh(截至 2015 年 7 月)、任何 BusyBox 或 Android 变体、或者 zsh 或 Fish 中都找不到它。 Bash 可以在没有此功能的情况下进行编译(请参阅--enable-net-redirections),因此嵌入式设备可能不存在它,即使它们有 bash。

要测试该功能是否存在,您可以检查尝试打开 TCP 端口时的错误消息丢弃服务:bash 和 ksh 都显示“连接被拒绝”(或者如果您的本地计算机上有丢弃服务,则该命令会立即返回),如果不尝试建立某些网络连接,您将看不到该信息。

: </dev/tcp/127.0.0.1/9

这不是一个常见功能的原因之一是,许多网络协议需要双向通信,并仔细处理谁在何时通话,而哪些 shell 对此不太方便。另一个原因是,对于简单的情况,管道涉及网猫,索卡特或者插座也工作。这些程序处理二进制数据,可以是服务器也可以是客户端。大多数可以以简单方式处理的协议都有专门的工具,LAN 唤醒除外。

echo -e "GET / HTTP/1.1\n\n" | nc www.google.com 80

echo -e "GET / HTTP/1.1\n\n" | socat - TCP:www.google.com:80

socket实际上并不能作为 HTTP 客户端工作,因为它不会在输入结束时关闭连接的写入。)

对于脚本编写:

case $(export LANGUAGE=C LC_ALL=C; { : </dev/tcp/127.0.0.1/9; } 2>&1) in
  ""|*"Connection refused"*) echo "/dev/tcp is present";;
  *)
    if type nc >/dev/null 2>/dev/null; then
      echo "netcat is present"
    elif type socat >/dev/null 2>/dev/null; then
      echo "socat is present"
    else
      echo "I can't do TCP"
    fi
esac

1 Zsh 使用 UDP 和 TCP 套接字的方式不同。

相关内容