SSH 連線偷吃步的小技巧,SSH Config
當我們需要連線到遠端的伺服器的時候,可以使用 SSH (Secure Shell) 連線這個工具進行遠端伺服器的登入,基本的 SSH 連線指令如下。
ssh user@host.com.twuser 為要連線的帳號名稱,host 為要連線的遠端伺服器位址,可以為 IP 或是 Domain name。
指令輸入完畢之後,根據遠端伺服器上的 SSH 設定,可以使用密碼或是金鑰的方式進行認證,認證成功才能登入遠端伺服器。
# 如果使用密碼登入,在輸入指令後還需要輸入密碼
ssh user@host.com.tw
# user@host.com.tw's password:在大多情況下,要管理的伺服器可能不只一個,如果數量一多,每次登入都要找對應伺服器的帳號、密碼與金鑰,會是一件很麻煩的事情,雖然可以用 alias 偷吃步。
alias ssh-to-server="ssh user@host"但 SSH 其實本身就有內建一個更便利的方法 SSH Config。
首先先在 .ssh 資料夾底下建立一個 config 檔案。
touch ~/.ssh/config之後就可以在 config 中進行設定,假設我們有一個 CRM 的後台伺服器。
Host crm
Hostname 49.159.176.123
User crm-admin
Port 22
identityfile /path/Key.pem- Host:連線名稱。
- Hostname:遠端伺服器的位址。
- User:帳號。
- Port:遠端伺服器的 Port 號。
- identityfile:金鑰檔案位址。
設定完畢之後就可以直接輸入連線名稱就可以連線,少打很多字。
ssh crm透過 Bation 連線的設定
有時候我們的伺服器不會開放對外連線,如果想要連線,必須經由另外一台特定的伺服器當作跳板才能連上,通常這種跳板被稱為 bastion,這個時候可以使用 Proxy Jump 的方式來進行連線。
Host crm
Hostname 49.159.176.123
User crm-admin
Port 22
identityfile /path/private_key
Host private-crm
Hostname 192.168.0.54
User private-crm-admin
ForwardAgent yes
ProxyJump crm上述的設定檔中 private-crm 只能透過 crm 伺服器去連線。
ForwardAgent 這個參數允許讓本地的 SSH Key 在遠端 Server 上進行傳送,但記得要開啟 ssh-agent,並將連線的 SSH Key 加入 ssh-agent。
ssh-add /path/private_key如果你使用 oh-my-zsh,可以在 .zshrc 的 plugin 中加入 ssh-agent,這樣 oh-my-zsh 會自動啟動 ssh-agent。
完成設定之後,就可以使用 ProxyJump 將 crm 設定為跳板,這時候連上 private-crm 就可以簡單一行指令。
ssh private-crm讓多個 SSH 連線共用相同的設定
如果你有多個 SSH 連線使用相同的設定,你可以新增一個共用設定讓這些連線一起使用。以下面的設定檔案為例,可以看到所有的連線除了 Hostname 的 IP 不同之外,其餘部分都是使用相同的設定。
Host aws-1
Hostname 49.159.176.123
User ubuntu
Port 22
identityfile /path/Key.pem
Host aws-2
Hostname 49.159.176.124
User ubuntu
Port 22
identityfile /path/Key.pem
Host aws-3
Hostname 49.159.176.125
User ubuntu
Port 22
identityfile /path/Key.pem這樣子的情況可以透過共用設定來精簡設定的內容。
首先新增一個共用設定,並將 Host 設定為 aws-*,並將其他連線相同的設定都放在共用設定底下。共用設定與一般連線設定幾乎無異,唯一的差別是 Host 名稱包含了萬用字元 (wildcard) *。
Host aws-*
User ubuntu
Port 22
identityfile /path/Key.pem接下來刪除其他連線設定中相同的設定。Host 名稱有匹配到共用設定的話,就會直接使用共用設定。如此一來就可以少寫很多重複的內容,是不是很讚呢?😆
Host aws-1
Hostname 49.159.176.123
Host aws-2
Hostname 49.159.176.124
Host aws-3
Hostname 49.159.176.125引入其他設定檔案
SSH Config 的設定預設是讀取 ~/.ssh/config 檔案,如果你需要管理非常多的主機,擁有很多的 SSH 連線設定,那麼你的 config 檔案可能會很冗長。
為了方便閱讀,可以將連線設定放在其他檔案,利用檔案名稱來整理 SSH 連線,然後在 config 檔案中使用 Include 語法引入其他檔案的連線設定。
首先在 .ssh 資料夾底下新增一個新的資料夾 config.d,用來放 SSH 的連線設定檔案。
cd ~/.ssh
mkdir config.d在 ~/.ssh/config.d 下建立一個 aws.config 檔案。
touch aws.config在 aws.config 中新增一個連線設定。
Host aws-4
Hostname 49.159.176.126然後在 config 檔案中引入剛剛新增的 aws.config 檔案。
Include ~/.ssh/config.d/*這樣你就可以使用 aws-4 的連線設定了。
參考資料
- Secure Shell - 維基百科,自由的百科全書 (wikipedia.org)
- SSH config file syntax and how-tos for configuring the OpenSSH client
- SSH agent forwarding 的應用 – ihower { blogging }
- Is there a way for one SSH config file to include another one?