Junos PyEZを使用して、Junosデバイスのシェルにアクセスする
Junos PyEZを使用して、Junosデバイスのシェルに接続し、コマンドを実行します。
StartShellの概要
Junos CLIには、多くのシェルコマンドが返す情報と同様の情報を返す動作モードコマンドが多数あります。したがって、通常、Junosデバイス上のUNIXレベルシェルへのアクセスは必要ありません。ただし、場合によっては、ユーザーまたはアプリケーションがシェルにアクセスしてシェルコマンドを実行するか、シェルから CLI コマンドを実行する必要があるかもしれません。
Junos PyEZ jnpr.junos.utils.start_shell モジュールは、Junos PyEZ アプリケーションがJunosデバイスへの SSH 接続を開始し、シェルにアクセスできるようにする StartShell クラスを定義します。 StartShell メソッドにより、アプリケーションは接続を介してコマンドを実行し、応答を取得できます。
StartShell open()メソッドとclose()メソッドは、デバイスとのSSH接続を確立および終了します。その結果、クライアント アプリケーションがシェルへのアクセスのみを必要とする場合は、Device open() メソッドと close() メソッドの呼び出しを省略できます。
Junos PyEZリリース2.6.7以前では、 StartShell インスタンスはデフォルトのSSHポート22に接続します。Junos PyEZリリース2.6.8以降、シェル接続が引き続きポート22を使用する次の場合を除いて、 StartShell インスタンスは Device インスタンスで定義されているのと同じポートに接続します。
-
Devicehostは「localhost」に設定されています -
Deviceportは 830 に設定されています。 -
Deviceportは未定義です。
シェルからコマンドを実行する
StartShell run() メソッドはシェルコマンドを実行し、応答を待ちます。デフォルトでは、このメソッドは、コマンド出力を返す前に、デフォルトのシェル プロンプト (%、#、>、または $) のいずれかを待機します。または、this="string"引数を特定の文字列に設定すると、メソッドはコマンド出力を返す前に、期待される文字列またはパターンを待機することもできます。
戻り値はタプルです。最初の項目は、終了コードが 0 の場合は True され、それ以外の場合は False です。2番目の項目は、コマンドの出力です。
次の例では、ホストに接続し、シェルから 2 つの動作モード コマンドを実行します。スクリプトはまず request support information コマンドを実行し、出力をファイルに保存します。次に、スクリプトは show version コマンドを実行し、出力を version 変数に格納してから、変数の内容を出力します。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
dev = Device(host='router1.example.net')
ss = StartShell(dev)
ss.open()
ss.run('cli -c "request support information | save /var/tmp/information.txt"')
version = ss.run('cli -c "show version"')
print (version)
ss.close()
返されるタプルには、コマンドの終了コードに対応するブール値と、 show version コマンドのコマンド出力が含まれます。この例の出力は簡潔にするために切り捨てられています。
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
StartShellクラスのインスタンスは、コンテキストマネージャーとしても使用できます。この場合、StartShell open()メソッドとclose()メソッドを明示的に呼び出す必要はありません。次に例を示します。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
dev = Device(host='router1.example.net')
with StartShell(dev) as ss:
ss.run('cli -c "request support information | save /var/tmp/information.txt"')
version = ss.run('cli -c "show version"')
print (version)
シェルタイプの指定方法
Junos PyEZリリース2.6.4以降、 StartShell はシェルタイプを指定するリモートスクリプト内で shell_type 引数をサポートしています。 StartShell は、以下のシェルタイプをサポートしています。
-
Cシェル(csh)
-
ボーンスタイルシェル(アッシュ)
デフォルトでは、 StartShell インスタンスはタイプCシェル(csh)です。また、ボーンスタイルシェル(灰)を開始する shell_type="sh" を指定することもできます。次に例を示します。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
dev = Device(host='router1.example.net')
with StartShell(dev, shell_type="sh") as ss:
version = ss.run('cli -c "show version"')
print (version)
タイムアウトを指定する方法
StartShell timeout引数を含めることで、ユーティリティがタイムアウトする前に予想される文字列またはパターンを待機する必要がある時間を秒単位で指定できます。タイムアウトを指定しない場合のデフォルトは30秒です。
予期される文字列は、 this 引数で定義された値です。 this を定義しない場合、予期される文字列はデフォルトのシェル プロンプトの 1 つです。代わりに特殊値を this=Noneに設定した場合、デバイスは「 返されないシェルコマンドの実行」で説明されているように、コマンド出力をキャプチャする前にタイムアウトの間待機します。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
dev = Device(host='router1.example.net')
with StartShell(dev) as ss:
ss.run('cli -c "request support information | save /var/tmp/information.txt"', timeout=60)
version = ss.run('cli -c "show version"')
print (version)
コマンドの実行をずらす方法
場合によっては、 run() メソッドの複数の呼び出しを実行またはループする必要がある場合があります。出力を安定させるために、 sleep 引数を指定することができます。 sleep 引数は、バッファからデータを受信する前に指定された秒数待機するようにデバイスに指示します。 sleep を秒単位以下の精度の浮動小数点数として定義できます。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
from pprint import pprint
dev = Device(host='router1.example.net')
tables = ['inet.0', 'inet6.0']
with StartShell(dev) as ss:
for table in tables:
command = 'cli -c "show route table ' + table + '"'
rsp = ss.run(command, sleep=5)
pprint (rsp)
戻ってこないシェルコマンドを実行する
場合によっては、ローカルルーティングエンジンで発信または終了するトラフィックを表示する monitor traffic コマンドなど、戻りしないシェルコマンドを実行する必要がある場合があります。Junos CLIでは、 monitor traffic コマンドは、ユーザーがCtrl+cキーボードシーケンスを送信してパケットキャプチャを停止するまで、情報をリアルタイムで表示します。
引数 this=None を含めることで、StartShell run() メソッドを使用して非返送シェル コマンドを実行できます。this=None引数を含めると、メソッドは指定されたタイムアウト値まで待機して、シェルからすべてのコマンド出力を取得して返します。この場合、返されたタプルの最初の項目は、実行されたシェルコマンドの結果がコンテンツを返すときにTrueされ、2番目の項目はコマンド出力です。this引数を省略するか、特定の文字列またはパターンと等しく設定すると、コマンド出力内で既定のプロンプトまたは指定された文字列パターンが検出された場合に、メソッドが返されないコマンドの部分的な出力を返す可能性があります。
次のサンプルコードでは、 monitor traffic interface fxp0 コマンドを実行し、15秒間待機してから、コマンド出力を取得して返します。
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
from pprint import pprint
dev = Device(host='router1.example.net')
with StartShell(dev) as ss:
pprint(ss.run('cli -c "monitor traffic interface fxp0"', this=None, timeout=15))
変更履歴テーブル
サポートされる機能は、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がお使いのプラットフォームでサポートされているかどうかを確認します。
StartShell インスタンスは
Device インスタンスで定義されているのと同じポートに接続します。