Use o Junos PyEZ para acessar o shell em dispositivos Junos
Use o Junos PyEZ para se conectar ao shell em dispositivos Junos e executar comandos.
Visão geral do StartShell
A Junos CLI tem muitos comandos de modo operacional que retornam informações semelhantes às informações retornadas por muitos comandos shell. Assim, o acesso ao shell de nível UNIX em dispositivos Junos geralmente 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 do shell.
O módulo Junos PyEZ jnpr.junos.utils.start_shell define a classe, o que permite que as StartShell aplicações Junos PyEZ iniciem uma conexão SSH com um dispositivo Junos e acessem o shell. Os StartShell métodos permitem que o aplicativo execute comandos pela conexão e recupere a resposta.
Os StartShell open() métodos and close() estabelecem e encerram uma conexão SSH com o dispositivo. Como resultado, se o aplicativo cliente exigir acesso apenas ao shell, ele poderá omitir as chamadas para os Device open() métodos and close() .
No Junos PyEZ versão 2.6.7 e anteriores, 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 definida na Device instância, exceto nos seguintes casos, em que a conexão do shell ainda usa a porta 22:
-
Devicehostestá definido como 'localhost' -
Deviceportestá definido como 830. -
Deviceporté indefinido.
Executar comandos do shell
O StartShell run() método executa um comando shell e aguarda a resposta. Por padrão, o método aguarda um dos prompts de shell padrão (%, #, > ou $) antes de retornar a saída do comando. Como alternativa, você pode definir o this="string" argumento como uma cadeia de caracteres específica e o método aguarda a cadeia de caracteres ou o padrão esperado antes de retornar a saída do comando.
O valor retornado é uma tupla. O primeiro item é True se o código de saída for 0 e False caso contrário. O segundo item é a saída do comando.
O exemplo a seguir se conecta a um host e executa dois comandos de modo operacional do shell. O script primeiro executa o request support information comando e salva a saída em um arquivo. Em seguida, o script executa o show version comando, armazena a version saída na variável e 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 tupla retornada inclui o booleano correspondente ao código de saída do comando e a saída do show version comando. A saída neste exemplo é truncada para fins de brevidade.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
As instâncias da StartShell classe também podem ser usadas como gerenciadores de contexto. Nesse caso, você não precisa chamar explicitamente os StartShell open() métodos and close() . 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 em scripts remotos para especificar o tipo de shell. StartShell Oferece suporte aos seguintes tipos de shell:
-
Shell C (csh)
-
Concha estilo Bourne (cinza)
Por padrão, StartShell as instâncias são do tipo C Shell (csh). Você também pode especificar shell_type="sh" para iniciar um shell no estilo Bourne (ash). 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 tempo limite
Você pode incluir o StartShell timeout argumento para especificar a duração do tempo em segundos que o utilitário deve aguardar pela cadeia de caracteres ou padrão esperado antes de atingir o tempo limite. Se você não especificar um tempo limite, o padrão será 30 segundos.
A cadeia de caracteres esperada é o valor definido no this argumento. Se você não definir this, a string esperada será um dos prompts padrão do shell. Se, em vez disso, você definir o valor this=Noneespecial, o dispositivo aguardará a duração do tempo limite antes de capturar a saída do comando, conforme descrito em Executar comandos do shell sem retorno.
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 comandos
Às vezes, talvez você queira executar ou fazer um loop de 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 aguardar o 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 de menos de um segundo.
from jnpr.junos import Device
from jnpr.junos.utils.start_shell import StartShell
from pprint import pprint
dev = Device(host='router1.example.net')
tables = ['inet.0', 'inet6.0']
with StartShell(dev) as ss:
for table in tables:
command = 'cli -c "show route table ' + table + '"'
rsp = ss.run(command, sleep=5)
pprint (rsp)
Executar comandos de shell sem retorno
Em certos casos, pode ser necessário executar comandos shell que não retornam, como o comando, que exibe o monitor traffic tráfego que se origina ou termina no Mecanismo de Roteamento local. Na 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 shell que não retornam 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 retornar toda a saída de comando do shell. Nesse caso, o primeiro item da tupla retornada é True quando o resultado do comando shell executado retorna conteúdo e o segundo item é a saída do comando. Se você omitir o this argumento ou defini-lo como igual a uma cadeia de caracteres ou padrão específico, o método poderá retornar uma saída parcial para um comando que não retorna se encontrar um prompt padrão ou o padrão de cadeia de caracteres especificado na saída do comando.
O código de exemplo a seguir executa o monitor traffic interface fxp0 comando, aguarda 15 segundos e, em seguida, recupera e retorna a saída do 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 alterações
A compatibilidade com recursos é determinada pela plataforma e versão utilizada. Use o Explorador de recursos para determinar se um recurso é compatível com sua plataforma.
StartShell instância se conecta à mesma porta definida na
Device instância, exceto quando o host é definido como localhost ou a porta é 830 ou indefinida.