乐于分享
好东西不私藏

从 Bash Shell 下载文件

从 Bash Shell 下载文件

你是否正试图从 Bash 脚本中下载文件,却不知从何入手?让我向你展示如何使用 wget、curl,或者通过Bash 重定向在 shell 脚本中下载文件。
通常你会想使用平台上预装的工具,一般是 wget 或 curl。

wget 简介

GNU Wget 是一个用于从 Web 非交互式下载文件的免费实用程序。它支持 HTTP、HTTPS 和 FTP 协议,以及通过 HTTP 代理进行检索。

一行示例:
wget -O newname.txt http://www.het.brown.edu/guide/UNIX-password-security.txt

curl 简介

curl 是一个使用支持的协议(HTTP、HTTPS、FTP、FTPS、TFTP、DICT、TELNET、LDAP 或 FILE)从服务器传输数据或向服务器传输数据的工具。该命令设计为无需用户交互即可工作。

一行示例:
curl -o newname.txt http://www.het.brown.edu/guide/UNIX-password-security.txt

Bash 重定向

最后,如果你没有 wget、curl 或任何类似的命令行工具,你可以使用一种纯shell 脚本方法,即利用 /dev/tcp 伪设备。自 Bash 版本 2 起,你可以直接打开到给定套接字的 TCP 连接。
`/dev/tcp/HOST/PORT`如果 HOST 是有效的主机名或 Internet 地址,并且 PORT 是整数端口号或服务名称,Bash 会尝试打开到相应套接字的 TCP 连接
下面是一个示例 bash 脚本,演示如何在不使用 wget 或 curl 的情况下从非安全 HTTP 端点下载文件。它定义了一个名为 _get 的 bash 函数,并使用伪设备打开 TCP 连接。为方便起见,你可以将此函数添加到 .bashrc 中。
_get (){  IFS=/ read proto z host query <<< "$1"  exec 3< /dev/tcp/$host/80  {    echo GET /$query HTTP/1.1    echo connection: close    echo host: $host    echo  } >&3   sed '1,/^$/d' <&3 > $(basename $1)}

# 使用示例

[me@linux ~]$ _get http://www.het.brown.edu/guide/UNIX-password-security.txt[me@linux ~]$ lsUNIX-password-security.txt[me@linux ~]$ type _get_get is a function_get ()     IFS=/ read proto z host query <<< "$1";    exec 3< /dev/tcp/$host/80;    {         echo GET /$query HTTP/1.1;        echo connection: close;        echo host: $host;        echo    } 1>&3;    sed '1,/^$/d' 0<&3 > $(basename $1)}