Ir para o conteúdo principal

Na semana passada (bem, era a semana passada quando comecei a escrever isto), recebemos uma solicitação no CAC em que alguém queria criar uma macro de comando que executasse o telnet para fazer login em um sistema e executar alguns comandos; por exemplo, a macro de comando test.cm faz login em um host remoto e executa a macro de comando foo.cm.

&attach_input                                                                 
telnet 192.168.77.128
senha
foo.cm

Figura 1 – Macro de comando telnet test.cm

display_line display_system_usage                                             
display_system_usage
display_line netstat -statistics -protocol tcp
netstat -statistics
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -request_line 'stcp_meters' -quit

Figura 2 – foo.cm

 

Infelizmente, o telnet não foi projetado para ser executado em uma macro de comando e, por isso, apresenta falha.

teste                                                                          
telnet: erro fatal - falha no tcgetattr
Erro na linha 3 do teste.
command_processor: Objeto não encontrado. password. Na macro de comando
     %azvos#m17_mas>SysAdmin>Noah_Davids>test.cm

Figura 3 – Falha na execução do test.cm

 

No entanto, existem várias maneiras de realizar o login automático em um host remoto seguido da execução de comandos.

send_cmds.c:

Escrevi há algum tempo um programa que se conecta a um servidor Telnet, envia sequências de caracteres e analisa a saída. A linguagem de script é simples, mas funciona bem para tarefas básicas. O código-fonte, com exemplos mais detalhados, pode ser encontrado aqui

O script consiste basicamente em uma string de envio seguida por uma string de espera. O script avança para a próxima linha quando a string de espera é detectada; como eu disse, é muito simples. O script possui argumentos; na figura 4, uso arg0 para a senha, de modo que minha senha não fica armazenada no script. A execução do script segue na figura 5. Trunquei a saída de cada comando para economizar espaço. Você notará que os caracteres não de controle das sequências de posicionamento de caracteres são exibidos até que eu defina o tipo de terminal como ASCII.

//login                                                                         
/login nd/Password?
/arg0/ready
/set_terminal_parameters -terminal_type ascii -pause_lines 0/ready
/foo.cm/ready
/quit/quit

Figura 4 – Script `send_cmds` para fazer login e executar a macro de comando `foo`

send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 password

       SISTEMA DE TESTE PHOENIX CAC VOS (%phx_vos#m16)

   *** Para inicializar em uma versão diferente do VOS, consulte     ***
   *** >Overseer>COMMON>cfg>reconfig_instructions ***

OpenVOS Versão 17.1.0ax, Módulo %phx_vos#m16
Por favor, faça login  08:15:01
login nd
Senha?
Noah_Davids.CAC conectado em %phx_vos#m16 em 21/04/2013 às 08:15:01 mst.
[f[J[?7l[20l=[1m[1;24r[f[J[J[24;80f
[0;1mpronto  08:15:01
[0mset_terminal_parameters -terminal_type ascii -pause_lines 0
[1mset_terminal_parameters -terminal_type ascii -pause_lines 0

pronto  08:15:01
foo.cm
display_system_usage
Estatísticas de uso para o módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Total de 762,6 horas (31,7 dias) em funcionamento.
----CPU-----         Último minuto     Últimos 5 minutos       Última hora      Tempo total de funcionamento
. . . . .
Tempo interno           0,00  0,1%     0,02  0,1%      0,23  0,1%     191,65  0,1%
netstat -statistics
tcp:
. . . . 
       201766  tcpOutRsts

analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 884, ptep 8D3E6000, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                762:36:19     21/04/13 08:15:02
 . . . .
   bufdat executado                             678 (média 0,0002/seg)

pronto  08:15:02
pronto  08:15:03

Figura 5 – Execução do send_cmds

 

esperar:

Existe um programa chamado expect na biblioteca gnu_library. A sintaxe de um script expect pode ser bastante complexa; ela permite ramificações com base em diferentes strings de retorno, permitindo que você lide com erros de forma inteligente, em vez de simplesmente esperar o tempo de espera expirar. Você pode procurar exemplos na internet; basta pesquisar por “exemplos de scripts expect”. Apresentarei um script simples que apenas faz login e executa a macro foo.cm. Observe que havia alguns bugs nas versões iniciais do gnu_tools (por isso escrevi o send_cmds), mas a partir da versão 3.4.0a você não deve ter problemas. Embora eu não mostre isso, o expect também pode usar argumentos, de modo que a senha não precisa fazer parte do script ou o script pode solicitar que você digite uma senha. Mais uma vez, trunquei a saída do comando do script e você pode ver que os caracteres não de controle das strings de posicionamento de caracteres são exibidos até que eu defina o tipo de terminal como ASCII. O Expect, no entanto, filtra a string de maneira diferente, de modo que nem todos os caracteres são mostrados.

spawn "telnet"                                                                
expect "telnet>"
send "open 192.168.77.128r"
esperar "login"
enviar "login ndr"
esperar "Senha"
enviar "passwordr"
esperar "pronto"
enviar "set_terminal_parameters -terminal_type ascii -pause_lines 0r"
esperar "pronto"
enviar "foo.cmr"
esperar "pronto"

Figura 6 – o script deve fazer o login e executar a macro do comando foo

>bin>expect test.expect\
spawn telnet\
telnet> open 192.168.77.128\
Tentando...\
Conectado a 192.168.77.128.\
O caractere de escape é '^]'.


       SISTEMA DE TESTE PHOENIX CAC VOS (%phx_vos#m16)

   *** Para inicializar em uma versão diferente do VOS, consulte     ***
   *** >Overseer>COMMON>cfg>reconfig_instructions ***

OpenVOS Versão 17.1.0ax, Módulo %phx_vos#m16
Faça login  08:51:28
login nd
Senha?

Noah_Davids.CAC conectado em %phx_vos#m16 em 21/04/2013 às 08:51:28 mst.
fJ?7l20l
0;1mpronto  08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
pronto  08:51:28
foo.cm
display_system_usage
Estatísticas de uso para o módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Total de 763,2 horas (31,8 dias) em funcionamento.

----CPU-----         Último Min     Últimos 5 Min       Última Hora      Tempo Total de Funcionamento
. . . .
Tempo Int.           0,00  0,1%     0,02  0,1%      0,24  0,1%     191,80  0,1%
netstat -statistics
tcp:
. . . .
       201926  tcpOutRsts

analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 895, ptep 8D2E1200, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                763:12:46     21/04/13 08:51:29
. . . .
   bufdat executado                             678 (média 0,0002/seg)

pronto  08:51:29
pronto  08:51:29

Figura 7 – Execução do script expect

 

SSH:

Por fim, você pode usar o SSH para executar um comando em um sistema remoto. Se você também tiver configurado a autenticação por chave pública, não será solicitado que digite uma senha no momento da execução.

Há algumas peculiaridades interessantes ao usar o SSH. Primeiro, as abreviações não funcionam; não tente executar o `dps`, use o `display_print_status`.

ssh [email protected] dbs                                                     
sh: dbs: comando não encontrado
pronto  12:26:25

Figura 8 – O uso do SSH para executar remotamente uma abreviação de comando não funciona

ssh [email protected] display_batch_status                                    

Filas de processamento em lote para %phx_vos#m16

FILA                    ESTADO   MÁX.           TAREFAS EM EXECUÇÃO
normal                    em execução      5
pronta  12:26:43

Figura 9 – A execução remota de um comando via SSH funciona

 

Em segundo lugar, a execução direta de uma macro de comando não funciona; observe que não há saída e parece que apenas o primeiro comando da macro foi processado.

ssh [email protected] 'foo.cm'                                                
display_system_usage
pronto  12:08:40

Figura 10 – A execução remota de uma macro de comando via SSH nem sempre funciona

 

Em vez disso, você precisa executar o comando do shell e fornecer a macro de comando como seu argumento.

ssh [email protected] '/bin/sh foo.cm'
display_system_usage
Estatísticas de uso do módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Total de 766,5 horas (31,9 dias) em funcionamento.

----CPU-----         Último Min     Últimos 5 Min       Última Hora      Tempo Total de Funcionamento
Minutos de CPU         0,02  0,5%     0,09  0,4%      0,91  0,4%     724,76  0,4%
. . . .
Tempo interno           0,00  0,1%     0,02  0,1%      0,23  0,1%     192,57  0,1%
netstat -statistics
tcp:
. . . .
       202796  tcpOutRsts

analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 922, ptep 8D3C2780, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                766:30:14     21/04/13 12:08:57
. . . .
   bufdat executado                             678 (média 0,0002/seg)

pronto  12:08:59

Figura 11 – Utilização do SSH para executar remotamente uma macro de comando, executando-a como um script de shell

 

Macros complexas não funcionarão. Por exemplo, cada linha da macro de comando é executada como um processo separado; portanto, macros que utilizam a variável process_dir para armazenar resultados intermediários não funcionarão. Observe que cada chamada da função analyze_system retorna um número de processo diferente.

ssh [email protected] '/bin/sh foo3.cm'                                       

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  21/04/2013 12:52:20 mst

display foo3.cm
display_line
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit


OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 1028, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 1029, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Versão 17.1.0ax, analyze_system Versão 17.1.0ax
O processo atual é 1030, ptep 8D3C3000, Noah_Davids.CAC
pronto  12:52:21

Figura 12 – Cada comando da macro é executado como um processo separado

 

O uso de macros de comando com variáveis no estilo VOS gerará erros de sintaxe, pois o shell não reconhece essas variáveis. A macro de comando foo3.cm exibe seu próprio nome e, em seguida, conta até 9. O comando display é executado e o “&set” gera um erro de sintaxe.

ssh [email protected] '/bin/sh foo3.cm'                                       

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  13-04-22 07:33:18 mst

display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again

foo3.cm: line 2: syntax error near unexpected token `&s'
foo3.cm: line 2: `&set COUNT 1'
ready  07:33:18

Figura 13 – As macros de comando com variáveis no estilo VOS não funcionarão

 

Mas usar variáveis do shell funciona. É claro que isso pode exigir uma reescrita extensa das macros existentes. Aqui está um exemplo da mesma macro como um script de shell.

ssh [email protected] '/bin/sh foo3u'                                         
cat foo3u
count=1
while [[ $count -le 9 ]]
do
    echo "$count"
    (( count++ ))
done
1
2
3
4
5
6
7
8
9
pronto  07:44:41

Figura 14 – O script de shell com variáveis de tipo de shell funciona

 

No entanto, você pode executar sua macro de comando no estilo VOS como um processo iniciado e, em seguida, exibir o arquivo de saída gerado. A macro start_foo3.cm executa o start_process, aguarda a conclusão do processo e, em seguida, exibe o arquivo de saída sem cabeçalho. Modifiquei o foo3.cm para desativar as linhas de comando e de macro, bem como o prompt de prontidão, a fim de imitar mais fielmente a saída de uma macro de comando executada de forma interativa.

start_process foo3.cm -wait                                                   
display foo3.out -no_header

Figura 15 – Macro de comando para executar o foo3.cm como um processo iniciado

 

Com exceção do cabeçalho de login, do nome da macro de comando nas duas primeiras linhas e da linha “Processo concluído” no final, os resultados são os mesmos que se você tivesse executado a macro a partir da linha de comando do VOS.

ssh [email protected] '/bin/sh start_foo3.cm'                                 
Noah_Davids.CAC logged in on %phx_vos#m16 at 13-04-22 10:45:23 mst.
foo3.cm

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  13-04-22 10:45:23 mst

&echo no_input_lines no_command_lines no_macro_lines
set_ready -format off
display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again

1
2
3
4        
5
6
7
8
9
Process finished.
ready  10:45:25

Figura 16 – Resultados da execução do foo.cm em um processo iniciado

 

Então, como você pode ver, embora não seja possível usar o telnet, existem outras maneiras de fazer login automaticamente e executar comandos.

© 2024 Stratus Technologies.