Na semana passada (bem, foi na semana passada quando comecei a escrever isto) tivemos um problema no CAC onde alguém queria escrever uma macro de comando que executasse o telnet para entrar em um sistema e executar alguns comandos, por exemplo o comando macro test.cm logins em um host remoto e executa a macro de comando foo.cm.
&attach_input
telnet 192.168.77.128
senha
foo.cm
|
Figura 1 - teste de macro de comando telnet.cm |
display_line display_system_usage
display_system_usage
display_line netstat -statistics -protocolo tcp
netstat -estat -estatística
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 é projetado para executar em uma macro de comando e falha.
teste
telnet: erro fatal - tcgetattr falhou
Erro na linha 3 do teste.
processador_comando: Objeto não encontrado. senha. Em macro de comando
%azvos#m17_mas>SysAdmin>Noah_Davids>test.cm
|
Figura 3 - execução do teste.cm falha |
No entanto, há várias maneiras de se fazer o login automático em um host remoto seguido pela execução de comandos.
send_cmds.c:
Escrevi um programa há algum tempo atrás que faz uma conexão com um servidor telnet, envia cordas e analisa a saída. A linguagem de scripting é simples, mas para coisas simples funciona bem. O código fonte com exemplos mais extensos pode ser encontrado aqui
O roteiro é basicamente uma seqüência de envio seguida por uma seqüência de espera. O roteiro avança para a próxima linha quando a cadeia de espera é vista, como eu disse, muito simples. O script tem argumentos, na figura 4 eu uso arg0 para a senha para que minha senha não seja armazenada no script. A execução do script segue na figura 5. Eu trunquei a saída de cada comando no interesse de economizar espaço. Você notará que os caracteres sem controle das cadeias de posicionamento de caracteres são exibidos até que eu configure o tipo de terminal para ascii.
//login
/login nd/Password?
/arg0/ready
/set_terminal_parameters -terminal_type ascii -pause_lines 0/ready
/foo.cm/ready
/quit/quit
|
Figura 4 - enviar_cmds script para login e executar a macro de comando foo |
send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 senha
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Para iniciar em uma versão diferente do VOS ver ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Módulo %phx_vos#m16
Favor fazer o login 08:15:01
login e
Senha?
Noah_Davids.CAC fez login em %phx_vos#m16 em 13-04-21 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 utilização do módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas as 762,6 horas (31,7 dias) acima.
----CPU----- Último minuto Último minuto 5 Última hora de funcionamento
. . . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,23 0,1% 191,65 0,1%
netstat -estat -estatística
tcp:
. . . .
201766 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -longo -quit
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é o 884, p passo 8D3E6000, Noah_Davids.CAC
stcp_meters %phx_vos#m16 762:36:19 13-04-21 08:15:02
. . . .
bufdat executado 678 (avg 0.0002/sec)
pronto 08:15:02
pronto 08:15:03
|
Figura 5 - execução send_cmds |
esperar:
Há um programa chamado expect na gnu_library. A sintaxe de um script expect pode ser muito complexa, ele permite ramificações baseadas em diferentes cadeias de retorno para que você possa lidar inteligentemente com os erros ao invés de apenas sincronizar. Você pode verificar na web por exemplos, basta procurar por "esperar exemplos de script". Apresentarei um script simples que apenas faz o login e executa a macro foo.cm. Note que havia alguns erros nas primeiras versões do gnu_tools (por isso escrevi send_cmds), mas a partir do lançamento 3.4.0a você deve estar OK. Embora eu não o mostre, espere também pode usar argumentos para que a senha não tenha que fazer parte do script ou o script pode solicitar uma senha. Novamente trunquei a saída do comando do script e você pode ver que os caracteres sem controle das strings de posicionamento de caracteres são exibidos até eu definir o tipo de terminal como ascii. Espere, porém, que a cadeia de caracteres seja filtrada de forma diferente para que nem todos os caracteres sejam mostrados.
desovar "telnet
esperar "telnet>".
enviar "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 - esperar que o script faça o login e execute a macro de comando foo |
>bin>expect test.expect
telnet de spawn
telnet> aberto 192.168.77.128
Tentando...
Conectado a 192.168.77.128.
O caráter de fuga é "^]".
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Para iniciar em uma versão diferente do VOS ver ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Módulo %phx_vos#m16
Favor fazer o login 08:51:28
login e
Senha?
Noah_Davids.CAC fez login em %phx_vos#m16 em 13-04-21 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 utilização do módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas as 763,2 horas (31,8 dias) acima.
----CPU----- Última hora Última hora de 5 minutos Última hora de atividade
. . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,24 0,1% 191,80 0,1%
netstat -estat -estatística
tcp:
. . . .
201926 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -longo -quit
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é 895, passo 8D2E1200, Noah_Davids.CAC
stcp_meters %phx_vos#m16 763:12:46 13-04-21 08:51:29
. . . .
bufdat executado 678 (avg 0.0002/sec)
pronto 08:51:29
pronto 08:51:29
|
Figura 7 - esperar a execução do roteiro |
SSH:
Finalmente você pode usar o SSH para executar um comando em um sistema remoto. Se você também tiver configurado uma autenticação de chave pública, você não será solicitado a obter uma senha no momento da execução.
Há uma série de rugas interessantes quando se usa SSH. As primeiras abreviações não funcionam, não tente executar dps, use display_print_status.
ssh [email protected] dbs
sh: dbs: comando não encontrado
pronto 12:26:25
|
Figura 8 - Usar SSH para executar remotamente uma abreviação de comando não funciona |
ssh [email protected] display_batch_status
Filas de lotes para %phx_vos#m16
FILA DE EMPREGOS EM EXECUÇÃO NO ESTADO MÁXIMO
funcionamento normal 5
pronto 12:26:43
|
Figura 9 - O uso do SSH para executar um comando à distância funciona |
Segundo, executar uma macro de comando diretamente não funciona; note que não há saída e parece que apenas o primeiro comando na macro foi mesmo processado.
ssh [email protected] 'foo.cm
display_system_usage
pronto 12:08:40
|
Figura 10 - Usar SSH para executar remotamente uma macro de comando nem sempre funciona |
Em vez disso, você tem que executar o comando shell e fornecer a macro de comando como seu argumento.
ssh [email protected] '/bin/sh foo.cm' (em inglês)
display_system_usage
Estatísticas de utilização do módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas as 766,5 horas (31,9 dias) acima.
----CPU----- Última hora Última hora de 5 minutos Última hora de atividade
Minutos de CPU 0,02 0,5% 0,09 0,4% 0,91 0,4% 724,76 0,4%
. . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,23 0,1% 192,57 0,1%
netstat -estat -estatística
tcp:
. . . .
202796 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -longo -quit
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é 922, p passo 8D3C2780, Noah_Davids.CAC
stcp_meters %phx_vos#m16 766:30:14 13-04-21 12:08:57
. . . .
bufdat executado 678 (avg 0.0002/sec)
pronto 12:08:59
|
Figura 11 - Usando 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 é bifurcada como um processo separado para que as macros que usam o process_dir para manter resultados intermediários não funcionem. Note que cada invocação do sistema de análise está relatando um número de processo diferente.
ssh [email protected] '/bin/sh foo3.cm
%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-21 12:52:20 mst
foo3.cm de exibição
display_line
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é 1028, ptep 8D3C3000, Noah_Davids.CAC
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é 1029, ptep 8D3C3000, Noah_Davids.CAC
Versão 17.1.0ax do OpenVOS, Versão 17.1.0ax do Analyse_system
O processo atual é 1030, ptep 8D3C3000, Noah_Davids.CAC
pronto 12:52:21
|
Figura 12 - Cada comando na macro é bifurcado como um processo separado |
A utilização de macros de comando com variáveis de estilo VOS gerará erros de sintaxe, uma vez que a casca não sabe o que são. A macro de comando foo3.cm se exibe e depois conta até 9. O comando de exibição é 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 - Macros de comando com variáveis de estilo VOS não funcionarão |
Mas o uso de variáveis shell funcionará. Isso, é claro, pode exigir extensas reescritas de macros existentes. Aqui está um exemplo da mesma macro que um script de shell.
ssh [email protected] '/bin/sh foo3u
gato foo3u
contagem=1
enquanto [[[ $count -le 9 ]]
do
echo "$count
(( contagem++ ))
feito
1
2
3
4
5
6
7
8
9
pronto 07:44:41
|
Figura 14 - Script de concha com variáveis de estilo de concha funciona |
No entanto, você pode executar sua macro de comando estilo VOS como um processo iniciado e depois exibir o arquivo que é produzido. A macro start_foo3.cm roda start_process, espera que o processo termine e então exibe o arquivo de saída sem um cabeçalho. Modifiquei o foo3.cm para desligar as linhas de comando e macro e também o prompt pronto para imitar mais completamente a saída de uma macro de comando executada interativamente.
start_process foo3.cm - espera
exibir foo3.out -no_header
|
Figura 15 - Macro de comando para executar foo3.cm como um processo iniciado |
Com exceção do cabeçalho de login e do nome da macro de comando nas 2 primeiras linhas e da linha "Process finished" no final, os resultados são os mesmos como se você executasse a macro a partir da linha de comando 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 de foo.cm em um processo iniciado |
Portanto, como você pode ver enquanto não pode usar telnet que são outras formas de login automático e executar comandos.