🎯
Pythonを使わずにLinuxからWinRM経由でWindowsにリモート操作する
Linux から Windows Server に WinRM でコマンドを実行したい場合がしばしばあります。Ansible + WinRM でできますが、ちょっとしたコマンドを実行する場合に Playbook を書くのが面倒だったりします。Python を入れていれば pywinrm がありますが、Python スクリプトでコマンドを書くのではなくて、Bash のワンライナーで実行したいときにちょっと違和感があります。
自分で 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
指定されたファイルが見つかりません。
というエラーが出たら以下のリンクを参考に対応します。
- 【EC2】英語版Windows ServerのAMIから起動、日本語化したらリモート管理でエラー - サーバーワークスエンジニアブログ
- 備忘録やら日記やら: 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"""
Discussion