Junos PyEZ を使用して Junos デバイス上のシェルにアクセスする
概要 Junos PyEZ を使用して、Junos デバイス上のシェルに接続し、コマンドを実行します。
スタートシェルの概要
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
インスタンスで定義されているものと同じポートに接続します。
-
Device
host
は 'localhost' に設定されています -
Device
port
は 830 に設定されます。 -
Device
port
は未定義です。
シェルからコマンドを実行する
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"
を指定して、ボーンスタイルのシェル (ash) を開始することもできます。例えば:
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 dev = Device(host='router1.example.net') tables = ['inet.0', 'inet.6'] 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 では、ユーザーが Ctrl+c キーボード シーケンスを送信してパケット キャプチャを停止するまで、 monitor traffic
コマンドはリアルタイムで情報を表示します。
引数 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
インスタンスで定義されているのと同じポートに接続します。