Use o Junos PyEZ para acessar a Shell em dispositivos Junos
RESUMO Use o Junos PyEZ para se conectar à shell em dispositivos Junos e executar comandos.
Visão geral do StartShell
O Junos CLI tem muitos comandos de modo operacional que retornam informações semelhantes às informações devolvidas por muitos comandos de shell. Assim, o acesso à shell de nível UNIX em dispositivos Junos normalmente não é necessário. No entanto, em alguns casos, um usuário ou aplicativo pode precisar acessar o shell e executar comandos shell ou executar comandos CLI a partir da shell.
O módulo Junos PyEZ jnpr.junos.utils.start_shell
define a StartShell
classe, que permite que os aplicativos Junos PyEZ iniciem uma conexão SSH com um dispositivo Junos e acessem a shell. Os StartShell
métodos permitem que o aplicativo execute comandos sobre a conexão e recuperar a resposta.
Os métodos e close()
os StartShell
open()
métodos estabelecem e terminam uma conexão SSH com o dispositivo. Como resultado, se o aplicativo cliente exigir acesso apenas à shell, ele pode omitir as chamadas e close()
os Device
open()
métodos.
No Junos PyEZ Release 2.6.7 e anterior, a StartShell
instância se conecta à porta SSH padrão 22. A partir do Junos PyEZ Release 2.6.8, a StartShell
instância se conecta à mesma porta que é definida na Device
instância, exceto nos seguintes casos, em que a conexão shell ainda usa a porta 22:
-
Device
host
está definido para 'localhost' -
Device
port
está definido para 830. -
Device
port
é indefinido.
Execute comandos da Shell
O StartShell
run()
método executa um comando de shell e aguarda a resposta. Por padrão, o método espera por um dos prompts de shell padrão (%, #, > ou $) antes de devolver a saída de comando. Como alternativa, você pode definir o this="string"
argumento para uma string específica, e o método aguarda o string ou padrão esperados antes de devolver a saída de comando.
O valor de retorno é um tuple. O primeiro item é True
se o código de saída for 0 e False
de outra forma. O segundo item é a saída do comando.
O exemplo a seguir se conecta a um host e executa dois comandos de modo operacional a partir da shell. O script primeiro executa o request support information
comando e salva a saída em um arquivo. O script então executa o show version
comando, armazena a saída na variável e, em version
seguida, imprime o conteúdo da variável.
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()
A tuple devolvida inclui o Boolean correspondente ao código de saída para o comando e a saída de comando para o show version
comando. A saída neste exemplo é truncada por brevidade.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
Instâncias da StartShell
classe também podem ser usadas como gerentes de contexto. Neste caso, você não precisa chamar explicitamente os métodos e close()
os StartShell
open()
métodos. Por exemplo:
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)
Como especificar o tipo de shell
A partir do Junos PyEZ Release 2.6.4, StartShell
oferece suporte ao shell_type
argumento dentro de scripts remotos para especificar o tipo de shell que StartShell
oferece suporte aos seguintes tipos de shell:
-
C Shell (csh)
-
Concha no estilo Bourne (cinzas)
Por padrão, StartShell
as instâncias são tipo C Shell (csh). Você também pode especificar shell_type="sh"
para iniciar uma concha no estilo Bourne (cinzas). Por exemplo:
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)
Como especificar um intervalo
Você pode incluir o StartShell
timeout
argumento para especificar a duração do tempo em segundos que o utilitário deve esperar pela corda ou padrão esperados antes de cronometrar. Se você não especificar um tempo limite, o padrão será de 30 segundos.
A sequência esperada é o valor definido no this
argumento. Se você não definir this
, a string esperada é um dos prompts padrão da shell. Se, em vez disso, definir o valor this=None
especial, o dispositivo aguarda a duração do tempo limite antes de capturar a saída de comando, conforme descrito em Execute Comandos shell sem releitura.
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)
Como escalonar a execução de comando
Às vezes, você pode querer executar ou loop várias chamadas para o run()
método. Para ajudar a estabilizar a saída, você pode especificar o sleep
argumento. O sleep
argumento instrui o dispositivo a esperar pelo número especificado de segundos antes de receber dados do buffer. Você pode definir sleep
como um número de ponto flutuante para precisão abaixo de um segundo.
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)
Execute comandos de shell sem roteamento
Em certos casos, você pode precisar executar comandos de shell não revirados, como o monitor traffic
comando, que exibe tráfego que se origina ou termina no Mecanismo de Roteamento local. No Junos CLI, o monitor traffic
comando exibe as informações em tempo real até que o usuário envie uma sequência de teclado Ctrl+c para interromper a captura de pacotes.
Você pode executar comandos de shell sem releitura usando o StartShell
run()
método incluindo o argumento this=None
. Quando você inclui o this=None
argumento, o método aguarda até o valor de tempo limite especificado para recuperar e devolver todas as saídas de comando da shell. Neste caso, o primeiro item da tuple devolvida é True
quando o resultado do comando de shell executado retorna conteúdo, e o segundo item é a saída de comando. Se você omitir o this
argumento ou configurá-lo igual a uma corda ou padrão específicos, o método pode devolver a saída parcial para um comando não revirado se encontrar um prompt padrão ou o padrão de string especificado dentro da saída de comando.
O código de amostra a seguir executa o monitor traffic interface fxp0
comando, espera por 15 segundos e depois recupera e retorna a saída de 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))
Tabela de histórico de mudanças
O suporte de recursos é determinado pela plataforma e versão que você está usando. Use o Feature Explorer para determinar se um recurso é suportado em sua plataforma.
StartShell
instância se conecta à mesma porta que é definida na
Device
instância, exceto quando o host está definido para localhost ou a porta é 830 ou não está definida.