代码改变世界

curl工具使用实例

2013-04-12 00:06  bangerlee  阅读(1261)  评论(1编辑  收藏  举报

curl是一个命令行工具,其基于libcurl库,用于发送网络请求,获取并展示响应数据,下面来看curl的具体用法。

 

1.下载网页源码

curl命令直接接URL,用于下载指定URL的网页源码,并将其显示在标准输出上:

# curl http://www.cnblogs.com/bangerlee
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>bangerlee - 博客园</title>
……
</html>

我们可以使用 -o [文件名] 或用重定向将页面源码保存到指定文件。

 

2.仅获取响应的Header信息

我们知道使用HEAD方式的请求,将仅获取http响应的Header信息,使用curl的 -I/--head 选项可以达到仅获取Header的目的:

# curl --head http://www.cnblogs.com
HTTP/1.1 200 OK
Server: Tengine
Date: Thu, 11 Apr 2013 14:59:30 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 45375
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: public, max-age=115
Expires: Thu, 11 Apr 2013 15:01:23 GMT
Last-Modified: Thu, 11 Apr 2013 14:59:23 GMT
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-UA-Compatible: IE=edge

从Header中我们可以了解到对应URL所在服务器的http服务器软件 (Tengine),用什么语言架构 (ASP.NET) 等信息。

 

3.设定跳转

默认情况下,对于返回301、302的响应curl是不会自动跳转的:

# curl http://www.sina.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
</body></html>

以上 www.sina.com 被重定向到 www.sina.com.cn,使用 -L 选项可设置curl跳转到新URL:

# curl -L http://www.sina.com
<!Doctype html>
<!--[30,131,1] published at 2013-04-11 23:25:30 from #150 by system-->
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=gb2312" />
    <title>新浪首页</title>
……
</html>

 

4.显示通信过程

-v 选项用于显示curl与目标服务器的通信过程,列出连接信息和请求信息:

# curl -v http://www.cnblogs.com
* About to connect() to www.cnblogs.com port 80 (#0)
*   Trying 42.121.252.58... connected
* Connected to www.cnblogs.com (42.121.252.58) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0 OpenSSL/0.9.8h zlib/1.2.7 libidn/1.10
> Host: www.cnblogs.com
> Accept: */*

 

5.发送表单信息

我们可以通过GET方式和POST方式向http服务器传送数据,GET方式比较简单:

# curl example/form.cgi?data=xxx

POST方式需把数据和URL分开,这时可用 --data 选项

# curl --data="data=xxx" example/form.cgi

还可以使用 --data-urlencode 选项帮我们完成表单编码:

# curl --data-urlencode="data=xxx" example.com/form.cgi

 

6.下载和上传ftp文件

以上介绍了一些http协议下curl的用例,curl也可用于ftp等文件传输协议,以下命令就用于下载ftp文件:

# curl -u ftpuser:ftppass -o a.text ftp://ftp_server/public_html/a.text

以下命令列出ftp目录下的文件列表:

# curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

以下命令可上传文件至ftp服务器:

# curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

 

7.查字典

基于DICT协议,curl还有个有趣的应用,我们可以用curl来查字典:

# curl dict://dict.org/d:banger
220 pan.alephnull.com dictd 1.12.0/rf on Linux 3.0.0-14-server <auth.mime> <3451806.3373.1365696256@pan.alephnull.com>
250 ok
150 1 definitions retrieved
151 "banger" wn "WordNet (r) 3.0 (2006)"
banger
    n 1: (British informal) pork sausage
    2: firework consisting of a small explosive charge and fuse in a
       heavy paper casing [syn: {firecracker}, {cracker}, {banger}]
.
250 ok [d/m/c = 1/0/31; 0.000r 0.000u 0.000s]
221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]