Linux命令行开启代理

背景

我们在 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 脚本,已经在 bashzsh 中通过测试。

代码实现

文件名称为 proxy.sh,代码中端口的默认值 PROXY_DEFAILT_PORT 设为 7890,是 Clash 的默认端口,实现如下:

# AUTHOR="ChenyangGao "# 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。要加载这个脚本,就在命令行运行如下命令

source /path/to/proxy.sh

或者修改当前用户所用 shell 的配置文件,对于 bash 就是 ∼/.bashrc ,对于 zsh 就是 ∼/.zshrc。把上面的命令添加到对应的配置文件中去。

  • 打印 shell 命令,启用本机上代理
# 可接受 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 机器上的命令行中运行,便可启用代理。

如果要取消代理,在这台机器的命令行中运行

unset http_proxy https_proxy all_proxy no_proxy
  • 打印 shell 命令,用于产生两个别名 proxy+proxy-
# 可接受 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 中启用代理

$ proxy+proxy has been set to: 192.168.*.*:7890当前 IP:*.*.*.*  来自于:美国 加利福尼亚州洛杉矶 Cogent 通信

proxy-,在 shell 中停用代理

$ proxy-proxy has been cleared当前 IP:*.*.*.*  来自于:中国 浙江 杭州  电信
  • shell 函数,proxy+proxy-

proxy+,在 shell 中启用本机上代理

# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port$ proxy+proxy has been set to: 192.168.*.*:7890当前 IP:*.*.*.*  来自于:美国 加利福尼亚州洛杉矶 Cogent 通信

proxy-,在 shell 中禁用本机上代理

# 可接受 2 个参数,第 1 个参数指定 host,第 2 个参数指定 port$ proxy-proxy has been cleared当前 IP:*.*.*.*  来自于:中国 浙江 杭州  电信
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章