以前使用 NLG 實驗室工作站時常會需要記下每台機器的 port 要如何連,感覺很不方便,於是就向學長學習,寫了類似像下面的 nlg
程式:
#!/bin/bash
NLG_WKS_3F={NLG_WKS_3F_HOST}
NLG_WKS_2F={NLG_WKS_2F_HOST}
case $1 in
[3-9])
ssh $USER@$NLG_WKS_3F -p 2200$MACHINE
;;
"a")
ssh $USER@$NLG_WKS_2F
;;
"b")
ssh $USER@$NLG_WKS_2F -p 22002
;;
*)
;;
esac
如此一來,要連線時,只要打以下指令就行了:
nlg b
後來才知道,其實可以使用 .ssh/config
來設定連線的 Hosts。於是修改 .ssh/config
如下:
Host nlg-wks-2
User {USER}
HostName {NLG_WKS_3F_HOST}
Port 22002
Host nlg-wks-b
User {USER}
HostName {NLG_WKS_2F_HOST}
Port 22002
如此一來,要連線時,只要打以下指令就行了:
ssh nlg-wks-b
然而,由於奇怪的 port 對應,使得這麼做必須在 .ssh/config
裡增加許多行數。後來才發現,其實可以用 ProxyCommand
來做到先自動連上其中一台機器,再自動從那台機器連到內網的其他機器。
在連外網連不到的機器時,用 ProxyCommand
而非自己連兩次 ssh 還有一個好處,就是可以把用來認證的 ssh private key 存在本機,而不存在 NLG-WKS 伺服器裡,避免被同學偷看 private key,但卻可以用這個 private key 在跳板過程裡,用來認證最後想連上的主機。
實際作法如下,首先在 .ssh/config
新增用來跳板的主機:
Host nlgs
Hostname {NLG_WKS_3F_HOST}
User {USER}
緊接著新增跳板項目:
Host nlg-wks-*
User {USER}
ProxyCommand ssh -q -W %h:%p nlgs
具體的意思是,在連 nlg-wks-*
機器時,會先連上 nlgs
機器,然後再從 nlgs
連 nlg-wks-*
(因此 nlgs
機器本身,要看得懂 nlg-wks-*
才行,幸好之前在處理 LDAP 時已經順便把 DNS 紀錄都設了)。
如此一來,就能用以下指令,先跳到一個主機,再跳到其他主機了:
ssh nlg-wks-b
如果是使用較新的 ssh client,也能改用 ProxyJump
:
Host nlg-wks-*
User {USER}
ProxyJump nlgs
如此一來,就能更方便的做實驗了。