Usar Junos PyEZ para acceder al shell en dispositivos Junos
RESUMEN Utilice Junos PyEZ para conectarse al shell en dispositivos Junos y ejecutar comandos.
Descripción general de StartShell
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, el acceso al shell de nivel UNIX en dispositivos Junos generalmente no es necesario. Sin embargo, en algunos casos, es posible que un usuario o una aplicación necesiten acceder al shell y ejecutar comandos de shell o ejecutar comandos de CLI desde el shell.
El módulo Junos PyEZ jnpr.junos.utils.start_shell
define la clase, que permite a las StartShell
aplicaciones de Junos PyEZ iniciar una conexión SSH a un dispositivo Junos y acceder al shell. Los StartShell
métodos permiten que la aplicación ejecute comandos a través de la conexión y recupere 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 requiere acceso solo al shell, puede omitir las llamadas a los Device
open()
métodos y close()
.
En Junos PyEZ versión 2.6.7 y anteriores, la StartShell
instancia se conecta al puerto SSH predeterminado 22. A partir de Junos PyEZ versión 2.6.8, la StartShell
instancia se conecta al mismo puerto definido en la Device
instancia, excepto en los casos siguientes, en los que la conexión de shell todavía utiliza el puerto 22:
-
Device
host
está configurado en 'localhost' -
Device
port
se establece en 830. -
Device
port
no está definido.
Ejecutar comandos desde el Shell
El StartShell
run()
método ejecuta un comando de shell y espera la respuesta. De forma predeterminada, el método espera a uno de los indicadores de shell predeterminados (%, #, > o $) antes de devolver el resultado del comando. Como alternativa, puede establecer el this="string"
argumento en una cadena específica y el método espera la cadena o el patrón esperados antes de devolver el resultado del comando.
El valor devuelto es una tupla. El primer elemento es True
si el código de salida es 0 y False
de lo contrario. El segundo elemento es la salida del comando.
En el ejemplo siguiente se conecta a un host y se ejecutan dos comandos de modo operativo desde el shell. El script primero ejecuta el request support information
comando y guarda el resultado en un archivo. A continuación, el script 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()
La tupla devuelta incluye el valor booleano correspondiente al código de salida del comando y la salida del comando para el show version
comando. El resultado de este ejemplo se trunca por 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 utilizar 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)
Cómo especificar el tipo de shell
A partir de Junos PyEZ versión 2.6.4, StartShell
admite el shell_type
argumento dentro de scripts remotos para especificar el tipo de shell. StartShell
Admite los siguientes tipos de shell:
-
C Shell (csh)
-
Concha estilo Bourne (fresno)
De forma predeterminada, StartShell
las instancias son de tipo C Shell (csh). También puede especificar shell_type="sh"
que se inicie un shell de estilo Bourne (ash). Por ejemplo:
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)
Cómo especificar un tiempo de espera
Puede incluir el StartShell
timeout
argumento para especificar la duración del tiempo en segundos que la utilidad debe esperar a la cadena o patrón esperado antes de agotar el tiempo de espera. Si no especifica un tiempo de espera, el valor predeterminado es 30 segundos.
La cadena esperada es el valor definido en el this
argumento. Si no define this
, la cadena esperada es uno de los mensajes de shell predeterminados. Si, en cambio, establece el valor this=None
especial, el dispositivo espera a que se agote el tiempo de espera antes de capturar la salida del comando, tal como se describe en Ejecutar comandos de shell que no se devuelven.
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)
Cómo escalonar la ejecución de comandos
A veces, es posible que desee ejecutar o realizar varias llamadas en bucle al run()
método. Para ayudar a estabilizar el resultado, puede especificar el sleep
argumento. El sleep
argumento indica al dispositivo que espere el número de segundos especificado antes de recibir datos del búfer. Puede definirse sleep
como un número de coma flotante para una precisión de subsegundo.
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)
Ejecutar comandos de shell que no retornan
En algunos casos, es posible que deba ejecutar comandos de shell que no se devuelven, 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, 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 que no devuelvan utilizando el StartShell
run()
método incluyendo el argumento this=None
. Cuando se incluye el this=None
argumento, el método espera hasta el valor de tiempo de espera especificado para recuperar y devolver todos los resultados del comando del shell. En este caso, el primer elemento de la tupla devuelta es True
cuando el resultado del comando de shell ejecutado devuelve contenido, y el segundo elemento es la salida del comando. Si omite el this
argumento o lo establece igual a una cadena o patrón específico, el método puede devolver un resultado parcial para un comando que no devuelve si encuentra un indicador predeterminado o el patrón de cadena especificado dentro de la salida del comando.
El código de ejemplo siguiente 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))
Tabla de historial de cambios
La compatibilidad con las funciones viene determinada por la plataforma y la versión que esté utilizando. Utilice el Explorador de características para determinar si una característica es compatible con su plataforma.
StartShell
instancia se conecta al mismo puerto definido en la
Device
instancia, excepto cuando el host está establecido como localhost o el puerto es 830 o indefinido.