Passa al contenuto principale

La settimana scorsa (beh, è stato la settimana scorsa quando ho iniziato a scrivere questo) abbiamo avuto un problema nel CAC dove qualcuno voleva scrivere una macro di comando che eseguisse telnet per accedere ad un sistema ed eseguire alcuni comandi, per esempio il comando macro test.cm si connette ad un host remoto ed esegue la macro di comando foo.cm.

&attach_input                 
telnet 192.168.77.128
password
pippo.cm

Figura 1 - comando telnet macro test.cm

display_line display_system_usage                    
visualizzazione_impiego_del_sistema
display_line netstat -statistica -protocollo tcp
netstat -statistica
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -request_line 'stcp_meters' -quit

Figura 2 - pippo.cm

 

Purtroppo telnet non è progettato per essere eseguito in una macro di comando e fallisce.

test    
telnet: errore fatale - tcgetattr fallito
Errore sulla linea 3 del test.
comando_processore: Oggetto non trovato. password. In macro di comando
     %azvos#m17_mas>SysAdmin>Noah_Davids>test.cm

Figura 3 - esecuzione del test.cm fallisce

 

Ci sono tuttavia diversi modi in cui è possibile effettuare il login automatico in un host remoto seguito dall'esecuzione di un comando.

send_cmds.c:

Tempo fa ho scritto un programma che fa una connessione ad un server telnet, invia stringhe e analizza l'output. Il linguaggio di scripting è semplice, ma per le cose semplici funziona bene. Il codice sorgente con esempi più estesi può essere trovato qui

Lo script è fondamentalmente una stringa di invio seguita da una stringa di attesa. Lo script avanza alla riga successiva quando si vede la stringa di attesa, come ho detto molto semplice. Lo script ha degli argomenti, nella figura 4 uso arg0 per la password, quindi la mia password non è memorizzata nello script. L'esecuzione dello script segue nella figura 5. Ho troncato l'output di ogni comando nell'interesse di risparmiare spazio. Noterete che i caratteri non di controllo delle stringhe di posizionamento dei caratteri vengono visualizzati fino a quando non ho impostato il tipo di terminale su 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 per effettuare il login ed eseguire la macro di comando foo

send_cmds -Indirizzo IPA 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 password

       PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)

   *** Per l'avvio su un'altra release VOS vedi ***
   *** >Overseer>COMMON>COMMON>cfg>reconfig_instructions ***

OpenVOS Release 17.1.0ax, modulo %phx_vos#m16
Si prega di effettuare il login 08:15:01
login nd
Password?
Noah_Davids.CAC ha effettuato il login su %phx_vos#m16 alle 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_terminale_parametri -terminale_di tipo ascii -pausa_linee_di_pausa 0
[1mset_terminale_parametri -terminale_di tipo ascii -pausa_linee_di_pausa 0

pronto 08:15:01
pippo.cm
display_sistema_utilizzo_del_sistema
Statistiche di utilizzo per il modulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Tutte le 762,6 ore (31,7 giorni) in su.
----CPU------- Last Min Last Min Last 5 Min Last Hour All Up Time
. . . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,1% 0,23 0,1% 191,65 0,1% 0,1%
netstat -statistica
tcp:
. . . . 
       201766 tcpOutRisti

analizza_sistema -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 884, ptep 8D3E6000, Noah_Davids.CAC

stcp_metri %phx_vos#m16 762:36:19 13-04-21 08:15:02
 . . . .
   bufdat eseguito 678 (avg 0,0002/sec)

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

Figura 5 - esecuzione send_cmds

 

aspettatevi:

C'è un programma chiamato expect in gnu_library. La sintassi di uno script expect può essere molto complessa, permette di ramificare in base a diverse stringhe di ritorno in modo da poter gestire in modo intelligente gli errori invece di limitarsi al solo timing out. È possibile controllare il web per gli esempi, basta cercare "expect script examples". Presenterò un semplice script che si limita ad effettuare il login e ad eseguire la macro foo.cm. Notate che ci sono stati alcuni bug nelle prime versioni di gnu_tools (che è il motivo per cui ho scritto send_cmds) ma a partire dalla versione 3.4.0a dovreste essere a posto. Anche se non lo mostro, expect può anche usare argomenti in modo che la password non debba necessariamente essere parte dello script o lo script può richiedere una password. Anche in questo caso ho troncato l'output dei comandi dello script e potete vedere che i caratteri non di controllo delle stringhe di posizionamento dei caratteri vengono visualizzati fino a quando non ho impostato il tipo di terminale su ascii. Aspettatevi però che filtri la stringa in modo diverso, in modo che non vengano visualizzati tutti i caratteri.

generare "telnet       
aspettatevi "telnet>".
inviare "aperto 192.168.77.128r".
aspetta "login"
invia "login ndr".
aspettatevi la "Password".
invia "passwordr"
aspettatevi "pronti"
inviare "set_terminale_parametri -terminal_tipo_terminale ascii -pausa_line 0r".
aspettatevi "pronti"
invia "foo.cmr"
aspettatevi "pronti"

Figura 6 - aspettatevi che lo script faccia il login ed esegua la macro di comando foo

>bin>aspettatevi test.expect
riprodursi telnet
telnet> aperto 192.168.77.128
Provare...
Collegato a 192.168.77.128.
Il carattere di fuga è '^]'.


       PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)

   *** Per l'avvio su un'altra release VOS vedi ***
   *** >Overseer>COMMON>COMMON>cfg>reconfig_instructions ***

OpenVOS Release 17.1.0ax, modulo %phx_vos#m16
Si prega di effettuare il login 08:51:28
login nd
Password?

Noah_Davids.CAC ha effettuato il login su %phx_vos#m16 alle 13-04-21 08:51:28 mst.
fJ?7l20l
0;1mpronto 08:51:28
1mset_terminale_parametri -terminale_di tipo ascii -pausa_linee_di_pausa 0
pronto 08:51:28
pippo.cm
display_sistema_utilizzo_del_sistema
Statistiche di utilizzo per il modulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Tutte le 763,2 ore (31,8 giorni) in su.

----CPU------- Last Min Last Min Last 5 Min Last Hour All Up Time
. . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,1% 0,24 0,1% 191,80 0,1% 0,1%
netstat -statistica
tcp:
. . . .
       201926 tcpOutRisti

analizza_sistema -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 895, ptep 8D2E1200, Noah_Davids.CAC

stcp_metri %phx_vos#m16 763:12:46 13-04-21 08:51:29
. . . .
   bufdat eseguito 678 (avg 0,0002/sec)

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

Figura 7 - aspettarsi l'esecuzione dello script

 

SSH:

Infine è possibile utilizzare SSH per eseguire un comando su un sistema remoto. Se avete anche impostato l'autenticazione a chiave pubblica non vi viene richiesta una password al momento dell'esecuzione.

Ci sono una serie di rughe interessanti quando si usa SSH. Le prime abbreviazioni non funzionano, non cercare di eseguire dps, usare display_print_status.

ssh [email protected] dbs   
sh: dbs: comando non trovato
pronto 12:26:25

Figura 8 - L'uso di SSH per eseguire a distanza un'abbreviazione di comando non funziona

ssh [email protected] display_batch_status                    

Code batch per %phx_vos#m16

STATO DELLA CODA DI CODA LAVORI IN CORSO MAX
corsa normale 5
pronto 12:26:43

Figura 9 - L'uso di SSH per eseguire a distanza un comando funziona

 

In secondo luogo, l'esecuzione diretta di una macro di comando non funziona; si noti che non c'è alcun output e sembra che solo il primo comando della macro sia stato elaborato.

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

Figura 10 - L'uso di SSH per eseguire da remoto una macro di comando non sempre funziona

 

Invece si deve eseguire il comando shell e fornire la macro di comando come argomento.

ssh [email protected] '/bin/sh foo.cm'.
visualizzazione_impiego_del_sistema
Statistiche di utilizzo per il modulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Tutte le 766,5 ore (31,9 giorni) in su.

----CPU------- Last Min Last Min Last 5 Min Last Hour All Up Time
Minuti CPU 0,02 0,5% 0,09 0,4% 0,4% 0,91 0,4% 724,76 0,4%
. . . .
Int. Tempo 0,00 0,1% 0,02 0,1% 0,1% 0,23 0,1% 192,57 0,1% 0,1%
netstat -statistica
tcp:
. . . .
       202796 tcpOutRisti

analizza_sistema -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 922, ptep 8D3C2780, Noah_Davids.CAC

stcp_metri %phx_vos#m16 766:30:14 13-04-21 12:08:57
. . . .
   bufdat eseguito 678 (avg 0,0002/sec)

pronto 12:08:59

Figura 11 - Uso di SSH per eseguire da remoto una macro di comando eseguendola come script di shell

 

Le macro complesse non funzionano. Per esempio, ogni riga della macro di comando è biforcata come processo separato, quindi le macro che usano il process_dir per tenere i risultati intermedi non funzioneranno. Si noti che ogni invocazione di analyze_system riporta un numero di processo diverso.

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

%phx_vos#m16_mas>SysAdmin>Noah_Davids>pippo3.cm 13-04-21 12:52:20 mst

mostra pippo3.cm
display_line
analizza_sistema -linea_richiesta '' -quit
analizza_sistema -linea_richiesta '' -quit
analizza_sistema -linea_richiesta '' -quit


OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 1028, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 1029, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyz_system Release 17.1.0ax
Il processo attuale è 1030, ptep 8D3C3000, Noah_Davids.CAC
pronto 12:52:21

Figura 12 - Ogni comando della macro è biforcato come processo separato

 

L'uso di macro di comando con variabili di stile VOS genererà errori di sintassi poiché la shell non sa cosa siano. La macro di comando foo3.cm si visualizza da sola e conta fino a 9. Il comando di visualizzazione viene eseguito e l'"&set" genera un errore di sintassi.

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 - Le macro di comando con variabili di stile VOS non funzionano

 

Ma l'uso di variabili shell funzionerà. Questo naturalmente può richiedere ampie riscritture delle macro esistenti. Ecco un esempio della stessa macro di una shell script.

ssh [email protected] '/bin/sh foo3u'.       
cat foo3u
conteggio=1
mentre [[ $count -le 9 ]]
fare
    eco "conteggio dei dollari"
    (( conteggio++ ))
fatto
1
2
3
4
5
6
7
8
9
pronto 07:44:41

Figura 14 - Lo script shell con le variabili dello stipite del guscio funziona

 

Tuttavia, è possibile eseguire la macro di comando stile VOS come processo avviato e quindi visualizzare l'outfile che viene prodotto. La macro start_foo3.cm esegue start_process, attende che il processo si concluda e poi visualizza il file di output senza intestazione. Ho modificato il foo3.cm per disattivare le linee di comando e le macro e anche il prompt pronto per imitare in modo più completo l'output di una macro di comando eseguita in modo interattivo.

start_processo foo3.cm -aspetta        
visualizza foo3.out -no_header

Figura 15 - Macro di comando per eseguire foo3.cm come processo avviato

 

Ad eccezione dell'intestazione di login e del nome della macro di comando sulle prime 2 righe e della riga "Processo terminato" alla fine i risultati sono gli stessi come se si eseguisse la macro dalla riga di 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 - Risultati dell'esecuzione di foo.cm in un processo avviato

 

Quindi, come si può vedere mentre non è possibile utilizzare telnet che sono altri modi per effettuare automaticamente il login ed eseguire i comandi.

© 2024 Stratus Technologies.