Linux设置命令行代理

有些场景下需要为系统设置代理,比如OpenCV3在进行cmake编译时需要在线从amazon下载一些第三方包。现在多数同学采用的代理方案应该都是基于socks5协议,而默认的终端工具支持的代理类型都是http或https,所以这里需要socks协议到http协议的转换,转换之后采用终端的代理变量设置http代理即可。

我的系统环境为ubuntu 16.04,其他系统类似
两种方案,一种是采用polipo将socks代理转为http,然后为相应命令指定http代理。另一种方案是采用proxychains重定向连接来解决。两种方案看个人喜好,个人倾向于proxychains的方式

proxychains进行代理重定向

安装

1
sudo apt-get install proxychains

配置

proxychains会从以下文件中加载配置:

1
2
3
4
./proxychains.conf
$(HOME)/.proxychains/proxychains.conf
/etc/proxychains.conf
# see more in /etc/proxychains.conf

本文以修改$(HOME)/.proxychains/proxychains.conf为例
修改其内容如下(如果没有该文件,则创建):

1
2
3
4
5
6
7
8
9
10
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]字段中添加你的代理,由于采用shadowsocks的方式进行代理,并且监听的本地端口为1081,所以最后一行为socks5 127.0.0.1 1081

使用

1
proxychains [command]

例如:
proxychains后面直接跟需要走代理的命令

1
2
3
4
5
6
7
8
$ proxychains curl ip.gs
ProxyChains-3.1 (http://proxychains.sf.net)
Current IP / 当前 IP: 165.227.9.118
ISP / 运营商: digitalocean.com
City / 城市: San Francisco California
Country / 国家: United States

$ proxychains git push origin master

或者直接让整个bash下的命令都走代理:

1
2
3
$ proxychains bash
$ ping google.com
$ git push origin master

polipo转socks为http

依赖

默认你使用的是SS方式进行代理上网,并且已经有了SS账号。
安装ss客户端

1
2
3
4
sudo apt-get update
sudo apt-get install python
sudo apt-get install python-pip
sudo pip install shadowsocks

安装polipo
polipo是一个web代理缓存工具,可以转发web请求到指定的服务器和端口,它本身支持socks协议,所以可以把它当成可以进行socks协议与http协议转换的工具。

1
sudo apt-get install polipo

配置

配置并启动ss客户端
为了避免系统中配置的多个ss客户端监听端口冲突,可以修改ss监听端口,这里指定监听端口为1081,下面是我的ss配置:
config.json

1
2
3
4
5
6
7
8
{
"server":"your-server-ip",
"server_port":your-server-port,
"local_port":1081,
"password":"your-password",
"method": "aes-128-cfb",
"timeout":600
}

启动ss客户端:

1
sslocal -c config.json

可以让它在后台运行,如果只是临时用,可以另开一个terminal进行其他操作

配置并启动polipo
修改polipo配置文件如下:
配置文件路径/etc/polipo/config

1
2
3
4
logSyslog = true
logFile = /var/log/polipo/polipo.log
socksParentProxy = "127.0.0.1:1081"
socksProxyType = socks5

启动polipo服务:

1
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:

1
2
http_proxy=http://127.0.0.1:8123 curl ip.gs
当前 IP:138.68.252.43 来自:美国加利福尼亚州旧金山

验证google的https访问:

1
https_proxy=http://127.0.0.1:8123 curl https://google.com

使用技巧

如果想让整个当前会话都走代理,可以直接设置环境变量:

1
export http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123

取消代理的环境变量:

1
2
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中增加如下内容:

1
alias hp="http_proxy=http://127.0.0.1:8123 https_proxy=http://127.0.0.1:8123"

执行source ~/.bashrc使其生效,然后可以如下执行需要代理的命令:

1
hp curl ip.gs