跳到主要內容

首頁 / 部落格 / 部署實戰

開發工具代理設定速查:Git、npm、pip、Go、Maven、SSH

部署實戰2026-06-101653 字約 4 分鐘
開發工具代理設定速查:Git、npm、pip、Go、Maven、SSH

命令列工具不讀系統代理。這篇把常用工具的設定方法集中列出來,按需要取用。

假設你的混合連接埠是 7897(在 Clash Verge 的連接埠設定裡確認,不同版本預設值不同)。

先試環境變數:能覆蓋一大半

大部分遵循 Unix 慣例的工具都認這幾個變數:

# macOS / Linux / WSL
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
export all_proxy=socks5://127.0.0.1:7897
export no_proxy="localhost,127.0.0.1,::1,*.local,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
# Windows PowerShell(當前會話)
$env:HTTP_PROXY  = "http://127.0.0.1:7897"
$env:HTTPS_PROXY = "http://127.0.0.1:7897"
$env:NO_PROXY    = "localhost,127.0.0.1,::1,*.local"
:: Windows CMD
set HTTP_PROXY=http://127.0.0.1:7897
set HTTPS_PROXY=http://127.0.0.1:7897

做成 shell 函式方便開關:

# ~/.zshrc 或 ~/.bashrc
proxyon() {
  export http_proxy=http://127.0.0.1:7897
  export https_proxy=$http_proxy
  export all_proxy=socks5://127.0.0.1:7897
  export no_proxy="localhost,127.0.0.1,::1,*.local"
  echo "✓ proxy on"
}
proxyoff() {
  unset http_proxy https_proxy all_proxy no_proxy
  echo "✗ proxy off"
}

Git

Git 有自己的設定系統,環境變數對 HTTPS 協議有效,對 SSH 協議無效。

# HTTPS 協議
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897

# 取消
git config --global --unset http.proxy
git config --global --unset https.proxy

# 查看當前設定
git config --global --get-regexp proxy

只對特定網域走代理(推薦,避免公司內網 Git 也走代理):

git config --global http.https://github.com.proxy http://127.0.0.1:7897

SSH 協議的 Git[email protected]:xxx.git)不走 http.proxy,需要配 SSH:

# ~/.ssh/config
Host github.com
  HostName github.com
  User git
  Port 22
  # macOS / Linux
  ProxyCommand nc -X connect -x 127.0.0.1:7897 %h %p
  # Windows(Git Bash 自帶 connect.exe)
  # ProxyCommand connect -H 127.0.0.1:7897 %h %p

npm / yarn / pnpm

# npm
npm config set proxy http://127.0.0.1:7897
npm config set https-proxy http://127.0.0.1:7897
npm config delete proxy && npm config delete https-proxy   # 取消

# yarn (v1)
yarn config set proxy http://127.0.0.1:7897
yarn config set https-proxy http://127.0.0.1:7897

# pnpm
pnpm config set proxy http://127.0.0.1:7897
pnpm config set https-proxy http://127.0.0.1:7897

設定寫在 ~/.npmrc,可以直接編輯:

proxy=http://127.0.0.1:7897
https-proxy=http://127.0.0.1:7897
noproxy=localhost,127.0.0.1,.company.com

Python / pip

# 單次使用
pip install --proxy http://127.0.0.1:7897 requests

# 永久設定
pip config set global.proxy http://127.0.0.1:7897
pip config unset global.proxy

設定檔位置:

  • Windows:%APPDATA%\pip\pip.ini
  • macOS/Linux:~/.config/pip/pip.conf
[global]
proxy = http://127.0.0.1:7897
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

requests 庫自己也讀環境變數,代碼裡也能顯式指定:

proxies = {
    "http": "http://127.0.0.1:7897",
    "https": "http://127.0.0.1:7897",
}
requests.get(url, proxies=proxies)

Go

# Go modules 走官方代理(通常夠用,不需要走本地代理)
go env -w GOPROXY=https://proxy.golang.org,direct

# 国內鏡像
go env -w GOPROXY=https://goproxy.cn,direct

# 私有倉庫不走 proxy
go env -w GOPRIVATE=*.company.com,github.com/myorg/*

# 需要走本地代理時(比如拉私有 GitHub 倉庫)
go env -w GOPROXY=direct
export HTTPS_PROXY=http://127.0.0.1:7897

Go 的 go get 遵循 HTTP_PROXY / HTTPS_PROXY 環境變數。

Java / Maven / Gradle

Maven~/.m2/settings.xml):

<settings>
  <proxies>
    <proxy>
      <id>clash</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>127.0.0.1</host>
      <port>7897</port>
      <nonProxyHosts>localhost|127.0.0.1|*.company.com</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

Gradle~/.gradle/gradle.properties):

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=7897
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=7897
systemProp.http.nonProxyHosts=localhost|127.0.0.1|*.company.com

JVM 命令列參數

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=7897 \
     -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=7897 \
     -Dhttp.nonProxyHosts="localhost|127.0.0.1" -jar app.jar

Rust / Cargo

~/.cargo/config.toml

[http]
proxy = "http://127.0.0.1:7897"

[https]
proxy = "http://127.0.0.1:7897"

curl / wget

# curl 單次
curl -x http://127.0.0.1:7897 https://example.com
curl --socks5 127.0.0.1:7897 https://example.com

# curl 永久(~/.curlrc)
echo 'proxy = "http://127.0.0.1:7897"' >> ~/.curlrc

# wget 永久(~/.wgetrc)
cat >> ~/.wgetrc <<'EOF'
use_proxy = on
http_proxy = http://127.0.0.1:7897
https_proxy = http://127.0.0.1:7897
EOF

系統包管理器

# apt(/etc/apt/apt.conf.d/95proxy)
echo 'Acquire::http::Proxy "http://127.0.0.1:7897";' | sudo tee /etc/apt/apt.conf.d/95proxy
echo 'Acquire::https::Proxy "http://127.0.0.1:7897";' | sudo tee -a /etc/apt/apt.conf.d/95proxy

# dnf/yum(/etc/dnf/dnf.conf 裡加)
# proxy=http://127.0.0.1:7897

# Homebrew(macOS)—— 讀環境變數
export ALL_PROXY=socks5://127.0.0.1:7897
brew install xxx

一張速查表

工具設定方式是否讀環境變數
curl / wget-x 參數或 .curlrc
Git (HTTPS)git config http.proxy
Git (SSH)~/.ssh/config 的 ProxyCommand
npm / yarn / pnpm.npmrc⚠️ 部分版本
pippip.conf
Go環境變數 + GOPROXY
Mavensettings.xml
Gradlegradle.properties
Cargo.cargo/config.toml
Docker daemonsystemd drop-in
apt / dnf各自設定檔⚠️ sudo 下會丟
Homebrew環境變數

為什麼設了環境變數還是不行

常見原因工具有自己的設定系統(Maven、Gradle、Docker daemon)—— 必須寫設定檔用了 sudo,環境變數沒傳過去 —— 加 -E環境變數只在當前 shell 生效 —— 新開的終端沒有大小寫問題 —— 有的工具只認小寫 http_proxy工具走的是 SSH 協議而不是 HTTP —— 需要配 ProxyCommandno_proxy 太寬,把目標網域也排除了

更省事的方案:開 TUN

上面這些設定加起來很繁瑣,而且每裝一個新工具可能又要配一遍。

開 TUN 模式後,所有命令列工具自動走代理,一個都不用配。

代價是需要虛擬網路卡權限,且要注意把內網段加進直連規則:

prepend-rules:
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - DOMAIN-SUFFIX,company.com,DIRECT
兩種思路的取舍逐個設定精確可控,只有想不需要額外權限工具多時很繁瑣適合伺服器TUN 模式一次配好,所有工需要虛擬網路卡權限可能與容器VPN 衝突適合開發機

驗證

# 看當前出口 IP
curl https://api.ipify.org

# 看 Git 走沒走代理(-v 會列印連接資訊)
GIT_CURL_VERBOSE=1 git ls-remote https://github.com/git/git 2>&1 | head -20

# 看 npm 設定
npm config list | grep -i proxy

也可以打開 Clash Verge 的連接頁,執行命令時觀察有沒有新連接出現——有就說明流量走過來了。

小結

  • 先試環境變數,能覆蓋 curl、pip、Go、Cargo、Homebrew 等一大批
  • Git、npm、Maven、Gradle、Docker 有自己的設定系統,必須單獨配
  • SSH 協議要用 ProxyCommand,或者改用 443 連接埠
  • no_proxy 必須設,否則本地和內網服務全廢
  • sudo 記得加 -E
  • 嫌麻煩就開 TUN,但要配好內網直連規則

相關:Docker 與 WSL2 代理行程規則詳解


相關文件

讓 Docker 和 WSL2 用上宿主機的 Clash 代理
部署實戰 讓 Docker 和 WSL2 用上宿主機的 Clash 代理

容器裡的 127.0.0.1 不是宿主機。這篇給出 Docker 構建期、執行期、daemon 拉取鏡像三種場景的設定方法,以及 WSL2 網路模式差異下的兩套方案。

2026-06-141716 字約 4 分鐘