透過 SSH Tunnel 來進行 port selfupdate

因為工作的地方網路被擋掉很多 port,所以 MacPorts 的 selfupdate 走的 rsync 也不能用了,理論上應該可以走一些 ssh tunnel 來達成,所以跟著 — Tunneling rsync through SSH to permit selfupdate from behind a firewall — 描述的作法,也設定了一組。

首先,要有一組可以正常 ssh 連線的主機: ex. foo.example.bar

透過在 ssh 主機上執行 nc 程式來 mirror rsync.macports.org

ssh foo.example.bar "nc rsync.macports.org 873"

此時若出現

@RSYNCD: 30.0

表示成功的 mirror。

建立一組 key 可以免除登入時輸入帳號密碼的繁瑣

ssh-keygen -f macports_rsync_key
(建議不輸入 passphrase,不然進行 selfupdate 時,共要再輸入三次)

在 public key file: macports_rsync_key.pub 前附加

'command="nc rsync.macports.org 873",no-port-forwarding,no-X11-forwarding,no-agent-forwarding '

有個 shell script 可以簡單的完成這任務

echo -n 'command="nc rsync.macports.org 873",no-port-forwarding,no-X11-forwarding,no-agent-forwarding '|cat - macports_rsync_key.pub > /tmp/out && mv /tmp/out macports_rsync_key.pub

將 macports_rsync_key.pub 上傳到 ssh 主機的 ~/.ssh/ ,若已有 authorized_keys 便附加於其後,若無,將 macports_rsync_key.pub 更名為 authorized_keys

同時存在多筆 identity 時會發生一些問題,解決的方法請見 — 使用多個 Identity 登入單一 Host

此時若執行

ssh -i ~/.ssh/macports_rsync_key foo.example.bar

若出現

@RSYNCD: 30.0

表示成功。

修改 /opt/local/etc/macports/macports.conf,於 rsync_options 加入

-rtzv --delete-after -e "ssh -F /Full_Path_Of_Home/.ssh/config alias_host -i /Full_Path_Of_Home/.ssh/macports_rsync_key -l userid"
(因為單一 host 存在多重 identity 的緣故,故需指定 -F config_file 及使用 alias_host,若無此困擾者則免)
(因為 selfupdate 需以 sudo 進行,故需指定 -l userid)

目前這樣就可以透過 ssh tunnel 來進行 port selfupdate 啦!

2012.09.01