身為一名開發人員,每天透過 SSH 連線到遠端 Linux 主機進行維運或部署,可以說是家常便飯。如果不設定 SSH 金鑰登入 (Public Key Authentication) ,每次連線都要輸入密碼,長期下來不僅浪費時間,也容易打斷工作的節奏。雖然我們可以手動將本機的公鑰 (Public Key) 內容複製起來,然後貼到遠端主機的 ~/.ssh/authorized_keys 檔案中,但這個過程繁瑣且容易出錯。這篇文章我將介紹一個內建在 Linux 與 macOS 系統中非常實用的工具 ssh-copy-id ,讓你只要一行指令就能輕鬆完成設定,實現無密碼登入。

準備工作:產生 SSH 金鑰對
在使用 ssh-copy-id 之前,請確保你的本機已經產生了 SSH 金鑰對 (Key Pair)。如果還沒有產生,可以使用 ssh-keygen 指令來建立。目前建議使用更安全且效能更好的 Ed25519 演算法:
ssh-keygen -t ed25519 -C "your_email@example.com"
執行過程中直接按下 Enter 鍵使用預設路徑即可。完成後,你的公鑰會儲存在 ~/.ssh/id_ed25519.pub 。
使用 ssh-copy-id 傳送公鑰
有了公鑰之後,我們就可以使用 ssh-copy-id 將它傳送到遠端伺服器。
-
基本用法
這是最常見的使用情境,假設你要登入的遠端帳號是 user ,主機 IP 是 192.168.1.100 :
ssh-copy-id user@192.168.1.100
執行這個指令後,系統會嘗試用 SSH 連線到遠端主機。如果是第一次連線,會詢問你是否信任該主機的指紋 (fingerprint) ,輸入 yes 之後,接著會要求你輸入該遠端帳號的密碼。
一旦密碼驗證通過,ssh-copy-id 就會自動將你本機預設的公鑰 ( 例如 ~/.ssh/id_rsa.pub 或 ~/.ssh/id_ed25519.pub ) 附加到遠端主機的 ~/.ssh/authorized_keys 檔案末端,並且會自動調整遠端目錄與檔案的權限,確保 SSH Server 能正確讀取。
成功之後,你會看到類似以下的訊息:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@192.168.1.100'"
and check to make sure that only the key(s) you wanted were added.
-
指定特定的公鑰檔案
如果你電腦中有多組 SSH 金鑰,或者你的公鑰檔案名稱不是預設值,你可以透過 -i 參數來指定要傳送哪一個公鑰檔案:
ssh-copy-id -i ~/.ssh/my_custom_key.pub user@192.168.1.100
-
指定遠端 SSH 連接埠
如果你的遠端伺服器為了安全性考量,將 SSH 的預設 Port 22 改為其他埠號 (例如 2222) ,在使用 ssh-copy-id 時就需要特別指定。
在較新版本的 ssh-copy-id 中,可以直接使用 -p 參數:
ssh-copy-id -p 2222 user@192.168.1.100
如果你的系統版本較舊,發現不支援 -p 參數,可以嘗試將埠號設定包在引號中傳遞給 ssh :
ssh-copy-id "user@192.168.1.100 -p 2222"
常見問題與排除
-
權限問題
設定了 Public Key 之後要是還需要輸入密碼,通常都是因為遠端主機的檔案權限設定太過寬鬆所導致。SSH Server 為了安全起見,如果發現 .ssh 目錄或是 authorized_keys 檔案可以被其他人寫入,通常會拒絕使用 Key 登入。
ssh-copy-id 的好處在於它通常會幫你處理好這些權限問題。但如果你是手動複製,或者權限跑掉了,可以登入遠端主機執行以下修復指令:
# 確保家目錄權限不含群組與其他人的寫入權限
chmod g-w,o-w ~
# 設定 .ssh 目錄權限為 700
chmod 700 ~/.ssh
# 設定 authorized_keys 檔案權限為 600
chmod 600 ~/.ssh/authorized_keys
-
Windows 使用者的替代方案
ssh-copy-id 是 OpenSSH 套件中的一個 Shell Script,主要存在於 Linux 與 macOS 環境中。如果你是在 Windows 上使用 PowerShell 或 Command Prompt,預設可能沒有這個指令。
不過,如果你安裝了 Git for Windows,在 Git Bash 中是可以直接使用 ssh-copy-id 的。
如果你堅持要在 PowerShell 中完成類似的工作,可以使用以下指令來模擬 ssh-copy-id 的行為:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@192.168.1.100 "cat >> .ssh/authorized_keys"
當然,前提是遠端主機上的 .ssh 目錄必須先存在。
總結
使用 ssh-copy-id 可以大幅簡化 SSH 金鑰的佈署流程,避免手動複製貼上可能產生的錯誤 (例如多複製了換行符號)。設定好免密碼登入後,未來無論是使用 scp 傳輸檔案,或是透過 VS Code Remote - SSH 進行遠端開發,都能享受到更流暢的體驗。
相關連結