linux curl 是通过 url 语法在命令行下上传或下载文件的工具软件, 它支持 http,https,ftp,ftps,telnet 等多种协议, 常被用来抓取网页和监控 web 服务器状态.
在 Linux 中 curl 是一个利用 URL 规则在命令行下工作的文件传输工具, 可以说是一款很强大的 http 命令行工具. 它支持文件的上传和下载, 是综合传输工具, 但按传统, 习惯称 url 为下载工具.
-A/--user-agent <string> 设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie 字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把 cookie 写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把 header 信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示 http 错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中, 保留远程文件的文件名
-r/--range <range> 检索来自 HTTP/1.1 或 FTP 服务器字节范围
-s/--silent 静音模式. 不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用 HTTP 代理
-#/--progress-bar 进度条显示当前的传送状态
例子:
1, 基本用法
# curl http://www.linux.com
执行后, www.linux.com 的 html 就会显示在屏幕上了
Ps: 由于安装 linux 的时候很多时候是没有安装桌面的, 也意味着没有浏览器, 因此这个方法也经常用于测试一台服务器是否可以到达一个网站
2, 保存访问的网页
2.1: 使用 linux 的重定向功能保存
# curl http://www.linux.com>> linux.html
2.2: 可以使用 curl 的内置 option:-o(小写) 保存网页
$ curl -o linux.html http://www.linux.com
执行完成后会显示如下界面, 显示 100% 则表示保存成功
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 79684 0 79684 0 0 3437k 0 --:--:-- --:--:-- --:--:-- 7781k
2.3: 可以使用 curl 的内置 option:-O(大写) 保存网页中的文件
要注意这里后面的 url 要具体到某个文件, 不然抓不下来
# curl -O http://www.linux.com/hello.sh
3, 测试网页返回值
# curl -o /dev/null -s -w %{http_code} www.linux.com
Ps: 在脚本中, 这是很常见的测试网站是否正常的用法
4, 指定 proxy 服务器以及其端口
很多时候上网需要用到代理服务器 (比如是使用代理服务器上网或者因为使用 curl 别人网站而被别人屏蔽 IP 地址的时候), 幸运的是 curl 通过使用内置 option:-x 来支持设置代理
- # curl -x 192.168.100.100:1080 http://www.linux.com
- 5,cookie
有些网站是使用 cookie 来记录 session 信息. 对于 chrome 这样的浏览器, 可以轻易处理 cookie 信息, 但在 curl 中只要增加相关参数也是可以很容易的处理 cookie
5.1: 保存 http 的 response 里面的 cookie 信息. 内置 option:-c(小写)
# curl -c cookiec.txt http://www.linux.com
执行后 cookie 信息就被存到了 cookiec.txt 里面了
5.2: 保存 http 的 response 里面的 header 信息. 内置 option: -D
# curl -D cookied.txt http://www.linux.com
执行后 cookie 信息就被存到了 cookied.txt 里面了
注意:-c(小写) 产生的 cookie 和 - D 里面的 cookie 是不一样的.
5.3: 使用 cookie
很多网站都是通过监视你的 cookie 信息来判断你是否按规矩访问他们的网站的, 因此我们需要使用保存的 cookie 信息. 内置 option: -b
# curl -b cookiec.txt http://www.linux.com
6, 模仿浏览器
有些网站需要使用特定的浏览器去访问他们, 有些还需要使用某些特定的版本. curl 内置 option:-A 可以让我们指定浏览器去访问网站
# curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
这样服务器端就会认为是使用 IE8.0 去访问的
7, 伪造 referer(盗链)
很多服务器会检查 http 访问的 referer 从而来控制访问. 比如: 你是先访问首页, 然后再访问首页中的邮箱页面, 这里访问邮箱的 referer 地址就是访问首页成功后的页面地址, 如果服务器发现对邮箱页面访问的 referer 地址不是首页的地址, 就断定那是个盗连了
curl 中内置 option:-e 可以让我们设定 referer
# curl -e "www.linux.com" http://mail.linux.com
这样就会让服务器其以为你是从 www.linux.com 点击某个链接过来的
8, 下载文件
8.1: 利用 curl 下载文件.
- # 使用内置 option:-o(小写)
- # curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
- # 使用内置 option:-O(大写)
- # curl -O http://www.linux.com/dodo1.JPG
这样就会以服务器上的名称保存文件到本地
8.2: 循环下载
有时候下载图片可以能是前面的部分名称是一样的, 就最后的尾椎名不一样
# curl -O http://www.linux.com/dodo[1-5].JPG
这样就会把 dodo1,dodo2,dodo3,dodo4,dodo5 全部保存下来
8.3: 下载重命名
# curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG
由于下载的 hello 与 bb 中的文件名都是 dodo1,dodo2,dodo3,dodo4,dodo5. 因此第二次下载的会把第一次下载的覆盖, 这样就需要对文件进行重命名.
# curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG
这样在 hello/dodo1.JPG 的文件下载下来就会变成 hello_dodo1.JPG, 其他文件依此类推, 从而有效的避免了文件被覆盖
8.4: 分块下载
有时候下载的东西会比较大, 这个时候我们可以分段下载. 使用内置 option:-r
- # curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG
- # curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG
- # curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG
- # cat dodo1_part*> dodo1.JPG
这样就可以查看 dodo1.JPG 的内容了
8.5: 通过 ftp 下载文件
curl 可以通过 ftp 下载文件, curl 提供两种从 ftp 中下载的语法
- # curl -O -u 用户名: 密码 ftp://www.linux.com/dodo1.JPG
- # curl -O ftp:// 用户名: 密码 @www.linux.com/dodo1.JPG
8.6: 显示下载进度条
# curl -# -O http://www.linux.com/dodo1.JPG
8.7: 不会显示下载进度信息
# curl -s -O http://www.linux.com/dodo1.JPG
9, 断点续传
在 windows 中, 我们可以使用迅雷这样的软件进行断点续传. curl 可以通过内置 option:-C 同样可以达到相同的效果
如果在下载 dodo1.JPG 的过程中突然掉线了, 可以使用以下的方式续传
# curl -C -O http://www.linux.com/dodo1.JPG
10, 上传文件
curl 不仅仅可以下载文件, 还可以上传文件. 通过内置 option:-T 来实现
# curl -T dodo1.JPG -u 用户名: 密码 ftp://www.linux.com/img/
这样就向 ftp 服务器上传了文件 dodo1.JPG
11, 显示抓取错误
# curl -f http://www.linux.com/error
1. linux curl 抓取网页:
抓取百度:
curl http://www.baidu.com
如发现乱码, 可以使用 iconv 转码
curl http://iframe.ip138.com/ic.asp|iconv -fgb2312
iconv 的用法请参阅: 在 Linux/Unix 系统下用 iconv 命令处理文本文件中文乱码问题
2. Linux curl 使用代理:
linux curl 使用 http 代理抓取页面:
- curl -x 111.95.243.36:80 http://iframe.ip138.com/ic.asp|iconv -fgb2312
- curl -x 111.95.243.36:80 -U aiezu:password http://www.baidu.com
使用 socks 代理抓取页面:
- curl --socks4 202.113.65.229:443 http://iframe.ip138.com/ic.asp|iconv -fgb2312
- curl --socks5 202.113.65.229:443 http://iframe.ip138.com/ic.asp|iconv -fgb2312
代理服务器地址可以从爬虫代理上获取.
3. linux curl 处理 cookies
接收 cookies:
curl -c /tmp/cookies http://www.baidu.com #cookies 保存到 / tmp/cookies 文件
发送 cookies:
- curl -b "key1=val1;key2=val2;" http://www.baidu.com #发送 cookies 文本
- curl -b /tmp/cookies http://www.baidu.com #从文件中读取 cookies
4. linux curl 发送数据:
linux curl get 方式提交数据:
curl -G -d "name=value&name2=value2" http://www.baidu.com
linux curl post 方式提交数据:
- curl -d "name=value&name2=value2" http://www.baidu.com #post 数据
- curl -d a=b&c=d&txt@/tmp/txt http://www.baidu.com #post 文件
以表单的方式上传文件:
curl -F file=@/tmp/me.txt http://www.aiezu.com
相当于设置 form 表单的 method="POST" 和 enctype='multipart/form-data'两个属性.
5. linux curl http header 处理:
设置 http 请求头信息:
- curl -A "Mozilla/5.0 Firefox/21.0" http://www.baidu.com #设置 http 请求头 User-Agent
- curl -e "http://pachong.org/" http://www.baidu.com #设置 http 请求头 Referer
- curl -H "Connection:keep-alive \n User-Agent: Mozilla/5.0" http://www.aiezu.com
设置 http 响应头处理:
- curl -I http://www.aiezu.com #仅仅返回 header
- curl -D /tmp/header http://www.aiezu.com #将 http header 保存到 / tmp/header 文件
6. linux curl 认证:
- curl -u aiezu:password http://www.aiezu.com #用户名密码认证
- curl -E mycert.pem https://www.baidu.com #采用证书认证
6. 其他:
- curl -# http://www.baidu.com #以 "#" 号输出进度条
- curl -o /tmp/aiezu http://www.baidu.com #保存 http 响应到 / tmp/aiezu
linux 使用 curl 小经验教训:
http 请求地址的 url 要使用 "" 括起来. 当有存在多个参数使用 & 连接时可能会出错.
9, 伪造来源地址, 有的网站会判断, 请求来源地址.
- [root@krlcgcms01 mytest]# curl -e http://localhost http://blog.51yip.com/wp-login.php
- [root@krlcgcms01 mytest]# curl -e http://localhost http://blog.51yip.com/wp-login.php
10, 当我们经常用 curl 去搞人家东西的时候, 人家会把你的 IP 给屏蔽掉的, 这个时候, 我们可以用代理
- [root@krlcgcms01 mytest]# curl -x 24.10.28.84:32779 -o home.html http://blog.51yip.com
- [root@krlcgcms01 mytest]# curl -x 24.10.28.84:32779 -o home.html http://blog.51yip.com
11, 比较大的东西, 我们可以分段下载
- [root@krlcgcms01 mytest]# curl -r 0-100 -o img.part1 http://blog.51yip.com/wp-
- content/uploads/2010/09/compare_varnish.jpg
12, 不会显示下载进度信息
[root@krlcgcms01 mytest]# curl -s -o aaa.jpg
13, 显示下载进度条
- [root@krlcgcms01 mytest]# curl -# -O
- ######################################################################## 100.0%
14, 通过 ftp 下载文件
[zhangy@BlackGhost ~]$ curl -u 用户名: 密码 -O http://blog.51yip.com/demo/curtain/bbstudy_files/style.CSS
[zhangy@BlackGhost ~]$ curl -O ftp:// 用户名: 密码 @ip:port/demo/curtain/bbstudy_files/style.css
15, 通过 ftp 上传
- [zhangy@BlackGhost ~]$ curl -T test.sql ftp:// 用户名: 密码 @ip:port/demo/curtain/bbstudy_files/
- [zhangy@BlackGhost ~]$ curl -T test.sql ftp:// 用户名: 密码 @ip:port/demo/curtain/bbstudy_files/
来源: http://www.bubuko.com/infodetail-2655523.html