Python/Paramikoで対話形式のコマンドを実行する

Python
Nishipy
Ansibleにも使われているparamikoを用いて、Linuxのマシンに対してインタラクティブなコマンドを実行します。

概要

Paramikoと今回やることについて、書きます。

paramikoとは

公式サイトの説明はこんな感じです。要するに、SSHをするためのPythonのライブラリです。

Paramiko is a Python (2.7, 3.4+) implementation of the SSHv2 protocol [1], providing both client and server functionality. While it leverages a Python C extension for low level cryptography (Cryptography), Paramiko itself is a pure Python interface around SSH networking concepts.
Welcome to Paramiko! — Paramiko documentation

paramikoの使い方は、公式ドキュメントを参照ください。

Welcome to Paramiko’s documentation! — Paramiko documentation

PythonとSSHと聞くと、真っ先に思い浮かぶのはAnsibleですが、このparamikoはAnsibleにも使われています。
私は数年前に初めてAnsible使ったのですが、その時以下のエラーが出たため、名前はよく覚えていました。

fatal: [iosao1]: FAILED! => {“msg”: “paramiko is not installed: No module named ‘paramiko'”}

Ansibleについては、前に少し書きました。我ながらくそ記事なので、読まなくてよいです。

404 NOT FOUND | Nishipy Notes



今回やること

paramikoを使ってスクリプトを書いていたのですが、対話形式の(インタラクティブな)コマンドを実行するのに少し苦労したので、まとめておきます。
全体の環境は以下の通りです。図を書くまでもないですが…

  • SSH元: 自宅のMacbookから
  • SSH先: AWSのEC2(Amazon Linuxに対して、コマンドを実行

実行するのは、fdiskです。ディスクのパーティションを切ったりするコマンドで、対話形式で動作します。動作例は、以下を参照。
ちなみにpartedコマンドなら、非インタラクティブにディスク操作できます。

Pythonとparamikoのバージョンは以下の通りです。

  • Python 3.6.6
  • paramiko 2.6.0

実装内容

全体では、以下のような構成です。

credentials.py

SSH接続するための情報は、credentials.pyに入れています。例えばこんな感じです。

paramiko-interactive.py

ここからは、paramiko-interactive.pyを見ていきます。今回はクラスとして実装しました。

まず、paramikocredentials.pyに書いた変数をimportします。SSHして実行するコマンドは、sudo fdisk /dev/sdaとします。



fdisk_test関数で、SSH接続しコマンドを実行します。
対象EC2インスタンスのパブリックIP又はパブリックDNSのリストを渡して実行すると、対象ホストと実行時の標準出力の組をdictとして返します。

実行するコマンドの流れは、こんな感じです。
* まず、sudo fdisk /dev/sdaを実行
* シェルがコマンド (m でヘルプ):と聞いてくるので、mを入力しEnter(\n)を押す
* マミュアルが表示される
* シェルが再びコマンド (m でヘルプ):と聞いてくるので、qを入力しEnter(\n)を押す
* コマンドが終了する

実行例

当たり前ですが、以下のように使えます。

返ってくるのは、例えばこんな感じ。valueの部分は、\nを消す等して、もう少し見やすくするべきかもしれません。



さいごに

paramiko、簡単に使えて便利ですね。Ansibleを使えばよくね?という話もありますが、Ansible使うほどでもないとか、Ansibleのメンテしたくないとか、WindowsマシンからLinuxマシンにSSHで接続したいという時には便利かもしれないですね。

今回のコードは、GitHubにあげました。よければどうぞ。

GitHub - nishipy/paramiko-interactive-demo
Contribute to nishipy/paramiko-interactive-demo development by creating an account on GitHub.

以上.

コメント