Linux bash终端设置代理(proxy)访问

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

  Linux是开源操作系统,有很多软件包需要从国外网站上下载,而其中大部分国外网站是被墙的,这时我们需要通过代理来访问这些网站。下面我们介绍Linux bash shell终端代理设置方法,包括socks代理,http代理。
 一、linux shell终端代理设置方法:  linux要在shell终端为http、https、ftp协议设置代理,值需要设置对应的环境变量即可。下面是一些关于代理的环境变量:环境变量描述值示例http_proxy为http网站设置代理;10.0.0.51:8080;
user:pass@10.0.0.10:8080
socks4://10.0.0.51:1080
socks5://192.168.1.1:1080https_proxy为https网站设置代理;同上ftp_proxy为ftp协议设置代理;socks5://192.168.1.1:1080no_proxy无需代理的主机或域名;
可以使用通配符;
多个时使用“,”号分隔;*.aiezu.com,10.*.*.*,192.168.*.*,
*.local,localhost,127.0.0.1   可以将上面4个环境变量设置项放于~/.bashrc文件尾部,这样用户打开bash shell终端时会自动调用此脚本,读入它们。
  二、linux bash为http站点设置代理:  根据代理类型,将下面对应的设置项添加到~/.bashrc文件末尾,然后运行". ~/.bashrc"(前面是一个“.”号)命令使用之在当前环境生效。
1、为http站点设置http代理(默认):export http_proxy=10.0.0.52:80802、为http站点设置sock4、sock5代理:# 设置 socks 代理,自动识别socks版本
export http_proxy=socks://10.0.0.52:1080
# 设置 socks4 代理
export http_proxy=socks4://10.0.0.52:1080
# 设置 socks5 代理
export http_proxy=socks5://10.0.0.52:10803、代理使用用户名密码认证:export http_proxy=user:pass@192.158.8.8:8080    三、linux bash为https站点设置代理:  如果需要为https网站设置代理,设置https_proxy环境变量即可;设置方法完全与http_proxy环境变量相同:# 任意使用一项
export https_proxy=10.0.0.52:8080
export https_proxy=user:pass@192.158.8.8:8080
export https_proxy=socks://10.0.0.52:1080
export https_proxy=socks4://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080  四、举例:  现在我们要设置http、https网站都使用socks5代理10.0.0.52:1080,下面为完整设置方法:
1、vim ~/.bashrc,在文件尾部添加下面内容:export http_proxy=socks5://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
export no_proxy="*.aiezu.com,10.*.*.*,192.168.*.*,*.local,localhost,127.0.0.1"2、加载设置:[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $http_proxy
socks5://10.0.0.52:1080
[root@aiezu.com ~]# echo $https_proxy
socks5://10.0.0.52:10803、测试代理:[root@aiezu.com ~]# curl -I http://www.fackbook.com
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: text/html
Last-Modified: Mon, 14 Nov 2016 22:03:32 GMT
Accept-Ranges: bytes
ETag: "0521af0c23ed21:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sun, 11 Dec 2016 13:21:33 GMT 查看全部
  Linux是开源操作系统,有很多软件包需要从国外网站上下载,而其中大部分国外网站是被墙的,这时我们需要通过代理来访问这些网站。下面我们介绍Linux bash shell终端代理设置方法,包括socks代理,http代理。
 

一、linux shell终端代理设置方法:

  linux要在shell终端为http、https、ftp协议设置代理,值需要设置对应的环境变量即可。下面是一些关于代理的环境变量:
环境变量描述值示例
http_proxy为http网站设置代理;10.0.0.51:8080;
user:pass@10.0.0.10:8080
socks4://10.0.0.51:1080
socks5://192.168.1.1:1080
https_proxy为https网站设置代理;同上
ftp_proxy为ftp协议设置代理;socks5://192.168.1.1:1080
no_proxy无需代理的主机或域名;
可以使用通配符;
多个时使用“,”号分隔;
*.aiezu.com,10.*.*.*,192.168.*.*,
*.local,localhost,127.0.0.1 
  可以将上面4个环境变量设置项放于~/.bashrc文件尾部,这样用户打开bash shell终端时会自动调用此脚本,读入它们。
  

二、linux bash为http站点设置代理:

  根据代理类型,将下面对应的设置项添加到~/.bashrc文件末尾,然后运行". ~/.bashrc"(前面是一个“.”号)命令使用之在当前环境生效。
1、为http站点设置http代理(默认):
export http_proxy=10.0.0.52:8080
2、为http站点设置sock4、sock5代理:
# 设置 socks 代理,自动识别socks版本
export http_proxy=socks://10.0.0.52:1080
# 设置 socks4 代理
export http_proxy=socks4://10.0.0.52:1080
# 设置 socks5 代理
export http_proxy=socks5://10.0.0.52:1080
3、代理使用用户名密码认证:
export http_proxy=user:pass@192.158.8.8:8080
    

三、linux bash为https站点设置代理:

  如果需要为https网站设置代理,设置https_proxy环境变量即可;设置方法完全与http_proxy环境变量相同:
# 任意使用一项
export https_proxy=10.0.0.52:8080
export https_proxy=user:pass@192.158.8.8:8080
export https_proxy=socks://10.0.0.52:1080
export https_proxy=socks4://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
  

四、举例:

  现在我们要设置http、https网站都使用socks5代理10.0.0.52:1080,下面为完整设置方法:
1、vim ~/.bashrc,在文件尾部添加下面内容:
export http_proxy=socks5://10.0.0.52:1080
export https_proxy=socks5://10.0.0.52:1080
export no_proxy="*.aiezu.com,10.*.*.*,192.168.*.*,*.local,localhost,127.0.0.1"
2、加载设置:
[root@aiezu.com ~]# . ~/.bashrc
[root@aiezu.com ~]# echo $http_proxy
socks5://10.0.0.52:1080
[root@aiezu.com ~]# echo $https_proxy
socks5://10.0.0.52:1080
3、测试代理:
[root@aiezu.com ~]# curl -I http://www.fackbook.com
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: text/html
Last-Modified: Mon, 14 Nov 2016 22:03:32 GMT
Accept-Ranges: bytes
ETag: "0521af0c23ed21:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sun, 11 Dec 2016 13:21:33 GMT

Golang(go语言)中map创建/赋值/读取

GoLangliuliangsong 发表了文章 • 0 个评论 • 141 次浏览 • 2016-12-10 22:53 • 来自相关话题

  go语言map是一种无序的键值对的集合。map最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
 一、golang map声明、初始化、赋值、使用Println输出:package main
import "fmt"
func main() {
// 声明map
var m map[int]string
// 初始化map, 未初始化的map为nil map,不能赋值
m = make(map[int]string)
// 赋值
m[1] = "aaa"
m[2] = "bbb"
m[3] = "999"
// 输出
fmt.Println(m)
}运行结果:[root@aiezu.com ~]# go run test.go
map[1:aaa 2:bbb 3:999]  二、golang直接初始化创建map、然后赋值、使用for输出:package main
import "fmt"
func main() {
// 直接初始化创建
m := make( map[string]string )
// 赋值
m["site"] = "aiezu.com"
m["name"] = "爱E族"
m["test"] = "123456"

// for 输出
for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}运行结果:[root@aiezu.com ~]# go run test.go
site aiezu.com
name 爱E族
test 123456  
三、go语言直接创建map并赋值,并使用for输出:package main
import "fmt"
func main() {
// 直接创建并赋值
m := map[string]string {
"name" : "爱e族",
"domain" : "aiezu.com",
}

for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:[root@aiezu.com ~]# go run test.go
name 爱e族
domain aiezu.com

  查看全部
  go语言map是一种无序的键值对的集合。map最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
 

一、golang map声明、初始化、赋值、使用Println输出:

package main
import "fmt"
func main() {
// 声明map
var m map[int]string
// 初始化map, 未初始化的map为nil map,不能赋值
m = make(map[int]string)
// 赋值
m[1] = "aaa"
m[2] = "bbb"
m[3] = "999"
// 输出
fmt.Println(m)
}
运行结果:
[root@aiezu.com ~]# go run test.go 
map[1:aaa 2:bbb 3:999]
  

二、golang直接初始化创建map、然后赋值、使用for输出:

package main
import "fmt"
func main() {
// 直接初始化创建
m := make( map[string]string )
// 赋值
m["site"] = "aiezu.com"
m["name"] = "爱E族"
m["test"] = "123456"

// for 输出
for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:
[root@aiezu.com ~]# go run test.go 
site aiezu.com
name 爱E族
test 123456
  
三、go语言直接创建map并赋值,并使用for输出:
package main
import "fmt"
func main() {
// 直接创建并赋值
m := map[string]string {
"name" : "爱e族",
"domain" : "aiezu.com",
}

for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:
[root@aiezu.com ~]# go run test.go 
name 爱e族
domain aiezu.com

 

Golang(go语言)上传图片和显示图片

GoLangliuliangsong 发表了文章 • 0 个评论 • 207 次浏览 • 2016-12-09 17:53 • 来自相关话题

  下面是一段简单的Go语言代码,可以用来监听端口,实现简单的http图片上传,和显示上传的图片,可供初学者参考:package main;
import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"net/http"
"errors"
"strings"
)

func main() {
http.HandleFunc("/upload/", uploadHandle) // 上传
http.HandleFunc("/uploaded/", showPicHandle) //显示图片
err := http.ListenAndServe(":80", nil)
fmt.Println(err)
}

// 上传图像接口
func uploadHandle (w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")

req.ParseForm()
if req.Method != "POST" {
w.Write([]byte(html))
} else {
// 接收图片
uploadFile, handle, err := req.FormFile("image")
errorHandle(err, w)

// 检查图片后缀
ext := strings.ToLower(path.Ext(handle.Filename))
if ext != ".jpg" && ext != ".png" {
errorHandle(errors.New("只支持jpg/png图片上传"), w);
return
//defer os.Exit(2)
}

// 保存图片
os.Mkdir("./uploaded/", 0777)
saveFile, err := os.OpenFile("./uploaded/" + handle.Filename, os.O_WRONLY|os.O_CREATE, 0666);
errorHandle(err, w)
io.Copy(saveFile, uploadFile);

defer uploadFile.Close()
defer saveFile.Close()
// 上传图片成功
w.Write([]byte("查看上传图片: <a target='_blank' href='/uploaded/" + handle.Filename + "'>" + handle.Filename + "</a>"));
}
}

// 显示图片接口
func showPicHandle( w http.ResponseWriter, req *http.Request ) {
file, err := os.Open("." + req.URL.Path)
errorHandle(err, w);

defer file.Close()
buff, err := ioutil.ReadAll(file)
errorHandle(err, w);
w.Write(buff)
}

// 统一错误输出接口
func errorHandle(err error, w http.ResponseWriter) {
if err != nil {
w.Write([]byte(err.Error()))
}
}

const html = `<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" />
</form>
</body>
</html>` 查看全部
  下面是一段简单的Go语言代码,可以用来监听端口,实现简单的http图片上传,和显示上传的图片,可供初学者参考:
package main;
import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"net/http"
"errors"
"strings"
)

func main() {
http.HandleFunc("/upload/", uploadHandle) // 上传
http.HandleFunc("/uploaded/", showPicHandle) //显示图片
err := http.ListenAndServe(":80", nil)
fmt.Println(err)
}

// 上传图像接口
func uploadHandle (w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")

req.ParseForm()
if req.Method != "POST" {
w.Write([]byte(html))
} else {
// 接收图片
uploadFile, handle, err := req.FormFile("image")
errorHandle(err, w)

// 检查图片后缀
ext := strings.ToLower(path.Ext(handle.Filename))
if ext != ".jpg" && ext != ".png" {
errorHandle(errors.New("只支持jpg/png图片上传"), w);
return
//defer os.Exit(2)
}

// 保存图片
os.Mkdir("./uploaded/", 0777)
saveFile, err := os.OpenFile("./uploaded/" + handle.Filename, os.O_WRONLY|os.O_CREATE, 0666);
errorHandle(err, w)
io.Copy(saveFile, uploadFile);

defer uploadFile.Close()
defer saveFile.Close()
// 上传图片成功
w.Write([]byte("查看上传图片: <a target='_blank' href='/uploaded/" + handle.Filename + "'>" + handle.Filename + "</a>"));
}
}

// 显示图片接口
func showPicHandle( w http.ResponseWriter, req *http.Request ) {
file, err := os.Open("." + req.URL.Path)
errorHandle(err, w);

defer file.Close()
buff, err := ioutil.ReadAll(file)
errorHandle(err, w);
w.Write(buff)
}

// 统一错误输出接口
func errorHandle(err error, w http.ResponseWriter) {
if err != nil {
w.Write([]byte(err.Error()))
}
}

const html = `<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" />
</form>
</body>
</html>`

Linux vim为Golang(go语言)添加语法高亮

GoLangliuliangsong 发表了文章 • 0 个评论 • 247 次浏览 • 2016-12-08 12:42 • 来自相关话题

  Go语言是谷歌2009发布的一款开源跨平台编程语言,目前vim默认还没有为golang提供语法高亮功能,要实现go语言vim下语法高亮,可以参考下面设置。  一、测试环境:  我的测试环境为RHEL7.1,本文适用与CentOS、Ubuntu、Fedora,同样也适用于其他大多数linux系统: [root@aiezu.com ~]# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.1 (Source)
[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 二、为vim添加go语言用法高亮:  打开https://golang.org/dl/页面,在上面找到并下载“go1.3.3.src.tar.gz ”源码包,然后解压:wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz
tar -zxvf go1.3.3.src.tar.gz  然后将解压出来的“go/misc/vim/”目录下的syntax、ftplugin、indent、compiler、ftdetect五个文件夹复制到"/usr/share/vim/vim74/"目录下:cp -R go/misc/vim/syntax/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftplugin/ /usr/share/vim/vim74/
cp -R go/misc/vim/indent/ /usr/share/vim/vim74/
cp -R go/misc/vim/compiler/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftdetect/ /usr/share/vim/vim74/ 三、测试:  文件全部复制好后,创建一个后缀为".go"的文件,输入golang代码试试,看vim golang语法高亮是否生效,我的效果如下:



 四、附录:  可以在用户目录下,添加一个".vimrc"文件,在文件添加一些vim初始设置项,来设置是否现在行号、tab字符宽度、文本缩进等。".vimrc"文件每次使用vim命令时都会自动调用。运行"vim ~/.vimrc"命令,然后添加如下内容:syntax on
"set number " 显示行号
"set cursorline " 突出显示当前行
set tabstop=4 " Tab键的宽度

" 统一缩进为4
set softtabstop=4
set shiftwidth=4 查看全部

  Go语言是谷歌2009发布的一款开源跨平台编程语言,目前vim默认还没有为golang提供语法高亮功能,要实现go语言vim下语法高亮,可以参考下面设置。

  

一、测试环境:

  我的测试环境为RHEL7.1,本文适用与CentOS、Ubuntu、Fedora,同样也适用于其他大多数linux系统: 
[root@aiezu.com ~]# cat /etc/redhat-release 
Derived from Red Hat Enterprise Linux 7.1 (Source)
[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
 

二、为vim添加go语言用法高亮:

  打开https://golang.org/dl/页面,在上面找到并下载“go1.3.3.src.tar.gz ”源码包,然后解压:
wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz 
tar -zxvf go1.3.3.src.tar.gz
  然后将解压出来的“go/misc/vim/”目录下的syntax、ftplugin、indent、compiler、ftdetect五个文件夹复制到"/usr/share/vim/vim74/"目录下:
cp -R go/misc/vim/syntax/ /usr/share/vim/vim74/ 
cp -R go/misc/vim/ftplugin/ /usr/share/vim/vim74/
cp -R go/misc/vim/indent/ /usr/share/vim/vim74/
cp -R go/misc/vim/compiler/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftdetect/ /usr/share/vim/vim74/
 

三、测试:

  文件全部复制好后,创建一个后缀为".go"的文件,输入golang代码试试,看vim golang语法高亮是否生效,我的效果如下:
vim_golang_syntax_highlight.png

 

四、附录:

  可以在用户目录下,添加一个".vimrc"文件,在文件添加一些vim初始设置项,来设置是否现在行号、tab字符宽度、文本缩进等。".vimrc"文件每次使用vim命令时都会自动调用。运行"vim ~/.vimrc"命令,然后添加如下内容:
syntax on
"set number " 显示行号
"set cursorline " 突出显示当前行
set tabstop=4 " Tab键的宽度

" 统一缩进为4
set softtabstop=4
set shiftwidth=4

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

Linuxliuliangsong 发表了文章 • 0 个评论 • 1769 次浏览 • 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 个评论 • 260 次浏览 • 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
)
 

三、附录:


 

PHP php://memory、php://temp流用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 208 次浏览 • 2016-12-06 12:42 • 来自相关话题

一、php://memory流介绍:  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);测试结果:[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB  二、php://temp流介绍:  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}客户端site.csv数据:站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...linux curl上传csv数据命令:[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
... 三、附录:PHP 输入输出流合集 查看全部

一、php://memory流介绍:

  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:
<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);
测试结果:
[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB
  

二、php://temp流介绍:

  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:
<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}
客户端site.csv数据:
站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...
linux curl上传csv数据命令:
[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php 
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
...
 

三、附录:

PHP 输入输出流合集

PHPliuliangsong 发表了文章 • 0 个评论 • 196 次浏览 • 2016-12-05 13:58 • 来自相关话题

  PHP 提供了输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。流接口常量介绍php://stdinSTDIN只读,用于CLI模式从命令行读取内容;php://stdoutSTDOUT只写,用于CLI模式向命令行标准输出输出内容;php://stderrSTDERR只写,用于CLI模式向命令行错误输出输出内容;php://input无只读,用于HTTP模式读取客户端以POST方式提交,
HTTP请求头Content-Type值不为multipart/form-data​的数据;php://output无只写,输出内容,近似echo、print的功能;php://memory无读写,类似文件包装器的数据流,用于内存中读写临时数据;php://temp无同上,不过当数据多于2MB会被写入到临时文件;
可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据写入到临时文件;
临时文件位置与sys_get_temp_dir()一致;php://fd无允许直接访问指定的文件描述符;
如“php://fd/3”引用了文件描述符“3”;php://filter无是一种元封装器,用于数据流打开时的筛选和过滤应用。这对于一体式的文件函数非常有用,类似readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他。官方介绍文档:http://php.net/manual/zh/wrappers.php.php 查看全部
  PHP 提供了输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
流接口常量介绍
php://stdinSTDIN只读,用于CLI模式从命令行读取内容;
php://stdoutSTDOUT只写,用于CLI模式向命令行标准输出输出内容;
php://stderrSTDERR只写,用于CLI模式向命令行错误输出输出内容;
php://input只读,用于HTTP模式读取客户端以POST方式提交,
HTTP请求头Content-Type值不为multipart/form-data​的数据;
php://output只写,输出内容,近似echo、print的功能;
php://memory读写,类似文件包装器的数据流,用于内存中读写临时数据;
php://temp同上,不过当数据多于2MB会被写入到临时文件;
可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据写入到临时文件;
临时文件位置与sys_get_temp_dir()一致;
php://fd允许直接访问指定的文件描述符;
如“php://fd/3”引用了文件描述符“3”;
php://filter是一种元封装器,用于数据流打开时的筛选和过滤应用。这对于一体式的文件函数非常有用,类似readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他。
官方介绍文档:http://php.net/manual/zh/wrappers.php.php

PHP php://input、php://output用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 314 次浏览 • 2016-12-05 10:28 • 来自相关话题

一、php://output输出流用法:  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   1、CLI模式通过php://output向终端输出内容:test.php文件:<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);输出:[root@aiezu.com ~]# php test.php
爱E族 2、Http模式通过php://output导出csv文件:  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");网页打开效果如下:



   二、php://input输入流用法:  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 1、PHP使用"php://input"接收XML数据:http test.php页面代码:<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}待提交xml.xml文件内容:<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>通过linux curl命令提交xml.xml:[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)  2、PHP使用"php://input"接收JSON数据:  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“六”节。
 3、PHP使用"php://input"接收文件内容:  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}提交测试:[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08
 三、附录:Linux curl命令详解PHP 输入、输出流合集 查看全部

一、php://output输出流用法:

  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   

1、CLI模式通过php://output向终端输出内容:

test.php文件:
<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);
输出:
[root@aiezu.com ~]# php test.php 
爱E族
 

2、Http模式通过php://output导出csv文件:

  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:
<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");
网页打开效果如下:
php_output流到处CSV文件.png

   

二、php://input输入流用法:

  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 

1、PHP使用"php://input"接收XML数据:

http test.php页面代码:
<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}
待提交xml.xml文件内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>
通过linux curl命令提交xml.xml:
[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)
  

2、PHP使用"php://input"接收JSON数据:

  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“”节。
 

3、PHP使用"php://input"接收文件内容:

  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:
<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}
提交测试:
[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08

 三、附录:

PHP命令行输入输出流STDIN/STDOUT/STDERR用法

PHPliuliangsong 发表了文章 • 0 个评论 • 354 次浏览 • 2016-12-04 21:27 • 来自相关话题

一、PHP STDIN、STDOUT、STDERR简介:  STDIN、STDOUT、STDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdin、php://stdout、php://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:原始流流打开副本描述STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息;STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息;  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  二、PHP STDIN用法:  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);运行结果:[root@aiezu.com ~]# php test.php
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com 三、PHP STDOUT用法:  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);运行结果:[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入; 四、PHP STDERR用法:  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);正常输出和错误输出分别定向到不同文件:[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;正常输出和错误输出合并定向到统一文件:[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;   四、附录:PHP 输入、输出流合集 查看全部

一、PHP STDIN、STDOUT、STDERR简介:

  STDINSTDOUTSTDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdinphp://stdoutphp://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:
原始流流打开副本描述
STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;
STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息
STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息
  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  

二、PHP STDIN用法:

  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:
<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);
运行结果:
[root@aiezu.com ~]# php test.php 
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com
 

三、PHP STDOUT用法:

  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:
<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);
运行结果:
[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入;
 

四、PHP STDERR用法:

  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:
<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);
正常输出和错误输出分别定向到不同文件:
[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;
正常输出和错误输出合并定向到统一文件:
[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;
  

 四、附录: