リモートからWindowsのコマンドを実行する
リモートからWindowsのシェルにログインしてコマンドを実行する方法。
- sshで接続する
- コマンドプロンプト
- PowerShell
- PowerShellで接続する(ssh)
- PowerShellで接続する(WinRM/WSMan)
LinuxなどWindows以外から接続出来る方が望ましいので、 ここでは「1. sshで接続する」と「2. PowerShellで接続する(ssh)」について記述する。
1. sshで接続する
Windows 10のWindows 10 October 2018 Update(1809)からOpenSSHが追加されており、 これにはSSH Serverも含まれている。
このSSH Serverを有効化してssh接続でWindowsにログインする方法。
インストール(サーバ側)
設定
> システム
> オプション機能
> インストールされている機能
に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)
インストール(サーバ側)
PowerShell v6以降とOpenSSH SSH Serverが必要。
Installing PowerShell on Windows (日本語)を参照して最新のPowerShellをインストールする。
「1. sshで接続する」を参照して、OpenSSH SSH Serverをインストールする。 公開鍵認証などの設定方法も同じ。
%ProgramData%\ssh\sshd_config
(通常はC:\ProgramData\ssh\sshd_config
)に下記を追加し、
sshのsubsystemとしてpowershellを登録する。
PowerShellの実行ファイルの場所は実際の環境にあわせる。
- sshd_config
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs
変更した後はOpenSSH SSH Server
のサービスを再起動する。
クライアントからの接続
クライアントもPowerShell v6以降が必要。
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
その他にもNew-PSSessionやEnter-PSSessionを使用して接続出来る。