Utiliser Junos PyEZ pour accéder à l’interpréteur de commandes sur les équipements Junos
RÉSUMÉ Utilisez Junos PyEZ pour vous connecter au shell sur les équipements Junos et exécuter des commandes.
Vue d’ensemble de StartShell
La CLI Junos comporte de nombreuses commandes en mode opérationnel qui renvoient des informations similaires à celles renvoyées par de nombreuses commandes shell. Par conséquent, l’accès à l’interpréteur de commandes de niveau UNIX sur les équipements Junos n’est généralement pas nécessaire. Toutefois, dans certains cas, un utilisateur ou une application peut avoir besoin d’accéder à l’interpréteur de commandes et d’exécuter des commandes d’interpréteur de commandes ou d’exécuter des commandes CLI à partir de l’interpréteur de commandes.
Le module Junos PyEZ jnpr.junos.utils.start_shell
définit la StartShell
classe qui permet aux applications Junos PyEZ d’établir une connexion SSH à un périphérique Junos et d’accéder au shell. Les StartShell
méthodes permettent à l’application d’exécuter des commandes sur la connexion et de récupérer la réponse.
Les StartShell
open()
méthodes et close()
établissent et terminent une connexion SSH avec l’appareil. Par conséquent, si l’application cliente a besoin d’accéder uniquement au shell, elle peut omettre les appels aux Device
open()
méthodes and close()
.
Dans Junos PyEZ version 2.6.7 et antérieure, l’instance StartShell
se connecte au port SSH 22 par défaut. À partir de Junos PyEZ version 2.6.8, l’instance StartShell
se connecte au même port que celui défini dans l’instance Device
, sauf dans les cas suivants, où la connexion shell utilise toujours le port 22 :
-
Device
host
est défini sur 'localhost' -
Device
port
est défini sur 830. -
Device
port
n’est pas défini.
Exécuter des commandes à partir de l’interpréteur de commandes
La StartShell
run()
méthode exécute une commande shell et attend la réponse. Par défaut, la méthode attend l’une des invites de l’interpréteur de commandes par défaut (%, #, > ou $) avant de renvoyer la sortie de la commande. Alternativement, vous pouvez définir l’argument this="string"
sur une chaîne spécifique, et la méthode attend la chaîne ou le modèle attendu avant de renvoyer la sortie de la commande.
La valeur de retour est un tuple. Le premier élément est True
si le code de sortie est 0, et False
sinon. Le deuxième élément est la sortie de la commande.
L’exemple suivant se connecte à un hôte et exécute deux commandes en mode opérationnel à partir de l’interpréteur de commandes. Le script exécute d’abord la request support information
commande et enregistre la sortie dans un fichier. Le script exécute ensuite la show version
commande, stocke la sortie dans la version
variable, puis affiche le contenu 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()
Le n-uplet retourné inclut le booléen correspondant au code de sortie de la commande et à la sortie de la commande de la show version
commande. La sortie de cet exemple est tronquée par souci de concision.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
Les instances de la StartShell
classe peuvent également être utilisées comme gestionnaires de contexte. Dans ce cas, vous n’avez pas besoin d’appeler explicitement les StartShell
open()
méthodes and close()
. Par exemple:
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)
Comment spécifier le type de coque
À partir de Junos PyEZ version 2.6.4, StartShell
prend en charge l’argument shell_type
dans les scripts distants pour spécifier le type de shell. StartShell
Prend en charge les types d’interpréteurs de commandes suivants :
-
Coquille C (csh)
-
Coquille de style Bourne (frêne)
Par défaut, StartShell
les instances sont de type C Shell (csh). Vous pouvez également spécifier shell_type="sh"
de commencer une coquille de style Bourne (cendre). Par exemple:
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)
Comment spécifier un délai d’expiration
Vous pouvez inclure l’argument StartShell
timeout
pour spécifier la durée en secondes pendant laquelle l’utilitaire doit attendre la chaîne ou le modèle attendu avant d’expirer. Si vous ne spécifiez pas de délai d’expiration, la valeur par défaut est de 30 secondes.
La chaîne attendue est la valeur définie dans l’argument this
. Si vous ne définissez this
pas , la chaîne attendue est l’une des invites de l’interpréteur de commandes par défaut. Si vous définissez à la place la valeur this=None
spéciale , l’appareil attend la durée du délai d’expiration avant de capturer la sortie de la commande, comme décrit dans Exécuter les commandes de l’interpréteur de commandes non retournées.
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)
Comment échelonner l’exécution d’une commande
Parfois, vous voudrez peut-être exécuter ou boucler plusieurs appels à la run()
méthode. Pour aider à stabiliser la sortie, vous pouvez spécifier l’argument sleep
. L’argument sleep
indique à l’appareil d’attendre le nombre de secondes spécifié avant de recevoir des données de la mémoire tampon. Vous pouvez le définir sleep
en tant que nombre à virgule flottante pour une précision inférieure à la seconde.
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)
Exécuter des commandes de l’interpréteur de commandes Non-Return
Dans certains cas, vous devrez peut-être exécuter des commandes shell qui ne renvoient pas, telles que la commande, qui affiche le monitor traffic
trafic qui provient ou se termine sur le moteur de routage local. Dans l’interface de ligne de commande Junos, la monitor traffic
commande affiche les informations en temps réel jusqu’à ce que l’utilisateur envoie une séquence de touches Ctrl+c pour arrêter la capture de paquets.
Vous pouvez exécuter des commandes shell qui ne renvoient pas à l’aide de la StartShell
run()
méthode en incluant l’argument this=None
. Lorsque vous incluez l’argument this=None
, la méthode attend la valeur de délai d’expiration spécifiée pour récupérer et renvoyer toute la sortie de la commande à partir de l’interpréteur de commandes. Dans ce cas, le premier élément du tuple retourné est lorsque le résultat de la commande shell exécutée renvoie True
du contenu, et le deuxième élément est la sortie de la commande. Si vous omettez l’argument this
ou si vous le définissez comme égal à une chaîne ou à un modèle spécifique, la méthode peut renvoyer une sortie partielle d’une commande qui ne retourne pas si elle rencontre une invite par défaut ou le modèle de chaîne spécifié dans la sortie de la commande.
L’exemple de code suivant exécute la monitor traffic interface fxp0
commande, attend pendant 15 secondes, puis récupère et renvoie la sortie de la commande.
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))
Tableau de l’historique des modifications
La prise en charge des fonctionnalités est déterminée par la plate-forme et la version que vous utilisez. Utilisez l’Explorateur de fonctionnalités pour déterminer si une fonctionnalité est prise en charge sur votre plateforme.
StartShell
se connecte au même port que celui défini dans l’instance
Device
, sauf si l’hôte est défini sur localhost ou si le port est 830 ou non défini.