curl

curl

Linux curl命令使用代理、以及代理种类介绍

Linuxliuliangsong 发表了文章 • 0 个评论 • 622 次浏览 • 2016-12-07 11:40 • 来自相关话题

  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  一、代理服务器分类:  我们比较常用、支持http(s)协议代理主要分为两大类:http代理和socks代理,见下表:大类小类子类描述http代理http代理
https代理透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议只支持TCP应用;SOCKS4A支持TCP应用;支持服务器端域名解析;SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6; 二、Linux curl命令代理设置参数:  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:参数用法-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;
 三、Linux curl命令设置代理举例:1、linux curl命令设置http代理:# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php 2、Linux curl命令设置socks代理:#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php 四、测试代理的隐匿度:1、测试前准备:  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  2、测试使用不同代理输出结果:  ①.  通过linux curl不使用代理访问:[root@aiezu.com ~]# curl http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.112.104.126
)  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理。

  ④. 通过linux curl命令使用http高匿名代理访问:[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 114.232.1.13
)  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理。
  
  ④. 通过linux curl命令使用socks5代理访问:[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php
Array
(
[REMOTE_ADDR] => 180.96.54.198
)  可以看出此SOCKS5代理也是高匿名代理。
  五、附录:Linux curl命令详解 查看全部
  有时出于个人隐私的原因,我们希望隐藏自己的IP,让http服务器无法记录我们访问过它,这时我们可以使用代理服务器。
  代理服务器(Proxy Server)是工作在浏览器与http服务器之间的一个服务应用,所有经过代理服务器的http请求,都会被转发到对应的http服务器上。
  当然,除了http可以使用代理外,https、ftp、RTSP、pop3等协议同样可以使用代理访问,不过本文介绍的是支持http、https协议访问的代理。
  

一、代理服务器分类:

  我们比较常用、支持http(s)协议代理主要分为两大类:http代理socks代理,见下表:
大类小类子类描述
http代理http代理
https代理
透明代理http服务器知道浏览器端使用了代理,并能获取浏览器端原始IP;
匿名代理http服务器知道浏览器端使用了代理,但无法获取浏览器端原始IP;
高匿名代理http服务器不知道浏览器端使用了代理,且无法获取浏览器端原始IP;
SOCKS代理SOCKS4被称为全能代
理,支持http
和其他协议
只支持TCP应用;
SOCKS4A支持TCP应用;支持服务器端域名解析;
SOCKS5支持TCP和UDP应用;支持服务器端域名解析;
支持多种身份验证;支持IPV6;
 

二、Linux curl命令代理设置参数:

  linux curl命令可以使用下面参数设置http(s)代理、socks代理,已经设置它们的用户名、密码以及认证方式:
参数用法
-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U <user:password>
--proxy-user <user:password>
设置代理的用户名和密码;

 

三、Linux curl命令设置代理举例:

1、linux curl命令设置http代理:

# 指定http代理IP和端口
curl -x 113.185.19.192:80 http://aiezu.com/test.php
curl --proxy 113.185.19.192:80 http://aiezu.com/test.php

#指定为http代理
curl -x http_proxy://113.185.19.192:80 http://aiezu.com/test.php

#指定为https代理
curl -x HTTPS_PROXY://113.185.19.192:80 http://aiezu.com/test.php

#指定代理用户名和密码,basic认证方式
curl -x aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
curl -x 113.185.19.192:80 -U aiezu:123456 http://aiezu.com/test.php
curl -x 113.185.19.192:80 --proxy-user aiezu:123456 http://aiezu.com/test.php

#指定代理用户名和密码,ntlm认证方式
curl -x 113.185.19.192:80 -U aiezu:123456 --proxy-ntlm http://aiezu.com/test.php

#指定代理协议、用户名和密码,basic认证方式
curl -x http_proxy://aiezu:123456@113.185.19.192:80 http://aiezu.com/test.php
 

2、Linux curl命令设置socks代理:

#使用socks4代理,无需认证方式
curl --socks4 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks4a代理,无需认证方式
curl --socks4a 122.192.32.76:7280 http://aiezu.com/test.php
curl -x socks4a://122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式
curl --socks5 122.192.32.76:7280 -U aiezu:123456 http://aiezu.com/test.php
curl -x socks5://aiezu:123456@122.192.32.76:7280 http://aiezu.com/test.php

#使用socks5代理,basic认证方式,ntlm认证方式
curl -x socks5://aiezu:123456@122.192.32.76:7280 --proxy-ntlm http://aiezu.com/test.php
 

四、测试代理的隐匿度:

1、测试前准备:

  测试前,我们先在网站根目录也一个php页面“test.php”,用于输出http服务器接收到的访客IP地址信息,"test.php"测试页的代码如下:
<?php
$array = array('HTTP_USER_AGENT', 'HTTP_HOST', 'HTTP_ACCEPT', 'PATH', 'SERVER_SIGNATURE', 'SERVER_SOFTWARE', 'SERVER_NAME', 'SERVER_ADDR', 'SERVER_PORT', 'DOCUMENT_ROOT', 'SERVER_ADMIN', 'SCRIPT_FILENAME', 'REMOTE_PORT', 'GATEWAY_INTERFACE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'QUERY_STRING', 'REQUEST_URI', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_TIME');
// 将 $_SERVER 数组赋予 $srv数组;
$srv = $_SERVER;
// 释放掉 $srv中不相关的键
foreach($array as $name ) {
unset($srv[ $name ]);
}
print_r($srv);
  保存好"test.php"后,然后我们通过不用代理,和使用透明代理、匿名代理、高匿名代理、SOCKS分别去访问,看页面输出的内容结果。
  

2、测试使用不同代理输出结果:

  ①.  通过linux curl不使用代理访问:
[root@aiezu.com ~]# curl http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.112.104.126
)
  可以看出,http服务器获取到的"REMOTE_ADDR"IP地址为"114.112.104.126",此IP地址就是客户端lcurl的真实IP地址。 
 
  ②. 通过linux curl命令使用http透明代理访问:
[root@aiezu.com ~]# curl -x 37.139.9.11:80 http://aiezu.com/test.php 
Array
(
[HTTP_VIA] => 1.1 ThunderVPN (squid/3.3.8)
[HTTP_X_FORWARDED_FOR] => 114.112.104.126
[HTTP_CACHE_CONTROL] => max-age=259200
[HTTP_CONNECTION] => keep-alive
[REMOTE_ADDR] => 37.139.9.11
)
  可以看出REMOTE_ADDR字段变成了代理服务器的IP地址,同时真实IP地址也能从HTTP_X_FORWARDED_FOR字段获取到,还多了一个“HTTP_VIA”字段,可以看出出代理并不能隐藏真实IP,而且也会让http服务器自动浏览器端使用了代理。
 
  ③. 通过linux curl命令使用http匿名代理访问:
[root@aiezu.com ~]# curl -x 60.21.209.114:8080 http://aiezu.com/test.php 
Array
(
[HTTP_PROXY_CONNECTION] => Keep-Alive
[REMOTE_ADDR] => 60.21.209.114
)
  从上面可以看出,REMOTE_ADDR字段变成了代理服务器的IP地址,而且在响应不包含原来的真实IP地址,但是多了HTTP_PROXY_CONNECTION,能判断出使用了代理,得出结论此浏览器客户端使用了匿名代理

  ④. 通过linux curl命令使用http高匿名代理访问:
[root@aiezu.com ~]# curl -x 114.232.1.13:8088 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 114.232.1.13
)
  这次我们惊奇的发现,REMOTE_ADDR同样变成了代理的IP地址,同时不留下任何残留证据证明使用了代理,可以得出结论,这就是传说中的高匿名代理
  
  ④. 通过linux curl命令使用socks5代理访问:
[root@aiezu.com ~]# curl --socks5 122.192.32.76:7280 http://aiezu.com/test.php 
Array
(
[REMOTE_ADDR] => 180.96.54.198
)
  可以看出此SOCKS5代理也是高匿名代理。
  

五、附录:

Linux curl命令http cookie详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 143 次浏览 • 2016-12-07 08:35 • 来自相关话题

  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 一、Linux curl命令Cookie的接收:1、cookie接收原理:  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:


  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 2、linux curl命令接收cookie(-c):  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98 二、Linux curl命令发送Cookie:1、cookie发送原理和从cookie文件中发送:  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:<?php print_r($_COOKIE);  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 3、linux curl命令使用"-H"参数发送cookie:  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php
Array
(
[uid] => 999
[sex] => 2
) 三、附录:Linux curl命令详解
  查看全部
  Http Cookie在Http协议中是非常实用的功能、可以保留网站的一些会话信息,方便用户下次再次来到本网站时使用;如在cookie中记录用户的性别和姓氏、下次用户再次到来,即使未登录,也可以根据获取到的cookie显示“欢迎X先生/女士再次光临本站”类似的欢迎标语;也可以在cookie中记录用户的用户名,下次用户登陆时就不在需要输入用户名,提高便捷度。
 

一、Linux curl命令Cookie的接收:

1、cookie接收原理:

  在介绍接收cookie之前,先来看看cookie是从http 服务器怎么发送过来的。我们先在站点根目录下写一个写cookie的脚本“test.php”,内容一下:
<?php
// 性别: 2(女);有效期1年后;只对aiezu.com有效
setcookie("sex", 2, time()+3600*24*365, '', 'aiezu.com');

// 姓氏: 刘;有效期1年后;只对aiezu.com有效
setcookie("surname", '刘', time()+3600*24*365, '', 'aiezu.com');
  然后运行“curl -I http://aiezu.com/test.php”命令,看到的http响应头如下:
linux_curl_http_header_cookie.png
  可以看出,http协议是通过http头将cookie信息发送给浏览器的,其中汉字是经过URL Encode的。
 

2、linux curl命令接收cookie(-c):

  curl命令可以使用"-c"或者"--cookie-jar"选项将http服务器发送过来的cookie保存到指定文件或者输出;更多的linux curl命令参数介绍请参考:Linux curl命令详解页面介绍;这里我们将cookie保存到"cookie.txt"文件。
[root@aiezu.com ~]# curl --cookie-jar cookie.txt http://aiezu.com/test.php
[root@aiezu.com ~]# cat cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.aiezu.com TRUE / FALSE 1512612268 sex 2
.aiezu.com TRUE / FALSE 1512612268 surname %E5%88%98
 

二、Linux curl命令发送Cookie:

1、cookie发送原理和从cookie文件中发送:

  在介绍发送cookie之前,这次来看看cookie是怎么发送到http 服务器的。先将站点根目录下的"test.php"改成如下,内容就简单的一行,用于输出http服务器接收到的cookie数组内容:
<?php print_r($_COOKIE);
  然后使用linux curl命令的"-b"参数,发送我们在第一步保存到文件的cookie,再加一个“-v”参数来显示详细信息:
[root@aiezu.com ~]# curl -b @cookie.txt http://aiezu.com/test.php -v
* About to connect() to aiezu.com port 80 (#0)
* Trying 120.26.62.49...
* Connected to aiezu.com (120.26.62.49) port 80 (#0)
> GET /test.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: aiezu.com
> Accept: */*
> Cookie: surname=%E5%88%98; sex=2
>
< HTTP/1.1 200 OK
< Date: Wed, 07 Dec 2016 02:33:28 GMT
< Server: Apache
< Cache-Control: max-age=315360000
< Expires: Sat, 05 Dec 2026 02:33:28 GMT
< Vary: Accept-Encoding
< Content-Length: 46
< Content-Type: text/html; charset=utf-8
<
Array
(
[surname] => 刘
[sex] => 2
)
* Connection #0 to host aiezu.com left intact
  在上面信息第9行http请求头中看到了我们发送cookie的key/value,可见cookie是通过http请求头发送到http服务器的。那为什么只发送key/value,没有发送有效时间和有效域名呢?因为时间、域名判断cookie是否发送的判断条件,只有当某一条cookie属于此域名、并且cookie还在有效时间内,此条cookie才会发送;判断完后,时间和域名就没发送的必要了。
 

2、linux curl命令使用"-b"、"--cookie"参数直接发送cookiekey/value对:

  linux curl命令可以使用"-c"或者“--cookie”参数直接发送cookie键值对,两个参数的意义相同:
[root@aiezu.com ~]# curl -b "uid=999;sex=2" http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

3、linux curl命令使用"-H"参数发送cookie:

  既然cookie是通过http请求头发送的,当然可以使用"-H"参数来为http请求头添加cookie键值来发送cookie:
[root@aiezu.com ~]# curl -H "Cookie: uid=999;sex=2" --cookie a=9 http://aiezu.com/test.php 
Array
(
[uid] => 999
[sex] => 2
)
 

三、附录:


 

Linux curl命令get/post提交数据、json和文件全攻略

Linuxliuliangsong 发表了文章 • 0 个评论 • 554 次浏览 • 2016-12-03 13:43 • 来自相关话题

  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。一、测试前准备:  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
} 二、GET请求方式:  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族

2、使用"-G"参数配合"-d"参数:[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php 
3、带特殊字符数据使用“--data-urlencode”:[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?

4、从文件中获取数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
) 三、POST基本类型请求方式(-d):  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded对、正是相当于html的如下表单:<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form> 
1、直接设置POST数据:[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?

2、从文件中获取POST数据:[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
) 四、POST多类型表单数据请求方式(-F):  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722
相当于HTML的如下表单:<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form、-F):[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
2、使用"@"、"<"失去特殊意义的"--form-string":[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)
3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):[root@aiezu.com ~]# cat data.txt
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

) 五、POST上传文件(-F "@"字符的妙用):  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)


2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

) 六、POST提交JSON数据:  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)接收JSON的代码段:<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}  提示:除了Content-Type为multipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 七、附录:参考页面:Linux curl命令详解linux curl命令来路伪装(referer)和浏览器伪装(user-agent) 查看全部
  Http协议支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6种请求方法;在这里我们通过linux curl命令,介绍其中的两种请求方法:GET、POST;使用linux curl命令通过GET、POST命令提交数据、使用POST上传文件,同时使用PHP语言介绍它们提交的数据和上传的文件的接受方法。

一、测试前准备:

  为了测试方便,我们在本站的站点根目录下,写了一个临时接受数据脚本"test.php",用来接收提交上来的数据;所有的GET、POST请求都发送到“http://aiezu.com/test.php”,脚本的内容如下:
<?php
foreach(array('REQUEST_METHOD', 'CONTENT_LENGTH', 'CONTENT_TYPE') as $key ) {
if ( isset( $_SERVER[$key] ) ) {
echo sprintf("[%s]: %s\n", $key, $_SERVER[$key]);
}
}
echo PHP_EOL;
foreach(array('_GET', '_POST', '_FILES') as $name ) {
if( !empty( $$name ) ) {
echo sprintf("\$%s:\n", $name);
print_r($$name);
echo PHP_EOL;
}
}
//接收JSON代码
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
 

二、GET请求方式:

  GET方式只能提交key/value对数据,不能上传二进制文件。使用linux curl命令通过GET方法提交数据主要分为两大类,1:直接将数据附加在URL后面;2:使用"-G"或者"--get"参数配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等参数,参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。
1、将数据直接附加在URL后面:
[root@aiezu.com ~]# curl 'http://aiezu.com/test.php?en=aiezu&cn=爱E族'
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 
2、使用"-G"参数配合"-d"参数:
[root@aiezu tmp]# curl -G -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
由于"-G"等价于"--get","-d"等价于"--data"、"--data-ascii",所以下面几种方法和上面的方法是等价的:
curl -G --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get -d "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data "en=aiezu&cn=爱E族" http://aiezu.com/test.php
curl --get --data-ascii "en=aiezu&cn=爱E族" http://aiezu.com/test.php
 
3、带特殊字符数据使用“--data-urlencode”:
[root@aiezu tmp]# curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: GET

$_GET:
Array
(
[aa] => &a
[2] => /&?
)
 
4、从文件中获取数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET

$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

三、POST基本类型请求方式(-d):

  基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
对、正是相当于html的如下表单:
<form method="POST" action="/test.php" enctype="application/x-www-form-urlencoded">
...
</form>
 
1、直接设置POST数据:
[root@aiezu.com ~]# curl --data 'name=爱E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 42
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
[code] => /&?
)
 
2、从文件中获取POST数据:
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 19
[CONTENT_TYPE]: application/x-www-form-urlencoded

$_POST:
Array
(
[en] => aiezu
[cn] => 爱E族
)
 

四、POST多类型表单数据请求方式(-F):

  POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下:
POST /test.php HTTP/1.1
User-Agent: curl/7.29.0
Host: aiezu.com
Accept: */*
Content-Length: 141
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------574307cce722

相当于HTML的如下表单:
<form method="POST" action="/test.php" enctype="multipart/form-data">
...
</form>
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。
 
1、提交key/value值对数据(--form-F):
[root@aiezu.com ~]# curl --form 'name=爱E族' -F "site=aiezu.com" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 248
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------71b11083beb3

$_POST:
Array
(
[name] => 爱E族
[site] => aiezu.com
)

2、使用"@"、"<"失去特殊意义的"--form-string":
[root@aiezu.com ~]# curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a

$_POST:
Array
(
[str] => @data.txt
[site] => <b.txt
)

3、从文件中获取key/value对中的"value"("<"字符的特殊妙用):
[root@aiezu.com ~]# cat data.txt 
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=<data.txt' http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57

$_POST:
Array
(
[data] => en=aiezu&cn=爱E族

)
 

五、POST上传文件(-F "@"字符的妙用):

  这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:
[root@aiezu.com ~]# curl --form 'file=@data.txt' http://aiezu.com/test.php 
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------126831d4cffa

$_FILES:
Array
(
[file] => Array
(
[name] => data.txt
[type] => text/plain
[tmp_name] => /tmp/php6HqQjx
[error] => 0
[ size ] => 20
)

)
 
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:
<span>[root@aiezu.com ~]# curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 206
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------45fce8b3a421

$_FILES:
Array
(
[pic] => Array
(
[name] => image.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpvWcwiX
[error] => 0
[ size ] => 20
)

)
 

六、POST提交JSON数据:

  下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:
[root@aiezu.com ~]# curl -H "Content-Type: application/json" --data '{"name":"爱E族","site":"aiezu.com"}'  http://aiezu.com/test.php
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 37
[CONTENT_TYPE]: application/json

JSON Data:
Array
(
[name] => 爱E族
[site] => aiezu.com
)
接收JSON的代码段:
<?php
if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/json' && $json = file_get_contents("php://input") ) {
echo "JSON Data:\n";
print_r(@json_decode($json, true));
}
  提示:除了Content-Typemultipart/form-data​,其他所有POST的数据都可以从php://input流中读得,如:POST的XML数据,二进制图片数据。
 

七、附录:

参考页面:

linux curl命令来路伪装(referer)和浏览器伪装(user-agent)

Linuxliuliangsong 发表了文章 • 0 个评论 • 323 次浏览 • 2016-12-02 11:05 • 来自相关话题

  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:<?php
print_r($_SERVER);测试返回:[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125

二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu 
2、“-H”参数的方式:# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
2、“-H”参数方式:# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
七、附录:
参考页面:Linux curl命令详解Linux curl命令get/post提交数据、json和文件全攻略 查看全部
  一般的知名站点,都有一套比较完善的机器流量检测系统;它通过流量的IP、流量的来源、使用的浏览设备、访问频次、用户行为等综合分析,来判断当前流量是真实的用户流量,还是机器在爬网站的数据,从而做出是否封禁当前流量的决定。第三方统计站点,也是使用此原理来帮助站长统计用户行文的。
  而其中的流量来源、使用的浏览设备、甚至流量的IP都是可以伪造的。本文为介绍curl伪装访问来源、和伪装使用的浏览器的方法。伪装来路IP地址,请参考“linux curl命令使用代理服务器”。
 
一、原理说明:
  浏览器与http服务器是通过http协议通讯的,而http请求头中包含了客户端的一些信息,其中包括:浏览器类型、当前页面的来源页面,cookies等;
  下面我们来看看一个标准的http请求头后响应头:
[root@aiezu.com ~]# curl -v -I --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://baidu.com/  
* About to connect() to baidu.com port 80 (#0)
* Trying 180.149.132.47...
* Connected to baidu.com (180.149.132.47) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: Chrome/54.0 (Windows NT 10.0)
> Host: baidu.com
> Accept: */*
> Referer: http://baidu.com
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
< Date: Fri, 02 Dec 2016 03:46:11 GMT
Date: Fri, 02 Dec 2016 03:46:11 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 161
Content-Length: 161
< Connection: Keep-Alive
Connection: Keep-Alive
< Location: https://www.baidu.com/
Location: https://www.baidu.com/
< Expires: Sat, 03 Dec 2016 03:46:11 GMT
Expires: Sat, 03 Dec 2016 03:46:11 GMT
< Cache-Control: max-age=86400
Cache-Control: max-age=86400
< Cache-Control: private
Cache-Control: private

<
* Connection #0 to host baidu.com left intact
  上面输出可以看到,第7行和第9行就是我们设置的浏览器类型字符串和流量来源页面。而httpd服务端接收到了什么呢?我们这里以http服务段使用的是PHP为例,在站点上做一个“test.php”做为测试页面,PHP的Referer、User-Agent存放在$_SERVER变量中,所以我们的“test.php”文件只需要两行代码:
test.php文件:
<?php
print_r($_SERVER);
测试返回:
[root@aiezu tmp]# curl --referer http://baidu.com --user-agent 'Chrome/54.0 (Windows NT 10.0)' http://aiezu.com/test.php
Array
(
[HTTP_USER_AGENT] => Chrome/54.0 (Windows NT 10.0)
[HTTP_HOST] => aiezu.com
[HTTP_ACCEPT] => */*
[HTTP_REFERER] => http://baidu.com
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
...
[REQUEST_METHOD] => GET
...
[PHP_SELF] => /test.php
[REQUEST_TIME] => 1480651125
)
 
二、伪装来路(referer):
  什么是来路?从A页面点击进入B页面,那B页面的来路就是A页面的URL。伪装来路十分简单,有两种方法:1、使用上面的“--referer”参数或“-e参数”;2、直接使用“-H”参数设置http头,下面分别介绍两种方法。
1、“-e/--referer”参数方式:
# 告诉http服务器,我是从qq.com来的
[root@aiezu.com ~]# curl -e http://qq.com http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://qq.com

# 告诉http服务器,我是从baidu.com搜"aiezu"关键词点进来的
[root@aiezu.com ~]# curl --referer https://www.baidu.com/s?wd=aiezu http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => https://www.baidu.com/s?wd=aiezu
 
2、“-H”参数的方式:
# 告诉http服务器,我是从微博过来的
[root@aiezu ~]# curl -H "Referer: http://weibo.com" http://aiezu.com/test.php 2>/dev/null|grep HTTP_REFERER
[HTTP_REFERER] => http://weibo.com
 
三、伪装浏览器类型(User-Agent):
  首先,我们先找到浏览器对应的“User-Agent”字符串。可以直接在Chrome中的“开发者工具”的“网络”标签查看http请求头获得;也可以在网上搜索获得,如通过百度搜索“微信useragent”、“ie useragent”、“chrome useragent”等。
  获得对应浏览器的“User-Agent”字符串后,同样可以通过两种方式告诉http服务器我用的浏览器类型:
1、“-A/--user-agent”参数方式:
# 告诉http服务器,我是通过微信内置浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI';
[root@aiezu.com ~]# curl -A "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A365 MicroMessenger/6.0 NetType/WIFI

# 告诉http服务器,我是通过Chrome浏览器访问
[root@aiezu.com ~]# UA='Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36';
[root@aiezu.com ~]# curl --user-agent "$UA" http://aiezu.com/test.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36

2、“-H”参数方式:
# 告诉网站,我是百度蜘蛛爬取
[root@aiezu.com ~]# UA="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
[root@aiezu.com ~]# curl -H "User-Agent: $UA" http://aiezu.com/a.php|grep HTTP_USER_AGENT
[HTTP_USER_AGENT] => Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

七、附录:
参考页面:

Linux curl命令详解

Linuxliuliangsong 发表了文章 • 0 个评论 • 965 次浏览 • 2016-11-23 17:57 • 来自相关话题

  curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

  curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传...。
 
一、curl命令语法:curl [options] [URL...] 
二、curl命令参数详解:
  由于linux curl功能十分强大,所以命令参数十分多,下表只是爱E族(aiezu.com)帅选出来的部分参数,更多参数请运行“man curl”命令查看。参数组参数描述urlurl需要抓取的一到多个URLs;
多个下面通配符的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt请

头-H "name: value"
--header "name: value"(HTTP)添加一个http header(http请求头);-H "name:"
--header "name:"(HTTP)移除一个http header(http请求头);-A "string"
--user-agent "string"
【参考】(HTTP)设置Http请求头“User-Agent”,服务器通过“User-Agent”可以判断客户端使用的浏览器名称和操作系统类型,伪造此参数能导致服务器做出错误判断。
也可以使用“-H”, “--header option”设置此选项;-e <URL>
--referer <URL>
【参考】(HTTP)设置访问时的来源页面,告诉http服务从哪个页面进入到此页面;
-e "aiezu.com"相当于“-H "Referer: www.qq.com"”;响

头-I
--head(HTTP)只输出HTTP-header,不获取内容(HTTP/FTP/FILE)。
用于HTTP服务时,获取页面的http头;
  (如:curl -I http://aiezu.com)
用于FTP/FILE时,将会获取文件大小、最后修改时间;
  (如:curl -I file://test.txt)-i
--include(HTTP)输出HTTP头和返回内容;-D <file>
--dump-header <file>(HTTP)转储http响应头到指定文件;cookie-b name=data
--cookie name=data
【参考】(HTTP)发送cookie数据到HTTP服务器,数据格式为:"NAME1=VALUE1; NAME2=VALUE2";

如果行中没有“=”,将把参数值当作cookie文件名;

这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;-c filename
--cookie-jar file name
【参考】(HTTP)完成操作后将服务器返回的cookies保存到指定的文件;
指定参数值为“-”将定向到标准输出“如控制台”;-j
--junk-session-cookies(HTTP)告诉curl放弃所有的"session cookies";
相当于重启浏览器;代理-x host:port
-x [protocol://[user:pwd@]host[:port]
--proxy [protocol://[user:pwd@]host[:port]
【参考】使用HTTP代理访问;如果未指定端口,默认使用8080端口;
protocol默认为http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:123@aiezu.com:80"-p
--proxytunnel将“-x”参数的代理,作为通道的方式去代理非HTTP协议,如ftp;--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【参考】使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此参数会覆盖“-x”参数;--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlmhttp代理认证方式,参考:
--anyauth
--basic
--diges
--negotiate
--ntlm-U <user:password>
--proxy-user <user:password>设置代理的用户名和密码;数据
传输-G
--get
【参考】如果使用了此参数,“-d/”、“--data”、“--data-binary”参数设置的数据,讲附加在url上,以GET的方式请求; -d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【参考】(HTTP)使用HTTP POST方式发送“key/value对”数据,相当于浏览器表单属性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST数据;
  --data-ascii:HTTP方式POST ascii数据;
  --data-binary:HTTP方式POST二进制数据;
  --data-urlencode:HTTP方式POST数据(进行urlencode);
如果数据以“@”开头,后紧跟一个文件,将post文件内的内容;-F name=@file
-F name=<file
-F name=content
--form name=content
【参考】(HTTP)使用HTTP POST方式发送类似“表单字段”的多类型数据,相当于同时设置浏览器表单属性(method="POST",enctype="multipart/form-data"),可以使用此参数上传二进制文件。

如果字段内容以“@”开头,剩下的部分应该是文件名,curl将会上传此文件,如:
curl -F "pic=@pic.jpg" http://aiezu.com;
curl -F "page=@a.html;type=text/html