在使用 VSCode 遠端 SSH 連線時,可能會遇到檔案許可權問題導致連線失敗的情況。本文將詳細記錄如何為 SSH 配置檔案(config
)和私鑰檔案(id_rsa
)正確設定許可權,從而解決 VSCode 遠端連線和 SSH 無法免密登入的問題。
前置背景知識:VSCode使用Remote SSH連線遠端伺服器教程
問題背景
在 VSCode 中透過 SSH 連線遠端伺服器時,遇到了以下兩個主要問題:
-
SSH 配置檔案(
config
)許可權問題:VSCode 提示Everyone
使用者組對config
檔案的許可權過高,要求只保留讀取許可權。報錯資訊:
[13:14:14.179] Log Level: 2 [13:14:14.192] Remote-SSH version: remote-ssh@0.111.2024040515 [13:14:14.193] win32 x64 [13:14:14.194] SSH Resolver called for host: guiyun [13:14:14.194] Setting up SSH remote "guiyun" [13:14:14.197] Using commit id "d994aede3529f4d1af9eeaeb234d32fd936243e7" and quality "insider" for server [13:14:14.199] Install and start server if needed [13:14:15.556] Got error from ssh: spawn C:\WINDOWS\System32\WindowsPowerShell\v1.0\ssh.exe ENOENT [13:14:15.556] Checking ssh with "C:\WINDOWS\System32\OpenSSH\ssh.exe -V" [13:14:15.596] > OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 [13:14:15.599] Running script with connection command: "C:\WINDOWS\System32\OpenSSH\ssh.exe" -T -D 5902 guiyun bash [13:14:15.601] Terminal shell path: C:\WINDOWS\System32\cmd.exe [13:14:15.845] > Bad permissions. Try removing permissions for user: \\Everyone (S-1-1-0) on file C:/Users/Administrator/.ssh/config. > Bad owner or permissions on C:\\Users\\Administrator/.ssh/config > 過程試圖寫入的管道不存在。 > ]0;C:\WINDOWS\System32\cmd.exe [13:14:15.845] Got some output, clearing connection timeout [13:14:17.122] "install" terminal command done [13:14:17.122] Install terminal quit with output: ]0;C:\WINDOWS\System32\cmd.exe [13:14:17.122] Received install output: ]0;C:\WINDOWS\System32\cmd.exe [13:14:17.123] Failed to parse remote port from server output [13:14:17.124] Resolver error: Error: at g.Create (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:499181) at t.handleInstallOutput (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:496503) at t.tryInstall (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:620043) at async c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:579901 at async t.withShowDetailsEvent (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:583207) at async k (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:576866) at async t.resolve (c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:580578) at async c:\Users\Administrator\.vscode-insiders\extensions\ms-vscode-remote.remote-ssh-0.111.2024040515\out\extension.js:2:846696 [13:14:17.126] ------
-
私鑰檔案(
id_rsa
)無法免密碼登入:SSH 提示id_rsa
私鑰檔案許可權不安全,導致無法免密碼登入。報錯資訊:
PowerShell 7.4.5 PS C:\Users\Administrator> ssh root@103.110.228.78 -p 22 Bad permissions. Try removing permissions for user: \\Everyone (S-1-1-0) on file C:/Users/Administrator/.ssh/id_rsa. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions for 'C:\\Users\\Administrator/.ssh/id_rsa' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "C:\\Users\\Administrator/.ssh/id_rsa": bad permissions root@103.110.228.78's password:
本文將介紹如何一步步解決這兩個問題,以便順利使用 VSCode 進行遠端 SSH 連線。
1. 為 SSH 配置檔案 config
設定許可權
VSCode 要求 config
檔案的許可權必須為只讀許可權,並且只限於當前使用者和 Everyone
使用者組讀取。如果許可權設定不當,VSCode 將無法正常使用遠端 SSH 功能。
步驟 1:檢查當前許可權
首先,檢查 config
檔案的當前許可權設定。開啟 PowerShell,並執行以下命令:
icacls "C:\Users\Administrator\.ssh\config"
檢查輸出中是否包含 Everyone
使用者組的許可權,特別關注是否有寫許可權(如 (W)
)。如果 Everyone
擁有寫許可權,這可能會導致 VSCode SSH 連線失敗。
步驟 2:設定 Everyone
只讀許可權
VSCode 要求 config
檔案的 Everyone
使用者組只能擁有讀取許可權。
確保移除 Everyone
的寫許可權:如果 Everyone
擁有寫許可權,我們需要確保完全移除它。執行以下命令來移除 Everyone
的寫許可權:
icacls "C:\Users\Administrator\.ssh\config" /remove "Everyone"
禁用許可權繼承:為了確保檔案不會從父目錄中繼承不必要的許可權,我們需要禁用許可權繼承:
icacls "C:\Users\Administrator\.ssh\config" /inheritance:r
這將禁用繼承的許可權,確保 config
檔案只使用當前手動設定的許可權。
為此,你可以透過以下命令賦予 Everyone
只讀許可權:
icacls "C:\Users\Administrator\.ssh\config" /grant "Everyone:R"
步驟 3:驗證許可權
執行完上述操作後,驗證許可權設定是否正確。執行以下命令:
icacls "C:\Users\Administrator\.ssh\config"
應該看到類似 Everyone:(R)
的輸出,表示 Everyone
使用者組只擁有讀取許可權,沒有寫許可權。這意味著檔案的許可權配置符合 VSCode SSH 連線的要求。透過這些步驟,你可以確保 config
檔案的許可權正確配置,從而解決 VSCode 遠端 SSH 連線的許可權問題。
步驟 4:驗證遠端連線命令
在完成檔案許可權的調整後,你可以透過 SSH 命令驗證遠端連線是否正常工作。確保你已經正確設定了 config
檔案的許可權並且已完成所有許可權修復步驟。
1. 在終端或 PowerShell 中執行以下命令:
ssh root@your.ip.exam.ple -p 22
root
:你希望使用的遠端伺服器的使用者名稱。your.ip.exam.ple
:你要連線的伺服器的 IP 地址。-p 22
:連線使用的埠號,預設是22
,可以根據需要調整。
2. 連線成功的情況:
如果配置正確,你將看到連線提示,可能會詢問你是否接受遠端伺服器的指紋資訊,像這樣:
The authenticity of host 'your.ip.exam.ple (your.ip.exam.ple)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
輸入 yes
後,你將被要求輸入密碼或使用 SSH 金鑰進行免密登入。
3. 連線失敗的情況:
如果仍然無法連線,請檢查:
config
檔案中的 IP、埠、使用者名稱是否正確。- 私鑰檔案(如
id_rsa
)的許可權是否設定正確,確保只有檔案所有者可以訪問。 - 遠端伺服器的防火牆或 SSH 服務是否配置正確。
完成後,你應該能夠成功透過 SSH 命令連線到遠端伺服器,並驗證 VSCode 的 SSH 遠端連線功能是否正常。
2. 解決 SSH 私鑰 id_rsa
檔案許可權過高問題
在配置 SSH 金鑰免密碼登入時,SSH 需要確保私鑰檔案的許可權非常嚴格,只有檔案所有者能訪問。如果許可權過於寬鬆(如 Everyone
也有許可權),SSH 將拒絕使用該私鑰。
步驟 1:禁用繼承許可權
首先,我們需要禁用私鑰檔案的繼承許可權,這樣檔案不會從上層目錄繼承不必要的許可權。
icacls "C:\Users\Administrator\.ssh\id_rsa" /inheritance:r
步驟 2:移除 Everyone
的許可權
確保 Everyone
不再擁有對私鑰檔案的任何許可權:
icacls "C:\Users\Administrator\.ssh\id_rsa" /remove "Everyone"
步驟 3:為 Administrator
設定讀取許可權
設定私鑰檔案的許可權,讓 Administrator
只擁有讀取許可權:
icacls "C:\Users\Administrator\.ssh\id_rsa" //grant:r "Administrator:(R)"
步驟 4:驗證許可權
再次驗證許可權,確保 Everyone
已被移除,且只有 Administrator
擁有讀取許可權:
icacls "C:\Users\Administrator\.ssh\id_rsa"
輸出應顯示類似於:
C:\Users\Administrator\.ssh\id_rsa DANCIPC\Administrator:(R)
步驟 5:驗證遠端連線命令
在完成檔案許可權的調整後,你可以透過 SSH 命令驗證遠端連線是否正常工作。確保你已經正確設定了 config
檔案的許可權並且已完成所有許可權修復步驟。
1. 在終端或 PowerShell 中執行以下命令:
ssh root@your.ip.exam.ple -p 22
root
:你希望使用的遠端伺服器的使用者名稱。your.ip.exam.ple
:你要連線的伺服器的 IP 地址。-p 22
:連線使用的埠號,預設是22
,可以根據需要調整。
2. 連線成功的情況:
如果配置正確,你將看到連線提示,可能會詢問你是否接受遠端伺服器的指紋資訊,像這樣:
The authenticity of host 'your.ip.exam.ple (your.ip.exam.ple)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
輸入 yes
後,你將被要求輸入密碼或使用 SSH 金鑰進行免密登入。
3. 連線失敗的情況:
如果仍然無法連線,請檢查:
config
檔案中的 IP、埠、使用者名稱是否正確。- 私鑰檔案(如
id_rsa
)的許可權是否設定正確,確保只有檔案所有者可以訪問。 - 遠端伺服器的防火牆或 SSH 服務是否配置正確。
完成後,你應該能夠成功透過 SSH 命令連線到遠端伺服器,並驗證 VSCode 的 SSH 遠端連線功能是否正常。
3. 解決 VSCode 遠端連線問題總結
在配置 SSH 時,正確的檔案許可權設定至關重要。VSCode 遠端連線要求 SSH 配置檔案 config
允許 Everyone
使用者組讀取許可權,而 SSH 私鑰檔案 id_rsa
必須嚴格禁止 Everyone
訪問。
- SSH 配置檔案(
config
):保留Everyone
的讀取許可權,移除寫許可權。 - SSH 私鑰檔案(
id_rsa
):移除所有使用者組的許可權,只保留當前使用者的讀取許可權。
透過調整這些許可權,VSCode 將能夠順利透過 SSH 進行遠端連線,同時 SSH 也能夠安全地使用私鑰進行免密碼登入。
如果你在使用 VSCode 遠端 SSH 時遇到類似問題,希望本文的解決方案能夠幫助你解決許可權相關的錯誤,提升工作效率。
參考命令列表
-
檢查檔案許可權:
icacls "C:\Users\Administrator\.ssh\config"
-
為
Everyone
設定只讀許可權:icacls "C:\Users\Administrator\.ssh\config" /grant "Everyone:(R)"
-
禁用繼承許可權:
icacls "C:\Users\Administrator\.ssh\id_rsa" /inheritance:r
-
移除
Everyone
許可權:icacls "C:\Users\Administrator\.ssh\id_rsa" /remove "Everyone"
-
為
Administrator
設定讀取許可權:icacls "C:\Users\Administrator\.ssh\id_rsa" /grant:r "Administrator:(R)"
-
驗證遠端連線命令
ssh root@your.ip.exam.ple -p 22
希望這篇部落格能夠幫助你順利解決 VSCode SSH 連線許可權問題並啟用 SSH 金鑰免密碼登入功能。