在 Windows 上架設 SSH 服務(使用 Git Bash)

網路上隨便就可以搜尋到「如何從 Windows 使用 SSH 連線 Linux 主機」、 以及「如何架設 Linux SSH 服務」等主題, 但反過來討論「如何使用 SSH 連線 Windows 主機」的話題就很少了, 而這這也是我寫這篇文章的主要原因, 於是這裡要來教你如何在 Windows 上架設 SSH 服務。

為什麼要在 Windows 上架設 SSH 服務?

我自己有研發跨平臺應用的需求,需要隨時測試一些東西在 Windows 上的執行效果, 或是執行一些必須在 Windows 上面執行的處理工作, 無論這臺 Windows 到底是實體機器還是虛擬機器,頻繁的切換不同操作環境都讓人有所煩躁, 才會這麼殷殷期盼一個能夠使用 SSH 連線並直接操作的作業環境。

一般來說在 Windows 上面架設 SSH 服務的資料比較少,因為以往有這樣需求的群眾少。 SSH 原先是流行在 UNIX like 環境下的遠端連線機制, 由於伺服器領域是 Linux 佔大宗而終端桌面是 Windows 佔大宗, 因此詢問如何從 Windows 透過 SSH 連線至 Linux 的詢問與解答自然多; 反之從 Linux 終端連線 Windows 伺服器的需求便非常低, 況且通常會熟悉並選用 Windows 作為伺服器系統的人,通常更習慣使用 RDP 遠端桌面連線登入操作; 最終大概只有像我這樣平常使用 Linux,因故需要連線登入 Windows 機器的人, 才會對這種連線方案感到興趣。 好在近年因為微軟推出的 Bash on Ubuntu on Windows 軟體方案 (後來變成 Windows Subsystem for Linux (WSL)), 拉攏了一票原本的 Windows 使用者有機會去習慣和適應 Bash 的操作體驗, 這才讓更多的人有了想要在遠端登入的情況下在 Windows 上面繼續延續 Bash 體驗的想法吧!

在 Windows 上架設 SSH 服務的幾個主流方案

在有了使用的動機之後,蒐集網上現有的對於 Windows 架設 SSH 服務的方法的方案, 整理得到了主要流傳的三種方案如下:

  1. 使用 Windows 10 內捆綁的 SSH 服務
  2. 安裝使用 OpenSSH
  3. 安裝使用 Git

安裝 OpenSSH 是最原汁原味的方案,也是早先時候的唯一選擇; 缺點就是這方案之下真的就只有單純的 SSH 而已,我想因該沒有人單純只是想要體驗 SSH 連線的感覺! 所以安裝了 OpenSSH 之後,可能還要移植很多自己需要的一眾相關程式工具。

從 Windows 10 的 1809 版開始,內建捆綁了 SSH 功能,成為當前的主流方案, 可能是因為這個系統內建的服務和 WSL 環境最原生協作順暢的緣故; 缺點就是這個服務預設並沒有啟用、也沒有安裝,要去啟動這個服務還需要一些神奇又繁瑣的操作, 並且只能在 Windows 10 以上才能夠實現, 對於我這種還在使用 Windows 7 或甚至 Windows XP 的人而言更是無緣。

最終對我而言最佳的便是第三個方案,使用 Git for Windows。 當然哪一個方案最好這件事很可能需要審視您自己的應用場景,對我最適用的東西不見得對你也是, 因此我只是列出了我為什麼選用 Git 方案的考量,好讓你可以快速判斷你的需求與我的想法是否相合?

我之所以最終選擇使用 Git 方案,其相對其它方案的一些優點如下:

  1. 我本來就有在使用 Git,所以對其並不陌生,甚至有得時候即便我不需要 SSH,也是需要 Git 的。

  2. Windows 版的 Git 安裝簡便,更重要的是它還夾帶了 Bash 環境, 讓我不需要另外安裝移植什麼東西就能擁有一個功能豐富的 Bash 使用體驗。

  3. 除了 Bash 本身之外,還包裹了一眾在 Linux 下常用的基本工具程式。 這使得我不只擁有 Bash 環境,還可以延續許多在 Linux 上的使用習慣、工具、和腳本等等, 也不用改寫 BAT 腳本,大多情況下可以直接通用一個 Shell Script 腳本。

  4. Git 可以安裝執行在 Windows 7 和 Windows XP 系統上。

也因為上述這些原因,一直以來在 Windows 上我都把 Git 當成 Bash 來使用, 即便沒有要在上面做軟體開發工作,也會安裝 Git 來用。 因此為我來說,使用 Git 方案省事方便,不用再安裝其他東西,還能和原來的使用環境整合在一起, 是所有方法裡面最優良的方案。

安裝與配置

  1. 首先下載安裝 Git for Windows

    其中若您的系統是 Windows XP 的話, v2.10.0 是最後一個支援 Windows XP 的版本。

  2. 安裝完成後,電腦上就會出現 Git Bash 程式(在開始程式集裡)。 對其點擊右鍵,點選「內容」,在「相容性」頁面下勾選「以系統管理員的身份執行此程式」。

  3. 執行 Git Bash 程式(以系統管理員身份)。 以下各步驟除有特別說明之外,都是在此環境下執行的。

  4. 產生服務器金鑰:

    ssh-keygen -A
    
  5. 編輯 SSH 設定檔 /etc/ssh/sshd_config

    SSH 設定檔的內容請按自己的需求修改,絕大部份和 Linux 上的 SSH 設置沒有不同, 但提醒若不打算將公鑰放在 Windows 上面的話, 就要啟用密碼登錄功能(PasswordAuthentication yes)。

  6. 若要使用密碼登入的話,就要記得要設定登入密碼, 特別是在很多人可能並沒有設定 Windows 登入密碼的情況下:

    passwd [user]
    

    不過如果使用公鑰登入的話,就可以跳過這個步驟。

  7. 執行 SSHD 程式以啟動 SSH 服務:

    /usr/bin/sshd
    

    這個程式可以很放心的依據自己需求重複執行多次而不用擔心, 因為 SSHD 可以被重複執行而不會產生衝突情況, 它有自己的內部管理機制,確保只有一個執行中的實體。

    不過由於缺乏服務管理機制,中途要停用服務程式的話,就只能使用 kill 家族程式來停止了!

  8. 設定開機自動執行。

    在完成第一次的設定後,之後每次啟動 SSH 服務時只要再執行一次 /usr/bin/sshd 即可, 但我想為了人的懶惰,我們可能更希望能夠在系統開機的時候自動啟動這個程式。

    為了開機自動啟動 SSH 服務,請在 /c/Users/<username>/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/ 下新增一個名為 sshd.bat 的文字檔案,並填寫內容為:

    "C:\Program Files\Git\bin\bash" -c /usr/bin/sshd
    

常見問題

  1. 提示權限不足而無法建立檔案:

    請使用系統管理員權限執行 Git Bash 程式來進行操作。

  2. 錯誤訊息 “sshd re-exec requires execution with an absolute path”:

    請使用絕對路徑執行 sshd 程式,通常是 /usr/bin/sshd

  3. 錯誤訊息 “Privilege separation user sshd does not exist”:

    1. 建立 /etc/passwd 文件並填寫內容:

      sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    2. 建立 /var/empty/sshd 資料匣。

Reference