因為工作的地方網路被擋掉很多 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