Utilice Junos PyEZ para acceder al Shell en dispositivos Junos
La CLI de Junos tiene muchos comandos de modo operativo que devuelven información similar a la que devuelven muchos comandos de shell. Por lo tanto, no es necesario tener acceso al shell de nivel UNIX en dispositivos Junos. Sin embargo, en algunos casos, es posible que un usuario o aplicación necesite tener acceso al shell y ejecutar comandos de shell o comandos de CLI desde el shell.
El módulo Junos PyEZ jnpr.junos.utils.start_shell
define la clase, lo StartShell
que permite a las aplicaciones de Junos PyEZ iniciar una conexión SSH a un dispositivo Junos y acceder al shell. Los StartShell
métodos permiten a la aplicación ejecutar comandos a través de la conexión y recuperar la respuesta. Los StartShell
open()
métodos y close()
establecen y terminan una conexión SSH con el dispositivo. Como resultado, si la aplicación cliente solo requiere acceso al shell, puede omitir las llamadas a los Device
open()
métodos y close()
.
A partir de Junos PyEZ versión 2.6.4, Startshell
admite la shell_type
opción dentro de scripts remotos para especificar el tipo de shell. De forma predeterminada, Startshell
las instancias son de tipo C Shell (csh). También puede especificar shell_type="sh"
para iniciar un shell de estilo Bourne (ash).
El StartShell
run()
método ejecuta un comando shell y espera la respuesta. De forma predeterminada, el método espera uno de los indicadores de shell predeterminados (%, #, > o $) antes de devolver el resultado del comando. Si establece el this="string"
argumento en una cadena específica, el método espera la cadena o el patrón esperados antes de devolver el resultado del comando. El valor devuelto es una tupla, donde el primer elemento es True
si el código de salida es 0, y False
de lo contrario, y el segundo elemento es el resultado del comando.
En el ejemplo siguiente, se conecta a un host y ejecuta dos comandos de modo operativo desde el shell. La secuencia de comandos ejecuta primero el request support information
comando y guarda el resultado en un archivo. A continuación, la secuencia de comandos ejecuta el show version
comando, almacena el resultado en la version
variable y, a continuación, imprime el contenido de la variable.
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()
En este ejemplo, la tupla devuelto incluye el booleano correspondiente al código de salida del comando y el resultado show version
del comando. La salida de este ejemplo se trunca para la brevedad.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
Las instancias de la StartShell
clase también se pueden usar como administradores de contexto. En este caso, no es necesario llamar explícitamente a los StartShell
open()
métodos y close()
. Por ejemplo:
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)
Puede incluir el StartShell
timeout
argumento para especificar la duración del tiempo en segundos que la utilidad debe esperar para la cadena o el patrón esperados en el shell de Junos OS antes de agotar el tiempo de espera. Si no especifica un tiempo de espera, el valor predeterminado es de 30 segundos.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev, timeout=60) as ss: ss.run('cli -c "request support information | save /var/tmp/information.txt"') version = ss.run('cli -c "show version"') print (version)
En ciertos casos, es posible que deba ejecutar comandos de shell sin retorno, como el comando, que muestra el monitor traffic
tráfico que se origina o termina en el motor de enrutamiento local. En la CLI de Junos OS, el monitor traffic
comando muestra la información en tiempo real hasta que el usuario envía una secuencia de teclado Ctrl + c para detener la captura de paquetes.
Puede ejecutar comandos de shell sin retorno mediante el StartShell
run()
método incluyendo el argumento this=None
. Cuando se incluye el this=None
argumento, el método espera hasta que el valor de tiempo de espera especificado para recuperar y devolver todos los comandos de salida del shell. En este caso, el primer elemento de la tupla devuelto es True
cuando el resultado del comando de shell ejecutado devuelve contenido y el segundo elemento es el resultado del comando. Si omite el this
argumento o lo establece como igual a una cadena o patrón específico, el método podría devolver una salida parcial para un comando que no se revuelvo si encuentra un símbolo predeterminado o el patrón de cadena especificado dentro de la salida del comando.
El siguiente código de ejemplo ejecuta el monitor traffic interface fxp0
comando, espera 15 segundos y, a continuación, recupera y devuelve el resultado del comando.
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))