Windows10自帶了一個非常方便的ssh-agent服務,我們只需要在Windows的服務列表里面啟用該服務就能在CMD或PowerShell里直接使用ssh-add添加密鑰,實現ssh免密登錄。但在Windows的Linux子系統下,默認沒有ssh-agent服務啟動,通過 eval
的方式,每次打開終端都需要重新添加ssh密鑰(每次都會啟動一個新的ssh-agent進程),比較麻煩。為了在WSL下也能正常訪問Window的ssh-agent
ssh-agent
,可以通過wsl-ssh-agent
工具創建指向Windows ssh-agent
的socket文件,並修改WSL的環境變量SSH_AUTH_SOCK為該socket文件路徑。
Windows 10 啟動 ssh-agent
命令行方式
打開PowerShell,通過 Set-Service -StartupType Automatic ssh-agent
將 ssh-agent
服務的啟動類型設為自啟,隨后鍵入 Start-Service ssh-agent
啟動當前會話下的 ssh-agent
服務。
PS C:\windows\system32> Set-Service -StartupType Automatic ssh-agent
PS C:\windows\system32> Start-Service ssh-agent
PS C:\windows\system32> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
PS C:\windows\system32> (Get-Service ssh-agent).startType
Automatic
圖形界面方式
右鍵“我的電腦”(Windows 10上為“此電腦”),選擇“管理”菜單項,打開計算機管理窗口。
- 左欄選擇服務;
- 右欄中找到OpenSSH Authentication Agent服務;
- 雙擊打開設置界面,將啟動類型由禁用改為自動;
- 點擊應用,這時才可以手動啟動和停止agent服務;
- 點擊啟動按鈕,啟動agent服務。
wsl-ssh-agent 快速配置
wsl-ssh-agent
是一個簡單的托盤通知小程序,其為WSL提供了一個用於連接Windows ssh-agent服務的socket接口,來自該socket的所有請求都將被代理到Windows ssh-agent中。WSL只需要正確地設置這個套接字的地址(即,維護環境變量SSH_AGENT_SOCK
),就可以通過這個接口Windows主機共享ssh-agent服務。除此之外,wsl-ssh-agent還對Windows和遠程Linux主機的剪貼板同步提供了一定的支持,通過win32yank實現本地Windows剪貼板訪問控制,通過lemonade實現遠程剪貼板數據同步,通過添加適當的參數wsl-ssh-agent可以作為lemonade的服務器。@NOTE:
- wsl-ssh-agent需要unix socket特性支持;
- 從Insider Build 17063開始,Windows 10開始支持通過unix socket(AF_UNIX)地址簇在win32進程間通信;
- 之前的版本可能需要使用ssh-agent-wsl。
啟動 wsl-ssh-agent 服務
從 https://github.com/rupor-github/wsl-ssh-agent 的 releases 頁面獲取 wsl-ssh-agent.7z
(當前版本為v1.3),並解壓到 C:\APP\wsl-ssh-agent\wsl-ssh-agent-gui.exe
。
在PowerShell
下啟動 wsl-ssh-agent
,這個服務會在后台常駐,並在通知欄顯示一個圖標。
C:\APP\wsl-ssh-agent\wsl-ssh-agent-gui.exe -setenv -envname=WSL_AUTH_SOCK
該命令將會在%USERPROFILE%/AppData/Local/Temp/
下自動創建一個形如ssh-213734371.sock
的socket文件,並將該文件的路徑存放在環境變量WSL_AUTH_SOCK中(wsl-ssh-agent-gui在退出時會自動進行清理工作,刪除環境變量和socket文件),同時將該變量共享給WSL。
Windows 10 在 17063 之后為了在Windows和WSL之間共享環境變量,引入了WSLENV變量,這個變量在兩端都存在。通過這個變量可以實現將WSL環境變量共享給Windows或將Windows環境變量共享給WSL。
更多關於WSL變量共享的信息,請參考: https://devblogs.microsoft.com/commandline/share-environment-vars-between-WSL-and-windows/
每次使用WSL下的ssh時,需要確保 Windows 的 ssh-agent
和 wsl-ssh-agent
均以啟動。
配置 WSL
在WSL下修改環境變量SSH_AUTH_SOCK的值為wsl-ssh-agent-gui設置的環境變量WSL_AUTH_SOCK的值(設置了這個值后,ssh將會通過提供的socket接口進行認證)。WSL每次啟動后都需要手動設置這個值,比較繁瑣,可以在~/.bashrc文件的結尾添加一行代碼,自動設置環境變量。
[ -n ${WSL_AUTH_SOCK} ] && export SSH_AUTH_SOCK=${WSL_AUTH_SOCK}
通過上述方法,我們已經可以在WSL中正常訪問ssh-agent。但有一個問題,在設置wsl-ssh-agent-gui后,當前cmd或powershell中直接進入WSL后,無法獲取到環境變量WSL_AUTH_SOCK,需要重新打開一個窗口進入WSL。