Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

[faq]Windows 1803之後git for windows無法透過Start-SshAgent啓用ssh agent - 需要一直輸入passphrase的問題

2018-11-22 星期四
[faq]Windows 1803之後git for windows無法透過Start-SshAgent啓用ssh agent - 需要一直輸入passphrase的問題.jpg
圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/

還記得之前有一篇介紹git for windows最新版本的Credential Manager有問題導致沒有辦法和遠端repo溝通(Windows安裝 git 2.19.1 之後做git clone-pull-push出現)。透過那一篇,理論上和遠端repo驗證就沒什麽問題了。

不過我自己在使用的時候發現,不知道爲什麽Azure DevOps的repo雖然跳出來輸入的是正確的帳號和密碼,但是git就是出現驗證失敗(github就不會)。

好吧,那換一種驗證方式,改成使用ssh。

不過用ssh又遇到另外一個問題,每一次和遠端溝通都要輸入passphrase超級麻煩,這個時候突然想起以前寫過(何謂ssh,在Windows下如何使用ssh,如何在Windows透過ssh下載和上傳程式到github)透過ssh agent不用一直輸入密碼。

興奮的打開那一篇,學著裡面輸入Start-SshAgent,結果出現了error:1058

什麽鬼,難道不能夠讓我開開心心的pull/push然後不輸入密碼嗎?

這篇將來介紹到底在Windows 1803之後做了什麽導致ssh agent啓動不起來。

問題描述

首先,先來看看我指的是什麽意思。

Start-SshAgentPosh-git裡面的一個helper的powershell方法,本質上就是做兩個事情:

  1. 啓動ssh-agent.exe
  2. 呼叫ssh-add.exe把密碼暫時記錄

一般都是需要用ssh的時候在啓動起來,因此當有需要的時候,輸入了Start-SshAgent卻出現了了Unable to start ssh-agent service, error:1058

01.png
錯誤信息的截圖

什麽鬼?怎麽不行了呢?之前那臺電腦也是Windows 10就好好的。

解決方式 - TL;DR

以下解法適合 Windows 10 1803的作業系統 - 不知道未來微軟是否會調整,但是至少在1803會有這個問題。

需要執行以下幾個動作即可解決:

把ssh-agent這個service從disabled狀態改成manual
可以透過gui的方式去設定(顯示名稱是:OpenSSH Authentication Agent),如果透過powershell則是:
Set-Service ssh-agent -StartupType Manual
調整git使用内建帶的ssh agent
透過指令執行:
git config --global core.sshCommand "'C:/Windows/System32/OpenSSH/ssh.exe'"

做完了以上兩個動作之後,未來需要啓動ssh agent的時候只需要輸入Start-SshAgent。接下來和遠端溝通都不需要一直輸入passphrase - 太棒了。

如果對於爲什麽要做上面兩個事情有興趣的話請繼續往下看。

爲什麽以前可以work

在説明原因之前,先把時間往回拉一點點,以前爲什麽直接呼叫Start-SshAgent可以work?

在説明這個部分之前,需要先瞭解ssh-agent.exe這個程式。

本質上Start-SshAgent做的事情就是兩個動作:

  1. 啓動ssh-agent.exe
  2. 透過呼叫ssh-add.exe把預設的passphrase加入

那麽有個問題就出來了,ssh-agent這個程式是從那來?

這個程式是和Git For Windows一起進來的,實際的程式位置在:c:\Program Files\Git\usr\bin\ssh-agent.exe

所以Start-SshAgent這個從poshgit來的powershell function就是方便執行的一個helper而已。

一切都很美好直到......

Windows 1803的更新

在Windows 1709的時候,微軟做了一件很好的事情,也就是内建Open ssh,變成是一個類似IIS的feature,使用者可以自己決定是否要安裝。

所以,1709還沒事,因爲你不安裝,那麽等同於和以前一樣。

但是在1803不同,1803預設是安裝的,但是他又很好心怕你吃資源所以對應的Windows Service是出於Disabled的狀態。

這個時候問題就來了,既然Windows内建了Open SSH,那麽到底應該用Git for Windows的還是用Windows内建的呢?

Start-SshAgent的問題

既然Windows自己會帶,那麽當然是用Windows的比較好,因爲ssh-agent根本就在Path裡面,可以透過指令:Get-Command ssh看到:

02.png  
可以看到Path的在System32下面

這件事情在Poshgit也有多方討論,因此最後決定是會去呼叫Windows裡面的ssh-agent service。這個時候問題就來了。

還記得上面提到1803很好心的做了什麽?他預設把ssh-agent disable了,可以透過指令:Get-Service ssh-agent | select -property Status,Name,DisplayName,Starttype

03.png   
Service處於disabled的狀態

那麽呼叫Start-SshAgent就gg了,因爲沒有辦法啓動一個disabled的服務。所以出現error 1058:

01.png    
啓動不起來,出現1058的錯誤

因此,這個時候第一步的解法是把他改成Manual,可以透過指令完成

Set-Service ssh-agent -StartupType Manual

Git for Windows的問題

啓動ssh-agent沒有問題了,這個時候很開心的去做一些遠端操作,卻發現,每一次操作還是要輸入passphrase

Why?不是已經啓動ssh-agent了嗎?

原因很簡單,因爲git for windows預設使用的是它自帶的ssh-agent。換句話説,他不吃Windows自帶的Open SSH。

知道問題就好解決了,那就是設定讓git吃Windows的Open SSH。

因此可以透過設定config:

git config --global core.sshCommand "'C:/Windows/System32/OpenSSH/ssh.exe'"

結語

以上就是整個的解決過程 - 當然在找資料的時候撞了很多墻,整個理清下來大概就是這樣。

這個故事其實也告訴一件事情,調整系統的任何東西都是有影響

個人覺得,之前1709的做法很好,要不要安裝由使用者決定。到了1803,就算要預設安裝我也可以理解,但是爲什麽Service要處於Disabled的狀態呢?如果是爲了節省資源那和不如放在Manual的狀態就好?

反過來看poshgit的Start-SshAgent,如果說有多一個判斷Service是否為Disabled,如果是改成Manual的動作整個使用體驗會上一大階。

參考資料

官方1709加入Open ssh的介紹
https://blogs.msdn.microsoft.com/powershell/2017/12/15/using-the-openssh-beta-in-windows-10-fall-creators-update-and-windows-server-1709/
Poshgit關於這個事情的討論

如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2018-11-22 星期四
comments powered by Disqus