Linux设置命令行代理
有些场景下需要为系统设置代理,比如OpenCV3在进行cmake编译时需要在线从amazon下载一些第三方包。现在多数同学采用的代理方案应该都是基于socks5协议,而默认的终端工具支持的代理类型都是http或https,所以这里需要socks协议到http协议的转换,转换之后采用终端的代理变量设置http代理即可。
我的系统环境为ubuntu 16.04,其他系统类似
两种方案,一种是采用polipo将socks代理转为http,然后为相应命令指定http代理。另一种方案是采用proxychains重定向连接来解决。两种方案看个人喜好,个人倾向于proxychains的方式
proxychains进行代理重定向
安装
sudo apt-get install proxychains
配置
proxychains会从以下文件中加载配置:
./proxychains.conf
$(HOME)/.proxychains/proxychains.conf
/etc/proxychains.conf
# see more in /etc/proxychains.conf
本文以修改$(HOME)/.proxychains/proxychains.conf为例
修改其内容如下(如果没有该文件,则创建):
trict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
localnet 127.0.0.0/255.0.0.0
quiet_mode
[ProxyList]
socks5 127.0.0.1 1081
其中[ProxyList]字段中添加你的代理,由于采用*的方式进行代理,并且监听的本地端口为1081,所以最后一行为socks5 127.0.0.1 1081
使用
proxychains [command]
例如:
proxychains后面直接跟需要走代理的命令
$ proxychains curl ip.gs
ProxyChains-3.1 (http://proxychains.sf.net)
Current IP / 当前 IP: 165.227.118
ISP / 运营商: digitalocean.com
City / 城市: San Francisco California
Country / 国家: United States
$ proxychains git push origin master
或者直接让整个bash下的命令都走代理:
$ proxychains bash
$ ping google.com
$ git push origin master
polipo转socks为http
依赖
默认你使用的是SS方式进行代理上网,并且已经有了SS账号。
安装ss客户端
sudo apt-get update
sudo apt-get install python
sudo apt-get install python-pip
sudo pip install *
安装polipo
polipo是一个web代理缓存工具,可以转发web请求到指定的服务器和端口,它本身支持socks协议,所以可以把它当成可以进行socks协议与http协议转换的工具。
sudo apt-get install polipo
配置
配置并启动ss客户端
为了避免系统中配置的多个ss客户端监听端口冲突,可以修改ss监听端口,这里指定监听端口为1081,下面是我的ss配置:
config.json
{
"server":"your-server-ip",
"server_port":your-server-port,
"local_port":1081,
"password":"your-password",
"method": "aes-128-cfb",
"timeout":600
}
启动ss客户端:
sslocal -c config.json
可以让它在后台运行,如果只是临时用,可以另开一个terminal进行其他操作
配置并启动polipo
修改polipo配置文件如下:
配置文件路径/etc/polipo/config
logSyslog = true
logFile = /var/log/polipo/polipo.log
socksParentProxy = "127.0.0.1:1081"
socksProxyType = socks5
启动polipo服务:
sudo systemctl start polipo
此时polipo已经开始监听本地的8123端口,并将请求通过socks5协议转发到127.0.0.1的1081端口,如果需要修改默认的8123端口,可以查看man手册
验证
在需要使用代理的命令前面加上http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123
,如果只需要使用http,可以只设置http代理,如下验证代理后的ip:
http_proxy=http://127.0.0.1:8123 curl ip.gs
当前 IP:138.68.252.43 来自:美国加利福尼亚州旧金山
验证google的https访问:
https_proxy=http://127.0.0.1:8123 curl https://google.com
使用技巧
如果想让整个当前会话都走代理,可以直接设置环境变量:
export http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123
取消代理的环境变量:
unset http_proxy
unset https_proxy
如果想让用户登录后自动进行代理设置,可以直接将export http_proxy=http://127.0.0.1:8123/ https_proxy=http://127.0.0.1:8123/
放在~/.bashrc
中。
可以为命令设置别名,以减少输入,在~/.bashrc
中增加如下内容:
alias ="http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123"
执行source ~/.bashrc
使其生效,然后可以如下执行需要代理的命令:
hp curl ip.gs