更多关于使用 Bash 内置 /dev/tcp 文件 (TCP/IP)

作者:Mitch Frazier

如果您看到了昨天的 技术提示 并且正在寻找更多关于在 bash 中使用 TCP/IP 的信息/dev/tcp 设备文件,请继续阅读。在这里,我们将从套接字读取和写入数据。

在深入之前,让我声明一下,这是基于我在 这里Dave Smith 的博客上发现的。 我在这里所做的只是根据原始帖子的评论添加了一些改进。 我还添加了一些额外的解释。

以下脚本获取 Google 的首页

exec 3<>/dev/tcp/www.google.com/80
echo -e "GET / HTTP/1.1\r\nhost: http://www.google.com\r\nConnection: close\r\n\r\n" >&3
cat <&3

非常简单,只有 3 行。 如果您以前没有见过这种类型的东西,第一行可能会有些令人困惑。 这一行导致文件描述符 3 被打开,用于在指定的 TCP/IP 套接字上进行读写。 这是 exec 的一种特殊形式。exec声明。 来自 bash 手册页

exec [-cl] [-a name] [command [arguments]]

... 如果未指定 command,则任何重定向都在当前 shell 中生效,并且返回状态为 0。

所以使用exec不带命令是打开当前 shell 中文件的一种方式。

套接字打开后,我们使用以下命令将 HTTP 请求发送到套接字:echo ... >&3命令。 请求由以下内容组成:

GET / HTTP/1.1
host: http://www.google.com
Connection: close

每一行都后跟回车符和换行符,所有标头都后跟一个空行,以表示请求结束(这些都是标准的 HTTP 内容)。

接下来,我们使用以下命令从套接字读取响应:cat <&3,它读取响应并将其打印出来。 响应是 Google 的主要 HTML 页面

$ bash tcp.sh
HTTP/1.1 200 OK
Date: Wed, 30 Sep 2009 17:28:36 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=...
Set-Cookie: NID=27=...
Server: gws
X-XSS-Protection: 0
Transfer-Encoding: chunked
Connection: close

fef
<!doctype html><html><head><meta ...

就是这样,只需几行代码,您就可以拥有自己的基于 bash 的浏览器了...好吧,也许不是。

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是 Linux Journal 的贡献者和朋友。

加载 Disqus 评论