背景
我们在 Linux
命令行中,经常会需要使用代理(参考:How To Use Proxy Server To Access Internet at Shell Prompt With http_proxy Variable,Linux Proxy Server Settings – Set Proxy For Command Line),以便能访问某些资源。
为了便于做到这一点,我以自己的偏好出发,编写了一个 shell
脚本,已经在 bash
和 zsh
中通过测试。
代码实现
文件名称为 proxy.sh
,代码中端口的默认值 PROXY_DEFAILT_PORT
设为 7890,是 Clash 的默认端口,实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# AUTHOR="ChenyangGao <https://chenyanggao.github.io/>"
# VERSION=0.1
# 如果希望默认的 host 是 $PROXY_DEFAILT_HOST,设为空;如果希望是本机的局域网 ip 设成 ?;$PROXY_DEFAILT_HOST 的优先级高于 $PROXY_DEFAILT_HOST
export PROXY_DEFAILT_HOST_BACK=?
# 默认的代理主机,可以是 ip 或 域名
export PROXY_DEFAILT_HOST=127.0.0.1
# 默认的代理端口,0-65535 之间的数字
export PROXY_DEFAILT_PORT=7890
# 获取本机上代理的 host
_get_host() {
local host=${1:-$PROXY_DEFAILT_HOST};
if [[ "${1:0:1}" == [^0-9:] ]]
then
host=`( hostname -I 2>/dev/null || ( (
# iproute2
ip address 2>/dev/null ||
# net-tools
ifconfig 2>/dev/null
) | grep -o 'inet [^ ]\+' ) ) | grep -v 127.0.0.1 | grep -o -m 1 '[0-9]\+\(\.[0-9]\+\)\{3\}'`;
fi
echo $host;
}
# 获取本机上代理的 port
_get_port() {
echo ${1:-$PROXY_DEFAILT_PORT};
}
# 打印 shell 命令,启用本机上代理
proxy_export() {
local host=`_get_host "${1:-$PROXY_DEFAILT_HOST_BACK}"`;
local port=`_get_port "$2"`;
local proxy=$host:$port;
echo "\
export https_proxy=http://$proxy;
export http_proxy=http://$proxy;
export all_proxy=socks5://$proxy;
export no_proxy='localhost,127.0.0.1,::1';"
}
alias proxy@=proxy_export;
alias proxy!='eval `proxy_export`'
# 打印 shell 命令的别名,proxy+ 在 shell 中启用本机上代理 ,proxy- 在 shell 中停用本机上代理,命令可在局域网的其他机器上使用
proxy_alias() {
local host=`_get_host "${1:-$PROXY_DEFAILT_HOST_BACK}"`;
local port=`_get_port "$2"`;
local proxy=$host:$port;
cat << EOF
alias proxy+="\
export https_proxy=http://$proxy;
export http_proxy=http://$proxy;
export all_proxy=socks5://$proxy;
export no_proxy='localhost,127.0.0.1,::1';
echo 'proxy has been set to: $proxy';
curl myip.ipip.net;";
alias proxy-="\
unset http_proxy https_proxy all_proxy no_proxy;
echo 'proxy has been cleared';
curl myip.ipip.net;";
EOF
}
alias proxy#=proxy_alias;
# shell 函数,在 shell 中启用本机上代理
proxy_set() {
local host=`_get_host "${1:-$PROXY_DEFAILT_HOST_BACK}"`;
local port=`_get_port "$2"`;
local proxy=$host:$port;
export https_proxy=http://$proxy;
export http_proxy=http://$proxy;
export all_proxy=socks5://$proxy;
export no_proxy='localhost,127.0.0.1,::1';
echo "proxy has been set to: $proxy";
curl myip.ipip.net;
}
alias proxy+=proxy_set;
# shell 函数,在 shell 中停用本机上代理
proxy_clear() {
unset http_proxy https_proxy all_proxy no_proxy;
echo 'proxy has been cleared';
curl myip.ipip.net;
}
alias proxy-=proxy_clear;
|
使用说明
假设上面的代码位于 /path/to/proxy.sh
。要加载这个脚本,就在命令行运行如下命令
1
|
source /path/to/proxy.sh
|
或者修改当前用户所用 shell
的配置文件,对于 bash
就是 ∼/.bashrc
,对于 zsh
就是 ∼/.zshrc
。把上面的命令添加到对应的配置文件中去。
1
2
3
4
5
6
|
# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port
$ proxy@
export https_proxy=http://192.168.0.101:7890;
export http_proxy=http://192.168.0.101:7890;
export all_proxy=socks5://192.168.0.101:7890;
export no_proxy='localhost,127.0.0.1,::1';
|
上述命令输出几个 export
命令,可以在同一局域网中的任何 Linux
机器上的命令行中运行,便可启用代理。
如果要取消代理,在这台机器的命令行中运行
1
|
unset http_proxy https_proxy all_proxy no_proxy
|
- 打印 shell 命令,用于产生两个别名
proxy+
和 proxy-
1
2
3
4
5
6
7
8
9
10
11
|
# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port
$ proxy#
alias proxy+="export https_proxy=http://192.168.0.101:7890;
export http_proxy=http://192.168.0.101:7890;
export all_proxy=socks5://192.168.0.101:7890;
export no_proxy='localhost,127.0.0.1,::1';
echo 'proxy has been set to: 192.168.0.101:7890';
curl myip.ipip.net;";
alias proxy-="unset http_proxy https_proxy all_proxy no_proxy;
echo 'proxy has been cleared';
curl myip.ipip.net;";
|
上述命令输出几个命令,可以在同一局域网中的任何 Linux
机器上的命令行中运行,以生成别名:
proxy+
,在 shell 中启用代理
1
2
3
|
$ proxy+
proxy has been set to: 192.168.*.*:7890
当前 IP:*.*.*.* 来自于:美国 加利福尼亚州洛杉矶 Cogent 通信
|
proxy-
,在 shell 中停用代理
1
2
3
|
$ proxy-
proxy has been cleared
当前 IP:*.*.*.* 来自于:中国 浙江 杭州 电信
|
proxy+
,在 shell 中启用本机上代理
1
2
3
4
|
# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port
$ proxy+
proxy has been set to: 192.168.*.*:7890
当前 IP:*.*.*.* 来自于:美国 加利福尼亚州洛杉矶 Cogent 通信
|
proxy-
,在 shell 中禁用本机上代理
1
2
3
4
|
# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port
$ proxy-
proxy has been cleared
当前 IP:*.*.*.* 来自于:中国 浙江 杭州 电信
|