Zum Hauptinhalt springen

Letzte Woche (nun, es war letzte Woche, als ich anfing, dies zu schreiben) hatten wir ein Problem im CAC, bei dem jemand ein Befehlsmakro schreiben wollte, das Telnet ausführt, um sich bei einem System anzumelden und einige Befehle auszuführen, z. B. das Befehlsmakro test.cm meldet sich bei einem entfernten Host an und führt das Befehlsmakro foo.cm aus.

&attach_input                                                                 
telnet 192.168.77.128
Passwort
foo.cm

Abbildung 1 – Telnet-Befehlsmakro 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

Abbildung 2 – foo.cm

 

Leider ist Telnet nicht für die Ausführung in einem Befehlsmakro ausgelegt und schlägt fehl.

test                                                                          
telnet: schwerwiegender Fehler – tcgetattr fehlgeschlagen
Fehler in Zeile 3 von test.
command_processor: Objekt nicht gefunden. Passwort. Im Befehlsmakro
     %azvos#m17_mas>SysAdmin>Noah_Davids>test.cm

Abbildung 3 – Ausführung von test.cm schlägt fehl

 

Es gibt jedoch mehrere Möglichkeiten, wie eine automatische Anmeldung bei einem Remote-Host mit anschließender Befehlsausführung durchgeführt werden kann.

send_cmds.c:

Vor einiger Zeit habe ich ein Programm geschrieben, das eine Verbindung zu einem Telnet-Server herstellt, Zeichenfolgen sendet und die Ausgabe analysiert. Die Skriptsprache ist einfach, aber für einfache Aufgaben funktioniert sie gut. Den Quellcode mit ausführlicheren Beispielen finden Sie hier.

Das Skript besteht im Wesentlichen aus einer Sendestrings, gefolgt von einer Wartezeichenfolge. Das Skript springt zur nächsten Zeile, wenn die Wartezeichenfolge erkannt wird, wie gesagt, ganz einfach. Das Skript hat Argumente. In Abbildung 4 verwende ich arg0 für das Passwort, damit mein Passwort nicht im Skript gespeichert wird. Die Ausführung des Skripts ist in Abbildung 5 dargestellt. Ich habe die Ausgabe jedes Befehls aus Platzgründen gekürzt. Sie werden feststellen, dass die Nicht-Steuerzeichen aus den Zeichenpositionierungszeichenfolgen angezeigt werden, bis ich den Terminaltyp auf ASCII setze.

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

Abbildung 4 – send_cmds-Skript zum Anmelden und Ausführen des Makros „foo command“

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

PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)

   *** Um mit einer anderen VOS-Version zu starten, siehe     ***  
   *** >Overseer>COMMON>cfg>reconfig_instructions ***

OpenVOS Release 17.1.0ax, Modul %phx_vos#m16
Bitte melden Sie sich an  08:15:01
Anmeldung nd
Passwort?
Noah_Davids.CAC hat sich am 21.04.13 um 08:15:01 Uhr (MST) bei %phx_vos#m16 angemeldet.
[f[J[?7l[20l=[1m[1;24r[f[J[J[24;80f
[0;1mbereit  08:15:01
[0mset_terminal_parameters -terminal_type ascii -pause_lines 0
[1mset_terminal_parameters -terminal_type ascii -pause_lines 0

bereit  08:15:01
foo.cm
display_system_usage
Nutzungsstatistik für Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Insgesamt 762,6 Stunden (31,7 Tage) in Betrieb.
----CPU-----         Letzte Min.     Letzte 5 Min.       Letzte Stunde      Gesamtbetriebszeit
. . . . .
Int. Zeit           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 Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 884, ptep 8D3E6000, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                762:36:19     13-04-21 08:15:02
 . . . .
   bufdat ausgeführt                             678 (Durchschnitt 0,0002/Sek.)

bereit  08:15:02
bereit  08:15:03

Abbildung 5 – Ausführung von send_cmds

 

erwarten:

In der gnu_library gibt es ein Programm namens expect. Die Syntax für ein Expect-Skript kann sehr komplex sein. Es ermöglicht Verzweigungen basierend auf verschiedenen Rückgabestrings, sodass Sie Fehler intelligent behandeln können, anstatt einfach nur eine Zeitüberschreitung zu verursachen. Beispiele finden Sie im Internet, suchen Sie einfach nach „expect script examples”. Ich werde ein einfaches Skript vorstellen, das sich nur anmeldet und das Makro „foo.cm“ ausführt. Beachten Sie, dass es in früheren Versionen von gnu_tools einige Fehler gab (weshalb ich send_cmds geschrieben habe), aber ab Version 3.4.0a sollte alles in Ordnung sein. Ich zeige es zwar nicht, aber expect kann auch Argumente verwenden, sodass das Passwort nicht Teil des Skripts sein muss oder das Skript Sie zur Eingabe eines Passworts auffordern kann. Ich habe die Befehlsausgabe aus dem Skript erneut gekürzt, und Sie können sehen, dass die Nicht-Steuerzeichen aus den Zeichenpositionierungszeichenfolgen angezeigt werden, bis ich den Terminaltyp auf ASCII setze. Expect filtert die Zeichenfolge jedoch anders, sodass nicht alle Zeichen angezeigt werden.

spawn "telnet"                                                                
expect "telnet>"
send "open 192.168.77.128r"
expect „login”
send „login ndr”
expect „Password”
send „passwordr”
expect „ready”
send „set_terminal_parameters -terminal_type ascii -pause_lines 0r”
expect „ready”
send „foo.cmr”
expect „ready”

Abbildung 6 – Skript zum Anmelden und Ausführen des Makros „foo“

>bin>expect test.expect
spawn telnet
telnet> open 192.168.77.128
Versuche...
Verbunden mit 192.168.77.128.
Das Escape-Zeichen ist '^]'.


       PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)

   *** Um mit einer anderen VOS-Version zu booten, siehe     ***
   *** >Overseer>COMMON>cfg>reconfig_instructions ***

OpenVOS Release 17.1.0ax, Modul %phx_vos#m16
Bitte melden Sie sich an  08:51:28
Anmeldung nd
Passwort?

Noah_Davids.CAC hat sich am 21.04.13 um 08:51:28 Uhr (MST) bei %phx_vos#m16 angemeldet.
fJ?7l20l
0;1mbereit  08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
bereit  08:51:28
foo.cm
display_system_usage
Nutzungsstatistik für Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Insgesamt 763,2 Stunden (31,8 Tage) in Betrieb.

----CPU-----         Letzte Min.     Letzte 5 Min.       Letzte Stunde      Gesamte Betriebszeit.
 . . .
Int. Zeit           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 Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 895, ptep 8D2E1200, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                763:12:46     13-04-21 08:51:29
. . . .  
   bufdat ausgeführt                             678 (Durchschnitt 0,0002/Sek.)  
  
bereit  08:51:29  
bereit  08:51:29

Abbildung 7 – Skriptausführung erwarten

 

SSH:

Schließlich können Sie SSH verwenden, um einen Befehl auf einem Remote-System auszuführen. Wenn Sie auch die Public-Key-Authentifizierung eingerichtet haben, werden Sie zum Zeitpunkt der Ausführung nicht zur Eingabe eines Passworts aufgefordert.

Bei der Verwendung von SSH gibt es einige interessante Besonderheiten. Erstens funktionieren Abkürzungen nicht. Versuchen Sie nicht, dps auszuführen, sondern verwenden Sie display_print_status.

ssh [email protected] dbs                                                     
sh: dbs: Befehl nicht gefunden
bereit  12:26:25

Abbildung 8 – Die Verwendung von SSH zur Remote-Ausführung eines Befehls funktioniert nicht.

ssh [email protected] display_batch_status                                    

Batch-Warteschlangen für %phx_vos#m16

QUEUE                    STATE   MAX           RUNNING JOBS
normal                    run      5
ready  12:26:43

Abbildung 9 – Die Verwendung von SSH zur Remote-Ausführung eines Befehls funktioniert.

 

Zweitens funktioniert die direkte Ausführung eines Befehlsmakros nicht. Beachten Sie, dass keine Ausgabe erfolgt und offenbar nur der erste Befehl im Makro verarbeitet wurde.

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

Abbildung 10 – Die Verwendung von SSH zur Remote-Ausführung eines Befehlsmakros funktioniert nicht immer.

 

Stattdessen müssen Sie den Shell-Befehl ausführen und das Befehlsmakro als Argument angeben.

ssh [email protected] '/bin/sh foo.cm'
display_system_usage
Nutzungsstatistik für Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Insgesamt 766,5 Stunden (31,9 Tage) in Betrieb.

----CPU-----         Letzte Min.     Letzte 5 Min.       Letzte Stunde      Gesamte Betriebszeit
CPU-Minuten         0,02  0,5 %     0,09  0,4 %      0,91  0,4 %     724,76  0,4 %
. . . .
Int. Zeit           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 Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 922, ptep 8D3C2780, Noah_Davids.CAC

stcp_meters   %phx_vos#m16                766:30:14     13-04-21 12:08:57.
 . . .
   bufdat ausgeführt                             678 (Durchschnitt 0,0002/Sek.)

bereit  12:08:59

Abbildung 11 – Remote-Ausführung eines Befehlsmakros über SSH durch Ausführung als Shell-Skript

 

Komplexe Makros funktionieren nicht. Beispielsweise wird jede Zeile des Befehlsmakros als separater Prozess aufgeteilt, sodass Makros, die process_dir zum Speichern von Zwischenergebnissen verwenden, nicht funktionieren. Beachten Sie, dass jeder Aufruf von analyze_system eine andere Prozessnummer meldet.

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

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  13-04-21 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 Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 1028, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 1029, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 1030, ptep 8D3C3000, Noah_Davids.CAC
bereit  12:52:21

Abbildung 12 – Jeder Befehl im Makro wird als separater Prozess aufgeteilt.

 

Die Verwendung von Befehlsmakros mit VOS-Variablen führt zu Syntaxfehlern, da die Shell diese nicht erkennt. Das Befehlsmakro „foo3.cm“ zeigt sich selbst an und zählt dann bis 9. Der Befehl „display“ wird ausgeführt und „&set“ erzeugt einen Syntaxfehler.

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

Abbildung 13 – Befehlsmakros mit Variablen im VOS-Stil funktionieren nicht.

 

Die Verwendung von Shell-Variablen funktioniert jedoch. Dies kann natürlich umfangreiche Überarbeitungen bestehender Makros erfordern. Hier ist ein Beispiel für dasselbe Makro als Shell-Skript.

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
bereit  07:44:41

Abbildung 14 – Shell-Skript mit Shell-Variablen funktioniert

 

Sie können jedoch Ihr VOS-Befehlsmakro als gestarteten Prozess ausführen und anschließend die erzeugte Ausgabedatei anzeigen. Das Makro start_foo3.cm führt start_process aus, wartet auf das Beenden des Prozesses und zeigt dann die Ausgabedatei ohne Kopfzeile an. Ich habe foo3.cm so geändert, dass die Befehls- und Makrozeilen sowie die Bereitschaftseingabeaufforderung deaktiviert sind, um die Ausgabe eines interaktiv ausgeführten Befehlsmakros besser nachzuahmen.

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

Abbildung 15 – Befehlsmakro zum Ausführen von foo3.cm als gestarteter Prozess

 

Mit Ausnahme des Login-Headers und des Makronamens in den ersten beiden Zeilen sowie der Zeile „Process finished“ am Ende entsprechen die Ergebnisse denen, die Sie erhalten würden, wenn Sie das Makro über die VOS-Befehlszeile ausführen würden.

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

Abbildung 16 – Ergebnisse der Ausführung von foo.cm in einem gestarteten Prozess

 

Wie Sie sehen, gibt es also auch ohne Telnet andere Möglichkeiten, sich automatisch anzumelden und Befehle auszuführen.