2023-05-20

Chocolatey で Portable OpenSSH を更新する 2023

久しぶりに、 Chocolatey に OpenSSH の β が降ってきてた。

前回は 2019 年だった。 Windows10 の更新で OpenSSH が逝った また OpenSSH が動かなくなる季節がやってきた

Chocolatey Software | Win32 OpenSSH (Universal Installer) 9.2.2-beta1

ので更新してみたところ、以下のエラーログが。

ERROR: There is a configured instance of the SSHD service, please specify the /SSHServerFeature to confirm it is OK to shutdown and upgrade the SSHD service at this time.
The upgrade of openssh was NOT successful.
Error while running 'C:\ProgramData\chocolatey\lib\openssh\tools\chocolateyinstall.ps1'.
See log for details.

はて? sshd 入れてたっけ?と思ったが見たら入ってた。 chocolatey で自動で入ったんやっけ?

PS> get-service *ssh*

Status Name DisplayName
------ ---- -----------
Running ssh-agent ssh-agent
Running sshd sshd

いる!しかも実行中なのがなんかキモい。

こいつを停止させるのはあとにするとして、ひとまず choco upgrade を成功させるにはどうしたら良いか。 こういうときはちゃんとマニュアルを読む。 Chocolatey の Package Source のリンクを辿れば良い。

openssh · master · DarwinJS / ChocoPackages · GitLab

-params '"/SSHServerFeature"' (Install and Uninstall)

Also install sshd Windows Service - including opening port 22. If this parameter is not included on an upgrade or uninstall and the sshd server is installed - an error is generated. You must use this switch to indicate you have made preparations for the sshd service to be interrupted or removed.

どう見てもこれ。以下を実行する。

choco upgrade openssh -params '"/SSHServerFeature"' -y

この後再起動をして Windows Terminal で PowerShell を開くと作業が完了した。 すっかり忘れていが、わたしの $PROFILE は「 ssh-agent のサービスがいない ≒ Windows の OpenSSH が更新された」と判定し、インストールスクリプトを実行するのだった。 ここ

# install ssh-agent service if not exists.
# it will be triggered after updating Windows OpenSSH.
if (! ($SshAgent = (Get-Service -Name 'ssh-agent' -ErrorAction SilentlyContinue))) {
install-sshd.ps1
Set-Service -Name 'ssh-agent' -StartupType Automatic
Start-Service ssh-agent
}
elseif ($SshAgent.StartType -eq 'Disabled') {
Set-Service -Name 'ssh-agent' -StartupType Automatic
Start-Service ssh-agent
}
else {
Start-Service ssh-agent
}

インストールスクリプトは Portable OpenSSH に提供されるもので ssh-agentsshd が一緒くたにインストールされてたのね...なんか他にやりようないか考えても良いのかな。

とりあえずこれで事なきを得た。 sshd の起動タイプも手動になっておりヨシ。

PS> get-service *ssh* | select -Property Name,Status,StartType

Name Status StartType
---- ------ ---------
ssh-agent Running Automatic
sshd Stopped Manual