最近 Shadowsock s 不穩定,極大的影響了工作效率。不過 ssh 還能連上自己的機器,所以掏出 ssh -D
滿足自己
#!/usr/bin/env bash
disable_proxy()
{
networksetup -setsocksfirewallproxystate Wi-Fi off
networksetup -setsocksfirewallproxystate Ethernet off
echo "SOCKS proxy disabled."
}
trap disable_proxy EXIT # Ctrl+C 的時候執行 disable_proxy
IP=127.0.0.1
PORT=`python -c 'import socket; s=socket.socket(); s.bind(("localhost", 0)); print(s.getsockname()[1]); s.close()'`
networksetup -setsocksfirewallproxy Wi-Fi $IP $PORT
networksetup -setsocksfirewallproxy Ethernet $IP $PORT
networksetup -setsocksfirewallproxystate Wi-Fi on
networksetup -setsocksfirewallproxystate Ethernet on
echo "SOCKS proxy enabled."
echo "Tunneling..."
ssh -ND $PORT root@xxx.xxx.xxx.xxx
2019.11.12 更新:
上面的已經夠用了,但是還不夠“智能”,所有網頁都通過代理來訪問, 國內的也網站也要繞一圈,沒能根據一個列表來決定哪些網址需要代理,哪些不需要。
要滿足這一點,需要 networksetup -setautoproxyurl networkservice url
networksetup -setautoproxyurl networkservice url
Set proxy auto-config to url forand enable it.
首先需要一個 .pac 文件,這個文件怎么搞到呢,可以從網上下載一個, 也可以自己寫。其實這個文件主要是一個函數, 類似這樣:
function FindProxyForURL(url, host) {
var proxy = "SOCKS5 127.0.0.1:1280; SOCKS 127.0.0.1:1280; DIRECT;"
var direct = 'DIRECT;';
if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) {
return proxy;
}
return 'DIRECT;'
}
我們修改后的 shell 腳本文件長這樣:
#!/usr/bin/env bash
# https://www.cnblogs.com/hangj/p/11838259.html
IP=localhost
FILE=proxy.pac
# 找到一個可用的 port
SOCKSPORT=`python -c 'import socket; s=socket.socket(); s.bind(("localhost", 0)); print(s.getsockname()[1]); s.close()'`
HTTPPORT=`python -c 'import socket; s=socket.socket(); s.bind(("localhost", 0)); print(s.getsockname()[1]); s.close()'`
URL=http://$IP:$HTTPPORT/$FILE
# 設置配置中的 port
sed "s/var proxy = .*/var proxy = \"SOCKS5 127.0.0.1:$SOCKSPORT; SOCKS 127.0.0.1:$SOCKSPORT; DIRECT;\";/" $FILE.bak > $FILE
python3 -m http.server $HTTPPORT --bind $IP &
echo "http server started."
disable_proxy()
{
ps -ef | grep "-m http.server $HTTPPORT" | grep -v grep | awk '{print $2}' | xargs kill
lsof -nP -i :$HTTPPORT | grep $HTTPPORT | awk '{print $2}' | xargs kill
networksetup -setautoproxyurl Wi-Fi " "
networksetup -setautoproxyurl Ethernet " "
echo "SOCKS proxy disabled."
}
trap disable_proxy EXIT
networksetup -setautoproxyurl Wi-Fi $URL
networksetup -setautoproxyurl Ethernet $URL
echo "SOCKS proxy enabled."
echo "Tunneling..."
ssh -ND $PORT root@xxx.xxx.xxx.xxx
我的配置文件地址:proxy.pac.bak
backup shadowsock.readme(base64)
PT09IHN0YXJ0L3N0b3Agc2hhZG93c29ja3MgJiYgc2hhZG93c29ja3MgY29uZmlnDQoNCiAgIGhvdyB0byBidWlsZCBzczogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMzAxMzIxNjAyNy80NjllN2I5ODhlZGRlN2U1ZjgwNmY1NWE5OTNiOWVmYQ0KICAgc3RhcnQgc3M6IHNzc2VydmVyIC1jIC9ldGMvc2hhZG93c29ja3MuanNvbiAtZCBzdGFydA0KICAgc3RvcCBzczogc3NzZXJ2ZXIgLWMgL2V0Yy9zaGFkb3dzb2Nrcy5qc29uIC1kIHN0b3ANCiAgIHNzIGNvbmZpZzogL2V0Yy9zaGFkb3dzb2Nrcy5qc29uDQoNCj09PSBhYm91dCBpcHRhYmxzDQogICBpbnN0YWxsIGlwdGFibGVz