Pythonを使わずにLinuxからWinRM経由でWindowsにリモート操作する

公開:2021/02/08
更新:2021/02/09
2 min読了の目安(約2100字TECH技術記事

Linux から Windows Server に WinRM でコマンドを実行したい場合がしばしばあります。Ansible + WinRM でできますが、ちょっとしたコマンドを実行する場合に Playbook を書くのが面倒だったりします。Python を入れていれば pywinrm がありますが、Python スクリプトでコマンドを書くのではなくて、Bash のワンライナーで実行したいときにちょっと違和感があります。

自分で WinRM 用 CLI を作ろうかなと思ってたのですが、先人が公開してくれたのがあって使いやすかったので紹介します。

masterzen/winrm-cli

実行環境

  • 実行元(Linux)
    • Amazon Linux 2
    • Golang 1.15.8
  • 実行先(Windows)
    • Windows Server 2012 R2

WinRM の設定

実行先(Windows)で WinRM が実行できるように設定します。WinRM で使用するユーザは必要に応じて作成してください。

winrm quickconfig -q
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="300"}'
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'

Stop-Service -Name winrm
Set-Service -Name winrm -Startup Automatic
Start-Service -Name winrm

指定されたファイルが見つかりません。 というエラーが出たら以下のリンクを参考に対応します。

ファイアウォールで塞がれることがあるため、5985ポートを許可しておいてください。

Golang のインストール

アクセス元(Linux)側の設定に入ります。
winrm-cli をインストールするのに Golang が必要なので入れます。1.15 以上である必要があります。

$ sudo su -
% curl -sSfL -O https://golang.org/dl/go1.15.8.linux-amd64.tar.gz
% tar -C /usr/local -xzf go1.15.8.linux-amd64.tar.gz
% export PATH=$PATH:/usr/local/go/bin
% go version
go version go1.15.8 linux/amd64

winrm-cli のインストール

% yum clean all
% yum install -y git make
% git clone https://github.com/masterzen/winrm-cli
% cd winrm-cli/
% make

コマンド実行

以下のように簡単にコマンド実行することができます。ユーザ名、パスワードはヒストリに残らないようにファイルに書き込んで環境変数で読み込むと良いです。

$ winrm -username $USER -password $PASSWORD -hostname $HOST "ipconfig /all"

PowerShell コマンドを実行する場合は powershell -Command で指定します。

$ winrm -username $USER -password $PASSWORD -hostname $HOST \
  "powershell -Command ""Restart-Service -Name hoge_service"""