articles:remoting_windows

リモートからWindowsのコマンドを実行する

リモートからWindowsのシェルにログインしてコマンドを実行する方法。

  1. sshで接続する
    1. コマンドプロンプト
    2. PowerShell
  2. PowerShellで接続する(ssh)
  3. PowerShellで接続する(WinRM/WSMan)

LinuxなどWindows以外から接続出来る方が望ましいので、 ここでは「1. sshで接続する」と「2. PowerShellで接続する(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を確認すること。

sshで接続するとデフォルトのシェルとしてコマンドプロンプトが設定されている。

シェルを変更したい場合は、アプリ > Windows ツール > レジストリ エディターで、 HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSHDefaultShellという名前で文字列型のキーを追加する。

システム標準の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の場合でも、コマンドプロンプトの場合でも同様。

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のサービスを再起動する。

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-PSSessionEnter-PSSessionを使用して接続出来る。

  • 最終更新: 2023-12-31 16:00
  • by nabium