摘自 Linux Shell 脚本攻略 第五章 一团乱麻?没这回事!
Web 页面下载
用wget可以下载Web页面或远程文件
$ wget knopper.net
--2021-11-23 20:37:27-- http://knopper.net/
Resolving knopper.net (knopper.net)... 81.169.229.18
Connecting to knopper.net (knopper.net)|81.169.229.18|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7657 (7.5K) [text/html]
Saving to: ‘index.html’
index.html 100%[=====================================================================================================================>] 7.48K --.-KB/s in 0s
2021-11-23 20:37:28 (81.0 MB/s) - ‘index.html’ saved [7657/7657]
你可以通过选项-O指定输出文件名
$ wget http://www.knopper.net -O knopper.html
--2021-11-23 20:38:27-- http://www.knopper.net/
Resolving www.knopper.net (www.knopper.net)... 81.169.229.18
Connecting to www.knopper.net (www.knopper.net)|81.169.229.18|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7657 (7.5K) [text/html]
Saving to: ‘knopper.html’
knopper.html 100%[=====================================================================================================================>] 7.48K --.-KB/s in 0s
2021-11-23 20:38:28 (311 MB/s) - ‘knopper.html’ saved [7657/7657]
也可以用选项-o指定一个日志文件
$ wget http://www.knopper.net -O knopper.html -o log
选项-t可以指定在放弃下载之前尝试多少次
$ wget -t 5 URL
# 将-t选项的值设为0会强制wget不断地进行重试
$ wget -t 0 URL
下载限速
- 选项–limit-rate可以限定下载任务能够占有的最大 带宽
$ wget --limit-rate 20k http://10.18.7.30/res/apk/Camera2.apk
--2021-11-23 21:14:32-- http://10.18.7.30/res/apk/Camera2.apk
Connecting to 10.18.7.30:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4278821 (4.1M) [application/octet-stream]
Saving to: ‘Camera2.apk’
Camera2.apk 2%[=> ] 96.00K 20.0KB/s eta 3m 25s
- 选项–quota或-Q可以指定最大下载配额(quota)
$ wget -Q 100m http://10.18.7.30/res/apk/Camera2.apk
--2021-11-23 21:16:09-- http://10.18.7.30/res/apk/Camera2.apk
Connecting to 10.18.7.30:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4278821 (4.1M) [application/octet-stream]
Saving to: ‘Camera2.apk.1’
Camera2.apk.1 100%[=====================================================================================================================>] 4.08M --.-KB/s in 0.05s
2021-11-23 21:16:09 (87.0 MB/s) - ‘Camera2.apk.1’ saved [4278821/4278821]
断点续传
$ wget --limit-rate 100k http://10.18.7.30/res/apk/Camera2.apk
--2021-11-23 21:17:38-- http://10.18.7.30/res/apk/Camera2.apk
Connecting to 10.18.7.30:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4278821 (4.1M) [application/octet-stream]
Saving to: ‘Camera2.apk’
Camera2.apk 12%[=============> ] 525.21K 100KB/s eta 37s ^C
# 这次下载从12% 开始
amlogic@amlogic-ThinkCentre-M930t-N000:~/coco$ wget -c --limit-rate 100k http://10.18.7.30/res/apk/Camera2.apk
--2021-11-23 21:17:57-- http://10.18.7.30/res/apk/Camera2.apk
Connecting to 10.18.7.30:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 4278821 (4.1M), 3716429 (3.5M) remaining [application/octet-stream]
Saving to: ‘Camera2.apk’
Camera2.apk 29%[+++++++++++++++===================> ] 1.22M 100KB/s eta 30s ^C
复制整个网站(镜像)
$ wget --mirror --convert-links exampledomain.com
# 或者
$ wget -r -N -l -k DEPTH URL
访问需要认证的HTTP或FTP页面
$ wget --user username --password pass URL
也可以不在命令行中指定密码,而是在网页上手动输入密码,这就需要将–password改为
–ask-password
以纯文本形式下载页面
lynx命令默认并没有安装在各种发行版中,不过可以通过包管理器来获取
sudo apt-get install lynx
选项-dump能够以纯ASCII编码的形式下载Web页面
$ lynx -dump http://10.18.7.30/res/apk/ > webpage_as_text.txt
$ cat webpage_as_text.txt
Index of /res/apk/
__________________________________________________________________
[1]../
[2]Camera2.apk 22-Oct-2021 11:13 4M
[3]DemoCamera-20210330.apk 22-Oct-2021 11:13 277K
[4]ExoPlayer_lab126_v2.4.8_signed.apk 22-Oct-2021 11:13 6M
[5]KeyMonitor.apk 22-Oct-2021 11:13 17K
[6]PFXStress.apk 22-Oct-2021 11:13 14M
[7]SHCMCCX_Tailor.apk 22-Oct-2021 11:13 5M
[8]SHCMCCX_Test-0427.apk 22-Oct-2021 11:13 5M
[9]TvSettings.apk 22-Oct-2021 11:13 10M
[10]V1.6.4.3-20210426.apk 22-Oct-2021 11:13 13M
[11]WasuTV5.0_cmcc_5.0.0.52_202012181413_signed_sig..> 22-Oct-2021 11:13 21M
[12]WifiTests-debug.apk 11-Nov-2021 02:38 1M
[13]antutu-benchmark-v573.apk 22-Oct-2021 11:13 15M
[14]antutu-v5-3d-plugin.apk 22-Oct-2021 11:13 22M
[15]app-debug-androidTest.apk 22-Oct-2021 11:13 1M
[16]app-debug.apk 22-Oct-2021 11:13 87M
[17]app-uiautomator-test.apk 22-Oct-2021 11:13 1M
[18]app-uiautomator.apk 22-Oct-2021 11:13 2M
[19]iperf.apk 22-Oct-2021 11:13 786K
__________________________________________________________________
References
1. http://10.18.7.30/res/
2. http://10.18.7.30/res/apk/Camera2.apk
3. http://10.18.7.30/res/apk/DemoCamera-20210330.apk
4. http://10.18.7.30/res/apk/ExoPlayer_lab126_v2.4.8_signed.apk
5. http://10.18.7.30/res/apk/KeyMonitor.apk
6. http://10.18.7.30/res/apk/PFXStress.apk
7. http://10.18.7.30/res/apk/SHCMCCX_Tailor.apk
8. http://10.18.7.30/res/apk/SHCMCCX_Test-0427.apk
9. http://10.18.7.30/res/apk/TvSettings.apk
10. http://10.18.7.30/res/apk/V1.6.4.3-20210426.apk
11. http://10.18.7.30/res/apk/WasuTV5.0_cmcc_5.0.0.52_202012181413_signed_signed.apk
12. http://10.18.7.30/res/apk/WifiTests-debug.apk
13. http://10.18.7.30/res/apk/antutu-benchmark-v573.apk
14. http://10.18.7.30/res/apk/antutu-v5-3d-plugin.apk
15. http://10.18.7.30/res/apk/app-debug-androidTest.apk
16. http://10.18.7.30/res/apk/app-debug.apk
17. http://10.18.7.30/res/apk/app-uiautomator-test.apk
18. http://10.18.7.30/res/apk/app-uiautomator.apk
19. http://10.18.7.30/res/apk/iperf.apk
cURL 入门
cURL可以使用HTTP、HTTPS、FTP协议在客户端与服务器之间传递数据。它支持POST、 cookie、认证、从指定偏移处下载部分文件、参照页(referer)、用户代理字符串、扩展头部、限 速、文件大小限制、进度条等特性。cURL可用于网站维护、数据检索以及服务器配置核对
使用下列命令将下载的文件输出到stdout
$ curl URL
选项-O指明将下载数据写入文件
# 如果不想显示进度信 息,可以使用--silent选项
$ curl www.knopper.net/index.htm --silent -O
选项-o可以指定输出文件名。如果使用了该选项,只需要写明站点的域名就可以下载其 主页了
$ curl www.knopper.net -o knoppix_index.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7657 100 7657 0 0 9680 0 --:--:-- --:--:-- --:--:-- 9667
如果需要在下载过程中显示形如#的进度条,可以使用选项–progress-bar
$ curl http://knopper.net -o index.html --progress-bar
############################################################################################################################################################################################################ 100.0%
断点续传
curl URL/file -C offset
偏移量是以字节为单位的整数。如果只是想断点续传,那么cURL不需要指定准确的字节偏 移。要是你希望cURL推断出正确的续传位置,请使用选项-C -,就像这样
$ curl -C - URL
用cURL设置参照页字符串
可以用curl命令的 --referer选项指定参照页字符串
$ curl --referer Referer_URL target_URL
$ curl --referer http://google.com http://knopper.org
用cURL设置cookie
选项–cookieCOOKIE_IDENTIFER可以指定提供哪些cookie。cookies需要以name=value 的形式来给出。多个cookie之间使用分号分隔
$ curl http://example.com --cookie "user=username;pass=hack"
# 选项--cookie-jar可以将cookie另存为文件
$ curl URL --cookie-jar cookie_file
用cURL设置用户代理字符串
cURL的选项–user-agent或-A用于设置用户代理
$ curl URL --user-agent "Mozilla/5.0"
# cURL也能够发送其他HTTP头部信息。使用-H "Header"传递多个头部信息
$ curl -H "Host: www.knopper.net" -H "Accept-language: en" URL
限定cURL可占用的带宽
$ curl URL --limit-rate 20k
指定最大下载量
$ curl URL --max-filesize bytes
如果文件大小超出限制,命令返回一个非0的退出码。如果文件下载成功, 则返回0
用cURL进行认证
可以用curl的选项-u完成HTTP或FTP认证。
使用-u username:password来指定用户名和密码
$ curl -u user:pass http://test_auth.com
如果你喜欢经提示后输入密码,只需要使用用户名即可
$ curl -u user http://test_auth.com
只打印响应头部信息(不包括数据部分)
选项-I或–head可以只打印HTTP头部信息,无须下载远程文件
$ curl -I http://knopper.net
HTTP/1.1 200 OK
Date: Tue, 08 Nov 2016 17:15:21 GMT
Server: Apache
Last-Modified: Wed, 26 Oct 2016 23:29:56 GMT
ETag: "1d3c8-1af3-b10500"
Accept-Ranges: bytes
Content-Length: 6899
Content-Type: text/html; charset=ISO-8859-1
从命令行访问未读的Gmail邮件
来看下面这个脚本文件,它的作用是通过解析Gmail的RSS feed来显示未读的邮件
以下代码未运行,只做摘抄
#!/bin/bash
#用途: Gmail邮件读取工具
username='PUT_USERNAME_HERE'
password='PUT_PASSWORD_HERE'
SHOW_COUNT=5 # 需要显示的未读邮件数量
echo
curl -u $username:$password --silent \
"https://mail.google.com/mail/feed/atom" | \
tr -d '\n' | sed 's:</entry>:\n:g' |\
sed -n
's/.*<title>\(.*\)<\/title.*<author><name>\([^<]*\)<\/name><email> \([^<]*\).*/From: \2 [\3] \nSubject: \1\n/p' | \
head -n $(( $SHOW_COUNT * 3 ))
cURL使用-u user: pass所提供的用户认证信息来读入RSS feed。如果只用了-u user,
cURL在运行时会要求输入密码
tr -d '\n’移除了所有的换行符
sed 's::\n:g’将每一处替换成换行符,以保证每一条邮件项独立成行,以便逐行解析邮件
该脚本接下来的部分作为sed的单个表达式执行,用于提取相关字段
sed ‘s/.
脚本用
Author: \2 [\3] \nSubject: \1\n
\1对应于第一处匹配(邮件标题),\2对应于第二处匹配(发件人姓名),以此类推
SHOW_COUNT=5用来设置需要在终端中显示的未读邮件数量
head用来显示SHOW_COUNT*31行文本。SHOW_COUNT乘以3是因为每一封未读邮件的相关信息需要占用3行