
この記事は公開してから1年以上経過しており、情報が古い可能性がありますのでご了承ください。 |
SIOS AppKeeper 開発チーム、沼野井です。正月に軍艦島に行って来ました。
前日の天気予報が雪で最悪ゥ―とか思っていたのですが、当日は幸いにも雪も雨も降らず、風もほぼ無風だったので、無事上陸を果たせました。
廃墟マニアならずとも見ごたえのある所でした。皆様もぜひどうぞ!
さて本日は、そんな軍艦島とは全く関係のない、pywinrm のお話です。
Windowsマシンからリモートで接続されている別のWindowsマシンのコマンドや、powershellコマンドレットを実行するプロトコル(と実装)にWinRMがあります。
Linuxでも、WinRMのクライアントを導入すれば、このプロトコルを利用してWindowsを操作することが可能です。Pythonでそれを実行可能にするのが、pywinrmモジュールです。
今回はこのpywinrm導入の方法と実行の簡単な例を紹介したいと思います。
事前準備
今回ご紹介する例ではWindowsマシンへのアクセスにBasic認証を利用します。この場合、操作する対象のWindows上で以下の設定が必要です。
- WinRMの通信ポートでの通信をできるようにしておく
WinRMが使用するデフォルトのポート番号は5985です。 - PowerShellリモーティングが有効になっている
ご参考 - Basic認証を許可する
以下のコマンドです(要管理者権限)。winrm set winrm/config/service/auth '@{Basic="true"}' # Basic認証の許可 winrm set winrm/config/service '@{AllowUnencrypted="true"}' # 非暗号化パスワード許可
- ネットワークがHomeまたはPrivateになっている
[コントロールパネル]-[ファイアウォール]-[プライベートネットワーク] から設定できます(windows 10の場合)
pywinrmの導入
Linux側へのpywinrm導入の手順です。
pipでepelリポジトリからインストールすることができますので、入っていない場合には先にそれらをインストールしてください。
> yum install epel-release
> yum install python-pip
> pip install WinRM
実行方法
pywinrmを使用した、Windowsリモートアクセスの方法です。
- セッションを張る
session = winrm.Session(<ホスト名>, auth=(<ユーザ名>, <パスワード>))
- コマンドを実行する
1 で張ったセッションを利用します。
PowerShellコマンドレットの場合は、run_ps()メソッドで実行します。session.run_ps(<コマンドレット>)
Windowsコマンドの場合は、run_cmd()メソッドです。
session.run_cmd(<コマンド>)
実行例
WindowsコマンドとPowerShellコマンドレットで、現在日時を取得するサンプルです。
>>> session = winrm.Session(<ホスト名>, auth=(<ユーザ名>, <パスワード>))
>>> session.run_cmd("echo %date% %time%").std_out # Windowsコマンドの実行 'Tue 01/23/2018 5:10:01.69\r\n'
>>> session.run_ps("Get-Date").std_out " PowerShellコマンドレットの実行 '\r\nTuesday, January 23, 2018 5:06:34 AM\r\n\r\n\r\n'
Basic認証以外を利用する場合
KerberosまたはCredSSLが使用できるようです。(試してないです。すみません。)
その場合、別途モジュールの導入が必要です。
README を参照してください。
LinuxからWindowsを操作するケースは、様々な端末の操作自動化をLinuxにまとめてしまいたいというシチュエーションなどであるかも知れませんが、そのようなときにぜひご活用ください。
また、Amazon EC2上で運用しているアプリケーションの自動監視、自動復旧サービスもやってます。(ド宣伝)
たくさんのEC2インスタンスをご利用の方、簡単にEC2インスタンス自動復旧したい方など、ご興味あればぜひどうぞ。