2010/03/16

我的 alias 設定

我們可用 alias 這個指令來訂製常用的指令,非常方便。alias 設定通常是寫在 ~/.bashrc,以下是我目前的設定:
  • alias diff='colordiff -x .svn'
  • alias grep='grep --color=auto --exclude-dir=.svn'
  • alias ls='ls --color=auto'
  • alias svn='LANG=C /usr/bin/colorsvn'
其中:
  • diff 換成 colordiff,這樣顯示出來的結果比較容易判讀。另外,因為常有 Subversion 的專案,所以排除 .svn 這個不需比較的目錄。
  • grep 比較單純,預設就有顏色顯示。我只是加上排除 .svn 的設定。
  • ls 預設的就很好用了。
  • svn 換成 colorsvn,這樣顯示出來的結果比較容易判讀。

2010/03/04

用 ssh tunnel 建立分身

網路上可找到很多用 ssh tunnel 突破防火牆的 文章。此概念其實很簡單:若你能用 ssh 從 host L 連到 host R,那你就可以「人在 host L,但分身在 host R」或「人在 host R,但分身在 host L」。

舉例來說,公司的內部網站只能從公司內網的電腦連接 (如 host L);家中的內部網站只能從家庭網路的電腦連接 (如 host R)。若 host L 能 ssh 連到 host R,你在公司時就可以透過 host L 派遣分身到 host R,由 host R 去連接家中的網路;反之亦然 。

若要由 host L 派遣分身到 host R,就要在 host L 執行以下指令。這樣,連到 host L 的 port 5678 就相當於從 host R 連結到 host X 的 port 1234:
ssh -Nf -L 5678:host-X:1234 user@host-R
若要由 host R 派遣分身到 host L,就要在 host L 執行以下指令。這樣,連到 host R 的 port 5678 就相當於從 host L 連結到 host X 的 port 1234:
ssh -Nf -R 5678:host-X:1234 user@host-R
在實際的環境中,連結通常是單向的。當你人在 host R 時,並不一定能夠登入 host L 去建立通道。因此,你必須先在公司 (host L) 建好 ssh tunnel,然後回家時才能透過 host R 派遣分身。

在實際的環境中,連結通常也是脆弱的。你辛辛苦苦在 host L 建立的 ssh tunnel 可能因為各種原因斷掉而無法使用。要解此問題,可以利用 autossh。autossh 能夠偵測通道是否中斷,並在中斷時自動重建立。安裝方法:
apt-get install autossh
此時建立 ssh tunnel 的指令變成:
autossh -f -M 20000 \
-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" \
-N -R 5678:host-X:1234 user@host-R
其中 -M 20000 以及後續的 -o 是 autossh 偵測 tunnel 是否斷掉的參數。

因為安全的考量,"-R 5678:host-X:1234" 這種設定只允許從 host R 連接到 localhost 的 5678,這代表你無法從其他機器透過 host R 來派遣分身。以下方法,可以關閉此限制。
  1. 修改 host R 的 /etc/ssh/sshd_config,在其中新增一行 "GatewayPorts clientspecified"
  2. 在 host R 執行 "sudo /etc/init.d/ssh reload"
  3. 在 host L 將 "-R 5678:host-X:1234" 改成 "-R *:5678:host-X:1234" 然後重新執行前述 ssh 或 autossh 指令
PS: 若重新開機後也要保持這個 tunnel 不斷,可將 authssh 指令放在 /etc/rc.local。

2010/03/01

指定授權金鑰,SSH 登入不用密碼

工作時,一定有幾部 server 是你經常用 ssh 登入的。每次都老老實實輸入密碼是個好習慣,但在安全無虞的情況下,若能跳過輸入密碼,的確非常方便。

假設你要從 host-C 以不用密碼的方式登入 host-S,可按以下步驟來進行:
  1. 在 host-C 執行 ssh-keygen。問 passphrase 時直接 Enter,執行完會產生幾個檔案:private key (~/.ssh/id_rsa) 和 public key (~/.ssh/id_rsa.pub)
  2. Private key 請保管好,不要外流。然後將 public key 的內容加在 host-S 的 ~/.ssh/authorized_keys 之中 (若原本沒有此檔,就自己建立空檔)
若該做的都做了,host-S 還是跟你要密碼,請在 host-C 執行以下指令後再試試看:
ssh-add
參考資料: