使用 Junos PyEZ 访问 Junos 设备上的命令行管理程序
总结 使用 Junos PyEZ 连接到 Junos 设备上的外壳并执行命令。
StartShell 概述
Junos CLI 具有许多操作模式命令,这些命令返回的信息类似于许多 shell 命令返回的信息。因此,通常不需要访问 Junos 设备上的 UNIX 级外壳。但是,在某些情况下,用户或应用程序可能需要访问 shell 并执行 shell 命令或从 shell 执行 CLI 命令。
Junos PyEZ jnpr.junos.utils.start_shell
模块定义了 StartShell
类,使 Junos PyEZ 应用程序能够启动与 Junos 设备的 SSH 连接并访问外壳。这些 StartShell
方法使应用程序随后能够通过连接执行命令并检索响应。
StartShell
open()
和close()
方法建立并终止与设备的 SSH 连接。因此,如果客户端应用程序只需要访问 shell,则可以省略对 and Device
open()
close()
方法的调用。
在 Junos PyEZ 版本 2.6.7 及更低版本中, StartShell
实例连接到默认 SSH 端口 22。从 Junos PyEZ 版本 2.6.8 开始, StartShell
实例将连接到实例中 Device
定义的同一端口,但以下情况除外,其中 shell 连接仍使用端口 22:
-
Device
host
设置为“本地主机” -
Device
port
设置为 830。 -
Device
port
未定义。
从命令行管理程序执行命令
该方法StartShell
run()
执行 shell 命令并等待响应。默认情况下,该方法在返回命令输出之前等待默认 shell 提示之一(%、#、> 或 $)。或者,可以将参数设置为this="string"
特定字符串,该方法在返回命令输出之前等待预期的字符串或模式。
返回值是一个元组。第一项是 True
退出代码是否为 0, False
否则。第二项是命令的输出。
以下示例连接到主机并从 shell 执行两个操作模式命令。脚本首先执行 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"
启动 Bourne 样式的外壳(灰)。例如:
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
,则预期的字符串是默认的 shell 提示符之一。如果改为设置特殊值 this=None
,则设备在捕获命令输出之前会等待超时的持续时间,如 执行不返回的 Shell 命令中所述。
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)
执行不返回的外壳命令
在某些情况下,您可能需要执行不返回的 shell 命令,例如 monitor traffic
显示在本地路由引擎上发起或终止的信息流的命令。在 Junos CLI 中,命令会 monitor traffic
实时显示信息,直到用户发送 Ctrl+c 键盘序列来停止数据包捕获。
您可以通过包含参数this=None
来使用该方法执行不返回的 shell 命令。StartShell
run()
包含this=None
参数时,该方法会等到指定的超时值,以检索并返回 shell 的所有命令输出。在这种情况下,返回元组的第一项是True
当执行的 shell 命令的结果返回内容时,第二项是命令输出。如果省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
定义的同一端口,但主机设置为 localhost 或端口为 830 或未定义的情况除外。