====== リモートからWindowsのコマンドを実行する ======
{{tag>windows powershell ssh}}
リモートからWindowsのシェルにログインしてコマンドを実行する方法。
- sshで接続する
- コマンドプロンプト
- PowerShell
- PowerShellで接続する(ssh)
- PowerShellで接続する(WinRM/WSMan)
* [[https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/wsman-remoting-in-powershell#wsman-remoting-isnt-supported-on-non-windows-platforms|WSMan remoting isn't supported on non-Windows platforms]] ([[https://learn.microsoft.com/ja-jp/powershell/scripting/learn/remoting/wsman-remoting-in-powershell#wsman-remoting-isnt-supported-on-non-windows-platforms|日本語]])
LinuxなどWindows以外から接続出来る方が望ましいので、
ここでは「1. sshで接続する」と「2. PowerShellで接続する(ssh)」について記述する。
===== 1. sshで接続する =====
Windows 10のWindows 10 October 2018 Update(1809)からOpenSSHが追加されており、
これにはSSH Serverも含まれている。
このSSH Serverを有効化してssh接続でWindowsにログインする方法。
* [[https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview|Manage Windows with OpenSSH]] ([[https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_overview|日本語]])
==== インストール(サーバ側) ====
''設定'' > ''システム'' > ''オプション機能'' > ''インストールされている機能''に''OpenSSH サーバー''があるか確認する。
無い場合は、''設定'' > ''システム'' > ''オプション機能'' > ''オプション機能を追加する''から''OpenSSH サーバー''を追加する。
同時にWindows Defender ファイアウォールの受信の規則に''OpenSSH SSH Server (sshd)''が追加される。
sshdの設定ファイルは''%ProgramData%\ssh''(通常は''C:\ProgramData\ssh'')にあるので、
認証関連などをチェックしておく。
OpenSSH Serverは、''アプリ'' > ''Windows ツール'' > ''サービス''から、''OpenSSH SSH Server''を開始する。
==== 公開鍵認証(サーバ側) ====
公開鍵による認証を許可するには、通常のsshと同じく許可する公開鍵をファイルに記述していくが、
一般ユーザと管理者ユーザでファイルの場所が異なる。
一般ユーザの場合は、''%USERPROFILE%\.ssh\authorized_keys''。
管理者ユーザの場合は、''%ProgramData%\ssh\administrators_authorized_keys''。
管理者ユーザで接続すると管理者権限でコマンドを実行できるので、
ファイルのアクセス許可が管理者とシステムのみになっているかACLを確認すること。
==== シェルをPowerShellに変更する(サーバ側) ====
sshで接続するとデフォルトのシェルとしてコマンドプロンプトが設定されている。
シェルを変更したい場合は、''アプリ'' > ''Windows ツール'' > ''レジストリ エディター''で、
''HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH''に''DefaultShell''という名前で文字列型のキーを追加する。
システム標準のPowerShellを使用する場合は、''c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe''を値に設定する。
新しいv7.xのPowerShellをインストールしていて、それを使用する場合は、''c:\progra~1\powershell\7\pwsh.exe''を設定する。
''%SystemRoot%''や''%ProgramFiles%''などの環境変数は使用できないので設定するパスは環境に合わせること。
==== クライアントからの接続 ====
基本的に通常のssh接続と変わらない。
接続先のWindowsがドメインに参加していないなら:
ssh ユーザ名@IPアドレスまたはホスト名
接続先のWindowsがドメインに参加しているなら:
ssh ドメイン\ユーザ名@IPアドレスまたはホスト名
実行例(管理者ユーザによる公開鍵認証、かつデフォルトシェルをPowerShell 7.4に変更):
$ ssh ユーザ名@IPアドレス 'Get-Host | Format-List -Property Name,Version,CurrentCulture'
Name : ConsoleHost
Version : 7.4.0
CurrentCulture : ja-JP
=== 応答の文字コード ===
文字コードがUTF-8のターミナルから、sshのオプションでコマンドを引き渡すと日本語の応答が文字化けする。
ターミナルの文字コードをShift_JISにすると、''DisplayName''は正しく''日本語 (日本)''と表示される。
$ echo $LANG
C.UTF-8
$ ssh ユーザ名@IPアドレス 'Get-Culture'
LCID Name DisplayName
---- ---- -----------
1041 ja-JP ���{�� (���{)
対して、同じく文字コードがUTF-8のターミナルからsshで接続した後にコマンドを実行すると、
そのままでも日本語の応答が正しく表示される。
$ ssh ユーザ名@IPアドレス
PowerShell 7.4.0
PS C:\Users\ユーザ名> Get-Culture
LCID Name DisplayName
---- ---- -----------
1041 ja-JP 日本語 (日本)
PS C:\Users\ユーザ名> exit
シェルがPowerShell 7.4の場合でも、コマンドプロンプトの場合でも同様。
===== 2. PowerShellで接続する(ssh) =====
* [[https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/ssh-remoting-in-powershell|PowerShell remoting over SSH]] ([[https://learn.microsoft.com/ja-jp/powershell/scripting/learn/remoting/ssh-remoting-in-powershell|日本語]])
* [[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote|about_Remote]] ([[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_remote|日本語]])
* [[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command|Invoke-Command]] ([[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/invoke-command|日本語]])
==== インストール(サーバ側) ====
PowerShell v6以降とOpenSSH SSH Serverが必要。
[[https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows|Installing PowerShell on Windows]] ([[https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows|日本語]])を参照して最新のPowerShellをインストールする。
「1. sshで接続する」を参照して、OpenSSH SSH Serverをインストールする。
公開鍵認証などの設定方法も同じ。
''%ProgramData%\ssh\sshd_config''(通常は''C:\ProgramData\ssh\sshd_config'')に下記を追加し、
sshのsubsystemとしてpowershellを登録する。
PowerShellの実行ファイルの場所は実際の環境にあわせる。
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs
変更した後は''OpenSSH SSH Server''のサービスを再起動する。
==== クライアントからの接続 ====
クライアントもPowerShell v6以降が必要。
* [[https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows|Installing PowerShell on Windows]]
* [[https://github.com/PowerShell/PowerShell/releases/latest|Latest Release(GitHub)]]
* [[https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux|Installing PowerShell on Linux]]
* [[https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-in-docker|Using PowerShell in Docker]]
* [[https://github.com/PowerShell/PowerShell-Docker|PowerShell-Docker(GitHub)]]
* [[https://hub.docker.com/_/microsoft-powershell|PowerShell(DockerHub)]]
=== Invoke-Commandによる実行例 ===
ホスト鍵の確認や公開鍵認証の許可など接続の仕組みは「1. sshで接続する」と同じ
''-HostName ユーザ名@IPアドレスまたはホスト名''は''-HostName IPアドレスまたはホスト名 -UserName ユーザ名''と分けるのも可。
$ docker run -it mcr.microsoft.com/powershell
PS /> Invoke-Command -HostName ユーザ名@IPアドレスまたはホスト名 -ScriptBlock { Get-Host | Format-List -Property Name,Version,CurrentCulture
}
ユーザ名@IPアドレスまたはホスト名's password:
Name : ServerRemoteHost
Version : 7.4.0
CurrentCulture : ja-JP
PS /> exit
その他にも[[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-pssession|New-PSSession]]や[[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/enter-pssession|Enter-PSSession]]を使用して接続出来る。
===== 3. PowerShellで接続する(WinRM/WSMan) =====
* [[https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/running-remote-commands|Running Remote Commands]] ([[https://learn.microsoft.com/ja-jp/powershell/scripting/learn/remoting/running-remote-commands|日本語]])
* [[https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/wsman-remoting-in-powershell|Using WS-Management (WSMan) Remoting in PowerShell]] ([[https://learn.microsoft.com/ja-jp/powershell/scripting/learn/remoting/wsman-remoting-in-powershell|日本語]])
* [[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote|about_Remote]] ([[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_remote|日本語]])
* [[https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote_requirements|about_Remote_Requirements]] ([[https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_remote_requirements|日本語]])
* [[https://learn.microsoft.com/en-us/windows/win32/winrm/portal|Windows Remote Management]] ([[https://learn.microsoft.com/ja-jp/windows/win32/winrm/portal|日本語]])