MacOS設定終端代理

沒有氣的汽水發表於2021-12-26

前言

國內的開發者或多或少都會因為網路而煩惱,因為一些特殊原因有時候網路不好的時候需要使用代理才能完成對應的操作。原來我一直都是使用斐訊路由器然後刷了梅林的韌體,直接在路由器層面設定轉發代理,把一些國內網路不好的網站都走代理,這樣的好處就是不用每臺裝置都設定ssr。

後來工作了,就沒這麼方便了,但是工作裝置也比較固定嘛,開一下ssr也不費事。後來我發現一個怪事,同樣是一個git地址,chrome訪問正常可以zip下載,但是在終端裡面一直503。後來查詢資料才瞭解到,原來ssr的代理沒有辦法在終端生效,這樣很多東西都非常麻煩,更新on myzsh看運氣,在homebrew下載東西基本都掛,git克隆看天氣,docer下載映象等半天,使用國內各種為愛發電映象源也是參差不齊,怎麼用怎麼不爽,非常影響開發。於是研究了一下,在這這記錄下來。

檢視是否生效

因為後面會用到,所以提前說一下,因為要確認是否代理成功,我們可以使用curl這個命令,然後去獲取一些公益檢測ip的網站,curl後網站會返回你訪問它的這個公網ip,從而可以檢測你是否代理成功。下面提供兩個,因為有時候網站會掛掉(畢竟為愛發電網站)

curl cip.cc
curl ip.sb

image-20210625174713618

沒有代理成功(已打碼)

為什麼終端不會走代理

可以確定的是在mac下(其實win也是不會)使用ssr代理後不管是開全域性還是按照規則在終端都不會生效,但是關於原因眾說紛紜,大家都比較認可的理由是ssr代理類軟體預設是代理socket5,而終端是http。真的是這樣嗎,我們來看看

我們設定規則代理,然後檢查一下規則裡面代理的協議,可以看到確實是socket5
image-20210625174824044

可以看到確實代理的是socket5

image-20210625175018615

此時自然是終端沒代理成功

但是當我設定成全域性代理,並且開啟ssr的http代理設定以後,其實終端裡面也不會成功,並沒有什麼*用
image-20210625175124318
image-20210625175018615
那到底是什麼理由呢,其實我也不知道,但是我更同意stackExchange一位大佬給出的解釋,他說mac的shell和系統設定是兩套規則,shell是先於macOS誕生,在系統設定裡面的設定代理在終端其實是不會生效的,系統也不會幫你去按照終端規則去設定一下。如果想要終端代理生效,需要單獨對終端進行操作。
image-20210625180650261

大佬的解釋

我為什麼會比較認同呢,是因為ssr本身其實就是開了一個本地的代理服務,你給它這個固定埠發過去的請求它才會進行代理轉發然後返回,系統設定確實設定了網路的轉發到這個埠,但是可能這個設定不會對終端生效,如果需要終端生效需要單獨對終端設定,把終端裡面的網路請求都轉發到ssr啟動的這個埠上。

設定終端走代理

終端設定完全真正的代理需要配合外掛,比較麻煩,而且...主要是我自己設定代理都是一些臨時性的需求,所以這裡介紹一個簡單的代理方法。

主流shell中都有好幾個代理的系統變數,大多數的應用都遵循它,這裡簡單說三個,這裡使用了export的命令,我在另外一篇文章裡面說過,大家可以去翻一下,這個命令在當前的shell視窗中設定一個系統環境變數,這個變數只在當前shell視窗中生效,關閉再重新開啟一個shell視窗以後這個系統環境將失效,如果想要一直代理可以把這個環境變數寫入到啟動檔案中(例如~/.zshrc),啟動檔案介紹我也寫過一篇文章,大家可以翻一下。

# 代理http
export http_proxy="socks5://127.0.0.1:1080"
# 代理https
export https_proxy="socks5://127.0.0.1:1080"
# 代理所有協議,其中包括ftp等
export ALL_PROXY="socks5://127.0.0.1:1080"

其中的原因大家可以瀏覽參考中的2和3,常見的軟體命令都會使用這個系統環境變數,如果為空則直連如果有值則會轉發到這個變數的代理上。其中git還提供應用變數設定,設定它可以單純的讓git每次都走你設定的代理,並且每次開啟都會生效,因為這是git的軟體全域性設定

# 設定如下
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

# 取消如下
git unset http_proxy
git unset https_proxy

設定成功後,再進行檢測,已經代理到線路上面的ip、
image-20210625190042685

ladder就是上面那一堆命令的簡化

結合alias做到靈活代理

如果你看過我原來寫過的介紹linux快捷指令的文章,你可以結合其中的alias來完成更加靈活的代理,因為考慮到我們的使用場景,除了前面git可以單獨配置應用的全域性以後,我們好像在終端中不是那麼需要始終的代理設定,確實代理的頻寬和延遲上都沒有直連好,但是有時候需要的工具或者框架伺服器又在國外,不得不開代理。

雖然上面的命令可以解決這個問題,但是我很懶,然後每次執行上面一大堆命令,非常麻煩。使用alias設定一個快捷命令,然後每次輸入就可以開啟,用完關閉視窗下次再進來這個代理失效,只有需要的時候輸入一下,不用輸入一大串(往往這種命令,你都要開啟記事本,然後複製貼上)

alias ladder='export http_proxy=http://127.0.0.1:1087'
image-20210625185245486

我這樣配置已經夠用了

參考

  1. 為什麼terminal終端不能使用系統代理
  2. git config httpproxy
  3. using-homebrew-behind-a-proxy

更多有意思的文章歡迎大家來我的個人blog挖掘,點選這裡

相關文章