Please enable Javascript to view the contents

Linux命令行开启代理

 ·  ☕ 3 分钟  ·  🐵 chenyanggao

Linux代理设置

背景

我们在 Linux 命令行中,经常会需要使用代理(参考:How To Use Proxy Server To Access Internet at Shell Prompt With http_proxy VariableLinux Proxy Server Settings – Set Proxy For Command Line),以便能访问某些资源。
为了便于做到这一点,我以自己的偏好出发,编写了一个 shell 脚本,已经在 bashzsh 中通过测试。

代码实现

文件名称为 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。把上面的命令添加到对应的配置文件中去。

  • 打印 shell 命令,启用本机上代理
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:*.*.*.*  来自于:中国 浙江 杭州  电信
  • shell 函数,proxy+proxy-

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:*.*.*.*  来自于:中国 浙江 杭州  电信
分享

码中人
作者
Web Developer