使用 VSCode 遠端連線伺服器的 SSH 許可權問題及解決方案

孤飞發表於2024-10-23

在使用 VSCode 遠端 SSH 連線時,可能會遇到檔案許可權問題導致連線失敗的情況。本文將詳細記錄如何為 SSH 配置檔案(config)和私鑰檔案(id_rsa)正確設定許可權,從而解決 VSCode 遠端連線和 SSH 無法免密登入的問題。

前置背景知識:VSCode使用Remote SSH連線遠端伺服器教程

問題背景

在 VSCode 中透過 SSH 連線遠端伺服器時,遇到了以下兩個主要問題:

  1. 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] ------
    
  2. 私鑰檔案(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 金鑰免密碼登入功能。

相關文章