在上篇文章中,我們探討了 ssh 命令的基本使用方法和一些有用的選項。不過每次都要手動輸入複雜的 IP 地址、用戶名和端口號碼,的確是相當麻煩。這時可以利用 SSH Config 文件 一次性解決這些麻煩。就像書籤一樣,可以儲存經常使用的伺服器連接資訊,並通過 別名(Alias) 輕鬆連接的神奇文件。

將 SSH config 作為書籤使用的開發者插圖


什麼是 SSH Config 文件?

SSH Config 文件 是用於用戶定義 SSH 客戶端運作方式的設置文件。如果將特定主機的連接資訊(用戶名、端口、所使用的密鑰文件等)預先存儲在此文件中,後續連接時只需使用簡短的別名就可以連接。

  • 位置: 通常存在於用戶主目錄的 .ssh 文件夾內,名為 config
    • 示例:~/.ssh/config
  • 文件創建: 如果 ~/.ssh/config 文件不存在,可以手動創建。

    bash touch ~/.ssh/config chmod 600 ~/.ssh/config # 出於安全考慮,只授予所有者讀取/寫入權限


Config 文件編寫規則

Config 文件是簡單的文本文件,對於每個主機的設置都是以 Host 關鍵字開始,並以區塊形式編寫。

基本結構

Host [別名]
    [選項1] [值1]
    [選項2] [值2]
    ...
  • Host [別名]: 標識該區塊的開始,您將使用的 別名(Alias) 在這裡定義。這個別名將在 SSH 命令中使用。也可以直接放入真實的主機地址(IP 或域名)。還可以使用通配符(*, ?)。

  • 縮排: Host 下的選項必須 縮排。可以使用空格或製表符,但建議保持一致性。

  • 選項: Host 下列出各種在通過該別名連接時應用的 SSH 選項。這些選項與之前使用的 ssh -選項 形式相同。

常用選項

選項 描述 示例值
HostName 實際連接的伺服器 IP 地址或域名 192.168.1.100example.com
User 連接到遠端伺服器的用戶帳戶名稱 ubuntu, ec2-user, root
Port 遠端伺服器的 SSH 端口號(預設為 22) 2222
IdentityFile 登入時使用的私鑰文件路徑 ~/.ssh/id_ed25519_myserver
ForwardAgent 啟用 SSH 代理轉發(Agent Forwarding,使用 ssh-agent 時) yes
StrictHostKeyChecking 是否嚴格執行主機密碼檢查(建議 yes no(在初始測試期間暫時使用)
PortForwarding 是否允許端口轉發 yes
LocalForward 本地端口轉發設置(與 -L 選項相同) 8080 localhost:80
ServerAliveInterval 檢查伺服器是否存活的間隔(秒) 60(防止斷開連接)
ServerAliveCountMax 在鏈接斷開之前重新嘗試的次數 3

SSH Config 文件編寫示例

讓我們將一些經常連接的伺服器設定添加到 ~/.ssh/config 文件中。

# 第一台伺服器:網頁伺服器(別名:webserver)
Host webserver
    HostName 192.168.1.100
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_webserver # 使用網頁伺服器專用密鑰

# 第二台伺服器:開發伺服器(別名:devbox)
Host devbox
    HostName dev.example.com
    User developer
    IdentityFile ~/.ssh/id_rsa_dev # 使用 RSA 密鑰
    # 在連接到此伺服器時,將本地 8000 端口轉發到遠端伺服器的 80 端口
    LocalForward 8000 localhost:80 

# 第三台伺服器:所有 AWS EC2 伺服器(別名:aws-*)
Host aws-*
    User ec2-user
    IdentityFile ~/.ssh/aws_ec2_key.pem
    # 定期發送信號以保持連接不斷開
    ServerAliveInterval 60
    ServerAliveCountMax 3

# 特定 IP 範圍的一般設置(別名:10.0.0.*)
Host 10.0.0.*
    User admin
    Port 22

說明:

  • webserver: 使得可以使用 ubuntu 用戶通過 2222 端口和 id_ed25519_webserver 密鑰連接到 192.168.1.100 伺服器。

  • devbox: 使用 developer 用戶透過 id_rsa_dev 密鑰連接到 dev.example.com 伺服器,同時將本地 8000 端口轉發到遠端 80 端口。

  • aws-*: 應用於所有以 aws- 開頭的別名的設置。例如,當連接到 aws-prodaws-dev 時,UserIdentityFile 設置將被自動應用。當連接到 aws-prod 時,HostName 將為 prod(稍後將在 ssh aws-prod 命令中使用)。

  • 10.0.0.*: 連接到 10.0.0.x 形式的 IP 地址時,將自動適用 admin 用戶和預設 22 端口。


按下SSH接入按鈕,網絡上傳播的魔法般的圖像

Config 文件的使用方法

現在如果已將設置儲存在 Config 文件中,實際連接將變得簡單得多。我們來看看以上的示例。

1. 使用別名連接

只需使用別名執行 SSH 連接命令。

  • 使用 webserver 別名:
    ssh webserver
    Enter passphrase for key '/home/youruser/.ssh/id_ed25519_webserver':
    ubuntu@webserver-ip:~ $
此命令在內部運行時與 `ssh -p 2222 -i ~/.ssh/id_ed25519_webserver ubuntu@192.168.1.100` 的運行方式相同。
  • 使用 devbox 別名:
    ssh devbox
    Enter passphrase for key '/home/youruser/.ssh/id_rsa_dev':
    developer@devbox-domain:~ $
(同時通過本地 8000 端口連接到 dev.example.com 的 80 端口)
  • 使用 aws-prod(通配符別名):
    ssh aws-prod
    Enter passphrase for key '/home/youruser/.ssh/aws_ec2_key.pem':
    ec2-user@aws-prod-hostname:~ $

注意:aws-prod 這種未明確指定主機名的通配符 Host,可能需要明確指定 HostName 選項,或在命令行中提供主機名。由於上面的 aws-* 示例未指定 HostName,當實際執行 ssh aws-prod 時,SSH 客戶端將試圖將 prod 解讀為主機名。為了更清楚的使用,通常會將 Host prod-server 的別名與 HostName prod.example.com 進行映射。


使用 Config 文件的優點

  • 便利性: 用短別名替換冗長且複雜的 SSH 命令,減少輸入錯誤並節省時間。
  • 生產力: 可以快速在經常連接的伺服器之間切換,提高工作效率。
  • 易於管理: 所有連接相關的設置都可以集中管理,維護也變得更簡單。例如,即使伺服器的 IP 地址發生變化,只需修改 Config 文件即可。
  • 安全性: 無需將敏感信息(例如密鑰文件路徑)保留在命令歷史中。

總結

SSH Config 文件是每位使用 SSH 的開發者和系統管理員必備的工具。通過使用這個文件,您可以使您的 SSH 連接體驗變得更加便利和高效。打開 ~/.ssh/config 文件,創建您自己的別名吧!

還可以一起閱讀與 SSH 相關的其他文章!在右側搜索框中搜索 'ssh' 可以找到許多有關 ssh 的文章。

如果有任何疑問,隨時在評論中提出問題!