動機と目指すこと
- 学内限定とかのコンテンツを触れる状態で長時間作業したい。
- ネットワーク遮断とかでsshが死んだときにsocksプロキシの設定を戻さないとwebページ見れなくなるのだるい。
- ssh接続→socksプロキシonの作業を毎回ポチポチやるのが面倒なので自動化したい。
環境
- MacOS Big Sur (11.6.2)
- ポートフォワード飛ばす先にはssh公開鍵によりパスワード無しで入れること前提。(パスワードを都度求められるだけなので実行はできる。)
手順
autossh
ssh接続が切れたら自動で再接続してくれる。brewから簡単に入手できる。
$ brew install autossh
スクリプト組む
スクリプトを組んでいく。ファイルの場所はどこでもいいが、とりあえずデフォルトでパスが通っているところで解説する。
スクリプトを書く。
$ vi /usr/local/bin/sproxy
中身はこれ。
sproxy
#!/bin/zsh
port=10080
method='wi-fi'
#--------------------------------------------------------------------
function trap_exit() {
networksetup -setsocksfirewallproxystate $method off
echo 'display notification "OFF" with title "proxy"' | osascript
}
trap trap_exit 1 2 3 15
#--------------------------------------------------------------------
networksetup -setsocksfirewallproxy $method localhost $port
echo "Turning on proxy"
networksetup -setsocksfirewallproxystate $method on
echo 'display notification "ON" with title "proxy"' | osascript
echo "Starting SSH Dynamic Port Forwarding to Port $port..."
autossh -M 0 -D $port -C -Nv host
-
port
は好きなのを使っていい(5桁台がベター)。 -
method
は有線ならethernet
を指定する。 - 最後の行の
host
は自分のssh接続先を指定。いつもの書き方でok。ログが鬱陶しければv
オプションを消しても良い。
実行権限の付与をしておく。
chmod +x /usr/local/bin/sproxy
実行
$ sproxy
これでsocksプロキシがon
になった。
終了したいとき
放って置くと常にプロキシを介した通信になる。終了したいときはCtrl+C
でスクリプトを止めてやれば良い。
スクリプトの簡単な解説
-
networksetup -setsocksfirewallproxy $method localhost $port
はwi-fi
のsocksプロキシで利用するサーバーをlocalhost
の10080
ポートに指定している。
GUIで言うと↓を指定していることに対応する。
-
networksetup -setsocksfirewallproxystate $method on
はsocksプロキシをon
にする。画像で言えばチェックボックスにチェックを入れる作業。 -
autossh -M 0 -D $port -C -Nv host
でautossh
によるsshコネクションの半永続化をする。-M
は0
を指定すると、ssh切断時に再接続するようになる。その他のオプションは通常のssh
と同じ。 - 最後に
trap trap_exit 1 2 3 15
でプロセスの終了前にsocksプロキシのoff
をねじ込む。本当はtrap trap_exit EXIT
だけでいいはずだが、なぜか動かない。。。まあ基本Ctrl+C
での終了により異常終了シグナルが出るので問題ない。