從 Win10 1809 和 Windows Server 2019 開始 Windows 開始支持 OpenSSH Server。本文介紹一下其基本的概念和配置方法,本文演示用的環境為 Win10 1809(ssh 客戶端)和 Windows Server 2019(ssh 服務器)。
安裝 OpenSSH Server
OpenSSH 客戶端程序默認已經被系統安裝好了,打開 Settings->Apps->Manage optional features 面板就可以看到:
而 OpenSSH Server 默認沒有安裝,需要用戶手動安裝。點擊上圖中的 "Add a feature" 按鈕,然后選擇 OpenSSH Server,並點擊 "Install" 按鈕:
開啟服務
安裝完成后打開服務管理器,把 OpenSSH Authentication Agent 服務和 OpenSSH SSH Server 服務都設置為自啟動,並啟動這兩個服務:
監聽端口
啟動服務后可以通過 netstat 命令查看 SSH Server 服務是不是已經開始監聽默認的 22 號端口了:
防火牆規則
在安裝 OpenSSH Server 的時候會在防火牆的入站規則中添加一條記錄讓防火牆放行對 22 號端口的訪問:
服務器端的配置文件目錄
服務器端的配置文件在 C:\ProgramData\ssh 目錄中,注意 C:\ProgramData 是一個隱藏目錄:
安裝目錄
Windows 系統中 OpenSSH 的安裝目錄為 C:\Windows\System32\OpenSSH,不管是客戶端程序還是服務器端程序都這這個目錄中:
OpenSSH 服務器端程序的默認配置文件 sshd_config_default 也在這個目錄中。這個目錄會被添加到 PATH 環境變量中:
這樣就可以在 PowerShell 中直接執行相關的命令而無需寫出完整的路徑。
Win10 自帶的 OpenSSH 客戶端
因為 SSH 客戶端所在的目錄被添加到了 PATH 環境變量中,在 PowerShell 中可以直接執行 OpenSSH 客戶端的命令,比如 ssh:
連接遠程 Linux 主機
使用 ssh 命令連接一下 Linux 主機,筆者的 Linux 主機為 Ubuntu16.04,可以連接,但是歡迎信息顯示了兩次:
查看 ssh 命令的版本為 7.7.2.1:
在另外一台機器上用個老一點的版本(7.6.0.0)試了試:
沒有發現重復輸出歡迎信息的問題,判斷可能是新版本引入的 bug。
連接遠程 Windows 主機
當 Windows 系統中安裝好 OpenSSH Server 並開始監聽端口后就可以通過遠程的客戶端來連接了。連接遠程 Windows 主機與連接遠程 Linux 主機相同,下面是通過密碼登錄的方式(nick 是 Windows 系統中的一個本地用戶):
連接成功后默認的 shell 是 Windows Command shell (cmd.exe) 程序:
在 Windows 系統中,PowerShell 已逐漸成為主流,我們可以把默認的 shell 設置為 PowerShell。其實就是在運行 OpenSSH Server 的 Windows 系統的注冊表中添加一個配置項,注冊表路徑為 HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH,項的名稱為 DefaultShell,項的值為 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。我們可以以管理員身份啟動 PowerShell,然后執行下面的命令完成注冊表項的添加:
> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
現在重新連接遠程服務器,默認的 shell 已經變成了 PowerShell:
通過秘鑰認證方式登錄
前面我們介紹的 ssh 命令都是通過密碼認證連接服務器的,下面介紹通過秘鑰認證的方式登錄服務器。
ssh-keygen 命令
ssh-keygen 命令用來生成公鑰認證使用的秘鑰對,創建的秘鑰一般都和 ssh 客戶端的配置一起保存在用戶家目錄下的 .ssh 目錄中(與 Linux 系統中類似):
執行 ssh-keygen 命令:
> ssh-keygen
默認情況下一路回車就可以了,使用默認的文件名稱和存放目錄:
遺憾的是 Windows 下目前還沒有提供 ssh-copy-id 命令,需要手動把用戶的公鑰添加到遠程主機系統中的用戶的 authorized_keys 文件中。具體在運行 OpenSSH Server 的主機上的操作步驟如下:
在用戶家目錄下創建 .ssh 目錄
打開 PowerShell,進入用戶的家目錄,用 mkdir 命令創建 .ssh 目錄:
> cd ~ > mkdir .ssh
創建 authorized_keys 文件並加入公鑰
在 PowerShell 中執行 notepad .ssh\authorized_keys 命令創建文本文件,把客戶端的公鑰復制到這個文件中並保存。
把文本文件的名稱修改為 authorized_keys:
修改 ssh 服務的配置文件
以管理員權限打開 PowerShell,執行命令 notepad C:\ProgramData\ssh\sshd_config。
注釋掉配置文件中的最后兩行然后保存:
#Match Group administrators # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
最后在服務管理器器中重啟 OpenSSH SSH Server 服務,然后客戶端就可以通過公鑰認證的方式登錄到遠程服務器了。
注意:
一定不要用 Repair-AuthorizedKeyPermission 命令修復 .ssh\authorized_keys 文件的權限。
也不要以下面的方式創建 .ssh\authorized_keys 文件:
echo "publickey" > .ssh\authorized_keys echo $null > .ssh\authorized_keys
總結
OpenSSH 的支持讓系統管理員有了一個方便的工具來管理 Windows 系統,相信 OpenSSH + PowerShell 的組合將成為管理 Windows 系統的黃金搭檔。本文只是介紹了一些入門的概念,但給人的感覺是 Windows 上的 OpenSSH 工具尚需打磨(問題挺多的,按照文檔配置個公鑰認證就把人搞吐了)。