上一篇文章中,我們探討了 `ssh` 指令的基本用法與實用選項。然而,每次都手動輸入複雜的 IP、使用者名稱與埠號,實在是相當麻煩。\n此時,**SSH Config 檔案** 的使用能一次性解決這些煩惱。就像收藏夾一樣,將常用的伺服器連線資訊存起來,並以 **別名(Alias)** 方式快速連線。\n\n我自己在不知 Config 檔案存在的「完全新手」時期,曾經把常用的指令直接寫進 `.bashrc` 的 alias,隨後才發現自己使用了如此笨拙的方法。\n\n![發現 SSH config 的驚喜](/media/whitedec/blog_img/ssh_config_favorite_style.webp)\n\n---\n\n## SSH Config 檔案是什麼? {#sec-481141e7802b}\n\n**SSH Config 檔案** 是用來自訂 SSH 客戶端行為的設定檔。將特定主機的連線資訊(使用者名稱、埠號、使用的金鑰檔案等)預先存入,之後只需使用簡短的別名即可連線。\n\n* **位置:** 通常位於使用者主目錄下的 `.ssh` 資料夾,檔名為 `config`。若是第一次安裝 SSH,該檔案可能不存在,這時就需要自行建立。\n \n* **檔案建立:** 若 `~/.ssh/config` 不存在,請自行建立,並務必設定權限為 600。\n\n```bash\n\ttouch ~/.ssh/config\n\tchmod 600 ~/.ssh/config # 為安全起見,必須設定權限!\n\t```\n\n---\n\n## Config 檔案寫法規則 {#sec-a6ba2fff88f5}\n\nConfig 檔案是一個簡單的文字檔,每個主機的設定以 `Host` 關鍵字開始,並以區塊形式編寫。\n\n#### 基本結構\n\n````\nHost [別名]\n [選項1] [值1]\n [選項2] [值2]\n ...\n````\n\n* **`Host [別名]`**:此區塊的起始,定義您將使用的 **別名(Alias)**。別名也可以直接寫入實際主機位址(IP 或網域),亦可使用萬用字元(`*`、`?`)。\n* **縮排:** `Host` 下的選項必須縮排。可使用空格或 Tab,保持一致即可。\n* **選項:** `Host` 下列出的各項 SSH 選項,與 `ssh -選項` 的用法相同。\n\n### 常用選項 {#sec-488803d47bdf}\n\n| | | | | --- | --- | --- | | **選項** | **說明** | **範例值** | | `HostName` | 真實連線的伺服器 IP 或網域 | `192.168.1.100` 或 `example.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` | \n---\n\n## SSH Config 檔案寫法範例 {#sec-92c9daf3ee29}\n\n以下示範如何將常用伺服器加入 `~/.ssh/config`。\n\n```ini\n# 第一台伺服器:網頁伺服器(別名:webserver)\nHost webserver\n HostName 192.168.1.100\n User ubuntu\n Port 2222\n IdentityFile ~/.ssh/id_ed25519_webserver # 網頁伺服器專用金鑰\n\n# 第二台伺服器:開發伺服器(別名:devbox)\nHost devbox\n HostName dev.example.com\n User developer\n IdentityFile ~/.ssh/id_rsa_dev # RSA 金鑰\n # 連線時將本機 8000 埠轉發至遠端 80 埠\n LocalForward 8000 localhost:80 \n\n# 第三台伺服器:所有 AWS EC2 伺服器(別名:aws-*)\nHost aws-*\n User ec2-user\n IdentityFile ~/.ssh/aws_ec2_key.pem\n # 連線不斷線,定期送訊號\n ServerAliveInterval 60\n ServerAliveCountMax 3\n\n# 特定 IP 範圍的通用設定(別名:10.0.0.*)\nHost 10.0.0.*\n User admin\n Port 22\n```\n\n**說明:**\n\n* `webserver`:以 `ubuntu` 使用者、`2222` 埠號、`id_ed25519_webserver` 金鑰連線至 `192.168.1.100`。\n* `devbox`:以 `developer` 使用者、`id_rsa_dev` 金鑰連線至 `dev.example.com`,並將本機 8000 埠轉發至遠端 80 埠。\n* `aws-*`:所有以 `aws-` 開頭的別名皆套用此設定。\n* `10.0.0.*`:對於 `10.0.0.x` 形式的 IP,預設使用 `admin` 使用者與 22 埠。\n\n> 實際上,我很少使用萬用字元 `*` 的方式;通常會為每台伺服器單獨設定,方便管理。若同一台伺服器需不同設定,則可新增多個別名,像餐廳點餐一樣選擇。\n\n---\n\n![按下 SSH 連線按鈕,網路中迴盪的魔法圖像](/media/whitedec/blog_img/ssh_config_network_magic.webp)\n\n## Config 檔案使用方法 {#sec-e176d1ccdfce}\n\n設定完成後,實際連線變得更簡單。以下以範例為例。\n\n### 1. 以別名連線 {#sec-b0810f8f4908}\n\n只需使用別名即可執行 SSH 連線。\n\n* **使用 `webserver` 別名:**\n\n```bash\n ssh webserver\n Enter passphrase for key '/home/youruser/.ssh/id_ed25519_webserver':\n ubuntu@webserver-ip:~ $\n```\n\n> 這條指令實際上等同於 `ssh -p 2222 -i ~/.ssh/id_ed25519_webserver ubuntu@192.168.1.100`。\n\n* **使用 `devbox` 別名:**\n\n```bash\n ssh devbox\n Enter passphrase for key '/home/youruser/.ssh/id_rsa_dev':\n developer@devbox-domain:~ $\n```\n\n> 同時連線時,本機 8000 埠會轉發至 `dev.example.com` 的 80 埠。\n\n---\n\n## Config 檔案使用的優點 {#sec-2c234f7e8725}\n\n* **便利性:** 用簡短別名取代冗長複雜的 SSH 指令,減少輸入錯誤並節省時間。\n* **生產力:** 快速切換常用伺服器,提升工作效率。\n* **易於管理:** 所有連線設定集中於一個檔案,維護更方便;若伺服器 IP 變更,只需更新 Config 即可。\n* **安全性:** 重要資訊(如金鑰路徑)不會留在指令歷史中。\n\n---\n\n## 結語 {#sec-9c659c3d712e}\n\nSSH Config 檔案是所有使用 SSH 的開發者與系統管理員不可或缺的工具。透過此檔案,您可以將 SSH 連線體驗變得更順暢、更高效。打開 `~/.ssh/config`,為自己打造專屬別名吧!\n\n若想了解更多 SSH 相關內容,請在右側搜尋框輸入「ssh」即可找到相關文章。\n\n如有任何疑問,歡迎在下方留言提問!