Linux 命令- curl

        curl是Linux系统命令行下用来简单测试web访问的工具,是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载。

命令参数

        curl命令参数很多。

  • -a/–append 上传文件时,附加到目标文件

  • -A:随意指定自己这次访问所宣称的自己的浏览器信息

  • -b/–cookie cookie字符串或文件读取位置,使用option来把上次的cookie信息追加到http request里面去。

  • -c/–cookie-jar 操作结束后把cookie写入到这个文件中

  • -C/–continue-at 断点续转

  • -d/–data HTTP POST方式传送数据

    • –data-ascii 以ascii的方式post数据
    • –data-binary 以二进制的方式post数据
    • –negotiate 使用HTTP身份验证
    • –digest 使用数字身份验证
    • –disable-eprt 禁止使用EPRT或LPRT
    • –disable-epsv 禁止使用EPSV
  • -D/–dump-header 把header信息写入到该文件中

    • –egd-file 为随机数据(SSL)设置EGD socket路径
    • –tcp-nodelay 使用TCP_NODELAY选项
  • -e/–referer 指定引用地址

  • -F/–form 模拟http表单提交数据

    • –form-string 模拟http表单提交数据
  • -G/–get 以get的方式来发送数据

  • -H/–header

    指定请求头参数

    • –ignore-content-length 忽略的HTTP头信息的长度
  • -i/–include 输出时包括protocol头信息

  • -I/–head 仅返回头部信息,使用HEAD请求

  • -k/–insecure 允许不使用证书到SSL站点

  • -K/–config 指定的配置文件读取

  • -l/–list-only 列出ftp目录下的文件名称

    • –limit-rate 设置传输速度
    • –local-port 强制使用本地端口号
  • -m/–max-time 指定处理的最大时长

    • –max-redirs 设置最大读取的目录数
    • –max-filesize 设置最大下载的文件总量
  • -o/–output 指定输出文件名称

  • -O/–remote-name 把输出写到该文件中,保留远程文件的文件名

  • -v/–verbose 小写的v参数,用于打印更多信息,包括发送的请求信息,这在调试脚本是特别有用。

  • -s/–slient 减少输出的信息,比如进度

  • –connect-timeout 指定尝试连接的最大时长

  • -x/–proxy 指定代理服务器地址和端口,端口默认为1080

  • -u/–user 设置服务器的用户和密码

  • -r/–range 检索来自HTTP/1.1或FTP服务器字节范围

    • –range-file 读取(SSL)的随机文件
  • -R/–remote-time 在本地生成文件时,保留远程文件时间

    • –retry 指定重试次数
    • –retry-delay 传输出现问题时,设置重试间隔时间
    • –retry-max-time 传输出现问题时,设置最大重试时间
  • -s/–silent 静默模式。不输出任何东西

  • -S/–show-error 显示错误

    • –socks4 用socks4代理给定主机和端口
    • –socks5 用socks5代理给定主机和端口
    • –stderr
  • -x/–proxy 在给定的端口上使用HTTP代理

  • -X/–request 指定什么命令。curl默认的HTTP动词是GET,使用-X参数可以支持其他动词。

  • -T/–upload-file 指定上传文件路径

命令功能

        curl命令是一个功能强大的网络工具,它能够通过http、ftp等方式下载文件,也能够上传文件,同时支持HTTPS等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息。类似的工具还有wget。curl命令使用了libcurl库来实现,libcurl库常用在C程序中用来处理HTTP请求,curlpp是libcurl的一个C++封装,这几个东西可以用在抓取网页、网络监控等方面的开发,而curl命令可以帮助来解决开发过程中遇到的问题。

常用命令

1.-x指定ip和端口,省略写hosts,方便使用

1
[root@localhost ~]# curl -xip:port www.baidu.com

2.-I可以把当前的内容略掉,只显示状态码,-v可以显示详细过程

1
[root@localhost ~]# curl -Iv http://www.qq.com

3.-u可以指定用户名和密码

1
[root@localhost ~]# curl -u user:password http://123.com

4.-O直接下载页面或者对象

1
[root@localhost ~]# curl http://study.lishiming.net/index.heml -O

5.-o自定义名字

1
[root@localhost ~]# curl -o index2 http://study.lishiming.net/index.heml

使用实例

实例1:读取网页

1
curl http://www.linuxidc.com

实例2:保存网页

-o:将文件保存为命令行中指定的文件名的文件中

1
curl -o page.html http://www.linuxidc.com.html

-O:使用URL中默认的文件名保存文件到本地

1
curl -O http://linuxidc.com.html

其他:可以使用 > 进行输出

1
curl http://www.linuxidc.com > page.html

实例3:使用proxy服务器及其端口:-x

1
curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com

实例4:使用cookie来记录session信息

1
curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

        这个option: -D是把http的response里面的cookie信息存到一个特别的文件中去,

        这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了

实例5:下次访问的时候,使用iption把上次的cookie信息追加到http request里面去:-b

1
curl -x 123.45.6789:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com

实例6:浏览器信息

1
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

实例7:referer

1
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.linuxidc.com

        这样就可以骗对方的服务器,你是从mail.linuxidc.com点击某个连接过来的。

实例8:下载文件

1
2
curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

        -O可以按照服务器上的文件名,自动存在本地

1
curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

实例9:批量下载

1
curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

        这样产生的下载就是:

1
2
3
4
5
6
7
8
~zzh/001.JPG
~zzh/002.JPG
...
~zzh/201.JPG
~nick/001.JPG
~nick/002.JPG
...
~nick/201.JPG

        自定义文件名的批量下载

1
curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

        这样,自定义出来下载下来的文件名就变成了这样:

        原来:~zzh/001.JPG –> 下载后: 001-zzh.JPG 原来: ~nick/001.JPG –> 下载后: 001-nick.JPG

        这样就不怕文件重名了。

实例10:断点续传

1
curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

实例11:使用-r 分块下载

        比如有一个 http://cgi2.tky.2web.ne.jp/~zzh/zhao1.MP3 要下载。就可以用这样的命令:

1
2
3
4
curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\
curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\
curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\
curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3

        这样就可以分块下载了。不过需要自己把这些破碎的文件合并起来,如果用UNIX或者苹果,用 cat zhao.part* > zhao.MP3 就可以了;如果用的windows 用 copy /b 来解决。

实例12:使用FTP协议下载

        上面都是http协议的下载,其实ftp也一样可以用。

1
curl -u name:passwd ftp://ip:port/path/file

        或者

1
curl ftp://name:passwd@ip:port/path/file

实例13:使用-T上传

向ftp传一个文件:

1
curl -T localfile -u name:passwd ftp://upload_site:port/path/

向http服务器上传文件

1
curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi

        注意,这个时候,使用协议是HTTP的PUT method

实例14:POST和GET模式

        说到PUT,自然还有其它几种methos,POST和GET

1
curl http://www.linuxidc.com/login.cgi?user=nickwolfe&password=12345

        POST模式的option是-d

1
curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi

        需要注意的是,POST模式下的文件上传,比如一个HTTP表单,要用curl进行模拟,就该是:

1
curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

实例15:http本地证书

1
curl -E localcert.pem https://remote_server

实例16:使用curl通过dict协议去查字典

1
curl dict://dict.org/d:computer

实例17:获取服务端的信息,比如获取web Server的类型(apache/nginx)以及版本,php的版本等等

1
curl -i http://example.com/

实例18:curl指定用户以及密码访问

        有时候,访问一个网页时是需要认证的,也就是说需要输入正确的用户名以及密码信息,否则会包401的错误

1
curl -u user:password http://www.linuxidc.com/study/

        这样就可以了

实例19:在linux上使用curl访问网站,指定主机IP

        在linux的命令窗口下,无法使用浏览器去浏览网站,但是可以用curl访问html代码。有时,为了指定某个域名的IP,需要写hosts,比较费事。可以临时用curl命令指定一个IP

1
curl www.example.com -x192.168.0.111:80

        用 -x 选项指定主机IP,这种方法类似与IE设置了一个代理服务器。但有时候(访问https时)这样访问不太好用,可以使用:

1
curl -H "Host:www.abc.com" https://192.168.0.111/aaa.txt