function __get() { read proto server path <<<$(echo ${1//// }) DOC=/${path// //} HOST=${server//:*} PORT=${server//*:} [[ x"${HOST}" == x"${PORT}" ]] && PORT=80 exec 3<>/dev/tcp/${HOST}/$PORT echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3 (while read line; do [[ "$line" == $'\r' ]] && break done && cat) <&3 exec 3>&- }解释这段脚本
时间: 2024-03-26 16:40:22 浏览: 25
这段脚本是一个 Bash 函数,用于通过 HTTP 协议获取指定 URL 的内容。下面逐行解释每一行代码:
```
function __get() {
```
定义一个名为 `__get` 的 Bash 函数。
```
read proto server path <<<$(echo ${1//// })
```
使用 `read` 命令从函数的第一个参数 `$1` 中解析出 URL 的协议、主机名(包括可选的端口号)和路径部分。`${1//// }` 表示将 `$1` 中的所有 `/` 字符替换为空格,然后 `echo` 命令输出这个字符串。`<<<` 表示将输出作为 `read` 命令的输入,`read` 命令会将输入按照空格分割成三个变量。
```
DOC=/${path// //}
```
将路径部分中的所有空格替换成 `/`,并在路径前面加上一个 `/`,得到标准的 HTTP URL 路径。
```
HOST=${server//:*}
PORT=${server//*:}
```
将主机名和端口号分别保存到 `HOST` 和 `PORT` 变量中。`${server//:*}` 表示将 `server` 中的冒号及其左边的部分替换为空格,`${server//*:}` 表示将 `server` 中的冒号及其右边的部分替换为空格。
```
[[ x"${HOST}" == x"${PORT}" ]] && PORT=80
```
如果 `HOST` 和 `PORT` 相同,则将 `PORT` 设置为 80,即默认的 HTTP 端口号。
```
exec 3<>/dev/tcp/${HOST}/$PORT
```
使用 Bash 的特殊文件 `/dev/tcp` 打开一个 TCP 连接,并将连接的文件描述符 `3` 关联到这个连接。`${HOST}` 和 `${PORT}` 表示主机名和端口号。
```
echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
```
向打开的 TCP 连接写入 HTTP GET 请求,并将请求头中的 `Host` 字段设置为指定的主机名。`-en` 表示允许转义字符,`\r\n` 表示回车和换行符。
```
(while read line; do
[[ "$line" == $'\r' ]] && break
done && cat) <&3
```
从 TCP 连接读取响应,并将其输出到标准输出。`while` 循环读取响应头,遇到一个空行(即 `\r\n\r\n`)就退出循环。然后使用 `cat` 命令读取响应体。这个命令使用了一个子 shell,因为 `cat` 命令的输入需要从文件描述符 `3` 中读取,而文件描述符 `3` 是在子 shell 中打开的。
```
exec 3>&-
```
关闭 TCP 连接,释放文件描述符 `3`。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)