しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Windows 10でPowerShell Remoting over SSHを試す

公式のアナウンスなどは全く無く、いつの間にかWindows 10 Creators Update(1703)でPowerShell Remoting over SSHが使える様になっていたので試してみました。

PowerShell Remoting over SSHについて

PowerShell Remoting over SSHとは何ぞやといった話はこちらのエントリをご覧ください。

blog.shibata.tech

どのPowerShellで使えるのか?

当初PowerShell Remoting over SSHはPowerShell 6.0向けの機能として発表され、現在も絶賛開発中です。
このためPowerShell Core 6.0であればこの機能はふつうに使えます。

で、他のバージョンに関してはいまのところWindows 10 Creators Update(1703)以降のWindows PowerShell 5.1にのみ実装された様です。
確認が取れなかったのでCreators Updateが出た直後のビルドから利用可能だったのかまでは不明ですが、少なくとも2017年8月現在のビルド(PSVersion = 5.1.15063.502)では利用可能になっています。

また、Windows PowerShell 5.1でもWindows 2016 Server*1WMF 5.1として他のOSにインストールしたものに関しては利用できません。

PowerShell Remoting over SSHを試す

以前に試した時と同様にCentOSをサーバーとしてWindows 10から接続してみます。
CentOSのバージョンは7.3に上げています。

項目 Windows 10(1703) CentOS 7.3
基本設定 最新のWindows Updateを実施した状態 bento/centos7.3のBoxにyum updateを実施
IP - VirtualBoxのゲスト(localhostで接続する)
ユーザー - vagrant, root

1. CentOSの設定

CentOSの設定手順は前と同様ですが、PowerShellをyumからインストールする様に変更しています。
また/etc/ssh/sshd_configの設定をsedで行う様にしました。*2

# CentOS(Bash)
# PowerShell for Linuxのインストール
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
sudo yum install -y powershell

# /etc/ssh/sshd_config の設定
# '# override default of no subsystems'のコメント行の下に設定を追加
# ※位置指定をかなり決め打ちにしているので注意
sudo sed -i.orig -e "/# override default of no subsystems/a Subsystem powershell powershell -sshs -NoLogo -NoProfile" /etc/ssh/sshd_config

# sshdの再起動
sudo systemctl restart sshd.service

2. Windowsの設定

PowerShell Remoting over SSHはPowerShellとOpenSSHを組み合わせた機能であるため、OpenSSHをインストールしてssh.exeのあるディレクトリに対してPATHを通しておく必要があります。

以下の手順でC:\Program Filesにインストールします。

# 要管理者権限
# OpenSSHのインストール
Invoke-WebRequest -Uri "https://github.com/PowerShell/Win32-OpenSSH/releases/download/v0.0.18.0/OpenSSH-Win64.zip" -OutFile "OpenSSH-Win64.zip"
Expand-Archive -Path ".\OpenSSH-Win64.zip" -DestinationPath "$env:ProgramFiles"

# Pathの追加
[Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH') + ";$(Join-Path $env:ProgramFiles "OpenSSH-Win64")")

3. 接続確認

前と同様にNew-PSSessionおよびEnter-PSSessionを使用して接続確認をします。

PowerShell Remoting over SSHでは-HostName(-ComputerNameではない)や-UserNameパラメーターで接続先を指定します。*3

# セッション生成
# 検証環境の都合-HostNameがlocalhostになっているが実際には接続先のホスト名を指定する
$Session = New-PSSession -HostName "localhost" -UserName vagrant
# 接続
Enter-PSSession -Session $Session

下図の様にSSHのセッションが生成され問題なくCentOSのサーバーに接続できました。

f:id:stknohg:20170814171926p:plain

f:id:stknohg:20170814171940p:plain

ちなみに、OpenSSHをインストールせずに接続しようとすると以下の様なエラーになってしまいますので注意してください。

f:id:stknohg:20170814171908p:plain

制限事項

PowerShellのバージョンを問わず現時点のPowerShell Remoting over SSHの制限事項として接続先のポート指定ができません。

New-PSSessionには-Portパラメーターがあるのですが、これは通常のPSRemoting専用のパラメーターであり、PowerShell Remoting over SSHで使おうとすると不正なパラメーター扱いされエラーとなってしまいます。

この点に関しては以下のPull Requestが出ており目下対応中といったところなのでいずれ解消されると思います。

github.com

*1:先日提供されたInsider Preview版でも使えませんでした

*2:位置指定がかなり決め打ちなのであまり良いやり方ではないと思いますが楽だったのでつい…

*3:他に-KeyFilePathパラメーターもあります