Python

LinuxからWindowsのコマンドをリモート実行するPythonモジュールpywinrm

SIOS Coati 開発チーム、沼野井です。正月に軍艦島に行って来ました。

前日の天気予報が雪で最悪ゥ―とか思っていたのですが、当日は幸いにも雪も雨も降らず、風もほぼ無風だったので、無事上陸を果たせました。

廃墟マニアならずとも見ごたえのある所でした。皆様もぜひどうぞ!

 

さて本日は、そんな軍艦島とは全く関係のないpywinrm のお話です。

Windowsマシンからリモートで接続されている別のWindowsマシンのコマンドやpowershellコマンドレットを実行するプロトコル(と実装)にWinRMがあります。
Linuxでも、WinRMのクライアントを導入すれば、このプロトコルを利用してWindowsを操作することが可能です。Pythonでそれを実行可能にするのが、pywinrmモジュールです。
今回はこのpywinrm導入の方法と実行の簡単な例を紹介したいと思います。

事前準備

今回ご紹介する例ではWindowsマシンへのアクセスにBasic認証を利用します。この場合、操作する対象のWindows上で以下の設定が必要です。

  • WinRMの通信ポートでの通信をできるようにしておく
    WinRMが使用するデフォルトのポート番号は5985です。
  • PowerShellリモーティングが有効になっている
    ご参考
  • Basic認証を許可する
    以下のコマンドです(要管理者権限)。
  • ネットワークがHomeまたはPrivateになっている
    [コントロールパネル]-[ファイアウォール]-[プライベートネットワーク] から設定できます(windows 10の場合)

 pywinrmの導入

Linux側へのpywinrm導入の手順です。
pipでepelリポジトリからインストールすることができますので、入っていない場合には先にそれらをインストールしてください。

 実行方法

pywinrmを使用した、Windowsリモートアクセスの方法です。

  1. セッションを張る
  2. コマンドを実行する
    1 で張ったセッションを利用します。
    PowerShellコマンドレットの場合は、run_ps()メソッドで実行します。

    Windowsコマンドの場合は、run_cmd()メソッドです。

実行例

WindowsコマンドとPowerShellコマンドレットで、現在日時を取得するサンプルです。

 

Basic認証以外を利用する場合

KerberosまたはCredSSLが使用できまするようです。(試してないです。すみません。)
その場合、別途モジュールの導入が必要です。
README を参照してください。

 


LinuxからWindowsを操作するケースは、様々な端末の操作自動化をLinuxにまとめてしまいたいというシチュエーションなどであるかも知れませんが、そのようなときにぜひご活用ください。

ファイル構成をYAMLでコード化する

SIOS Coati開発チームの清水です。

突然ですが、みなさんはファイル構成のコード化をどのようにおこなっていますか?

SIOS Coatiでは、環境の構築をAnsibleで行っています。Ansibleは非常に便利(どのくらい便利かは別の記事に譲ります)ですが、ちょっとしたひな形としてディレクトリやファイルを作るのには、少し大袈裟になりがちです。

たとえば個人的に、Pythonで開発をはじめるときは下のような構成が欲しかったりします。

このようにYAMLだとディレクトリの関係が綺麗に表現できます。

ならばいっそ、このYAMLからディレクトリ・ファイルをファイル構成を自動展開するスクリプトがあったらいいなと思ったので、作成しました。

普段からよく使う構成をYAMLにしておけば、ディレクトリ構成をドキュメント化しておく必要もありませんし、チーム内でひな形をお手軽に共有することもできます。

 

スクリプトと使い方を本記事の末尾に記載しますので、興味があるかたはぜひお試しください(スクリプトのご利用はあくまで自己責任でお願いいたします)。

なお実行にはPython3とPyYAMLライブラリが必要となるため、あらかじめインストールしてください。


ソースコード

template.py を作成し、以下のコードをコピー&ペーストしてください。

コマンドのフォーマット

サンプルコマンド

config.ymlの構成に基づいて、新しいファイル・ディレクトリを ./out ディレクトリ上に展開します。

なお、-o オプションを省略した場合は、カレントディレクトリ上に展開します。

もし、既にファイルが存在している場合は、その時点でプログラムは停止します(既存のファイルを変更することはありません)。

作成前にファイルの存在確認をする(Dry Run)場合は -d オプションを付与してください。


シンプルなコマンドですが、使いどころはあると思います。ぜひ使ってみてください!