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.
&Anfügen_Eingabe
telnet 192.168.77.128
Kennwort
foo.cm
|
Abbildung 1 - Telnet-Befehlsmakro test.cm |
display_line display_system_usage
display_system_usage
display_line netstat -statistik -protokoll tcp
netstat -statistik
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -anforderung_zeile 'stcp_meters' -quit
|
Abbildung 2 - foo.cm |
Leider ist telnet nicht dafür ausgelegt, in einem Befehlsmakro ausgeführt zu werden, und es schlägt fehl.
Test
telnet: fataler Fehler - tcgetattr fehlgeschlagen
Fehler in Zeile 3 von test.
command_processor: Objekt nicht gefunden. password. 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 entfernten Host mit anschließender Befehlsausführung erfolgen kann.
send_cmds.c:
Vor einiger Zeit habe ich ein Programm geschrieben, das eine Verbindung zu einem Telnet-Server herstellt, Zeichenketten sendet und die Ausgabe analysiert. Die Skriptsprache ist einfach, aber für einfache Dinge funktioniert sie gut. Der Quellcode mit ausführlicheren Beispielen ist hierzu finden
Das Skript besteht im Wesentlichen aus einer Sendezeichenfolge, gefolgt von einer Wartezeichenfolge. Das Skript geht zur nächsten Zeile über, wenn die Wartezeichenfolge gesehen wird, wie gesagt, sehr 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 folgt in Abbildung 5. Um Platz zu sparen, habe ich die Ausgabe der einzelnen Befehle gekürzt. Sie werden feststellen, dass die Nicht-Steuerzeichen der Zeichenpositionierungszeichenfolgen angezeigt werden, bis ich den Terminaltyp auf ascii einstelle.
//login
/login nd/Password?
/arg0/ready
/set_terminal_parameters -terminal_type ascii -pause_lines 0/ready
/foo.cm/ready
/quit/quit
|
Abbildung 4 - Skript send_cmds zur Anmeldung und Ausführung des Befehlsmakros foo |
send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 Passwort
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Um auf einem anderen VOS Release zu booten siehe ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Modul %phx_vos#m16
Bitte anmelden 08:15:01
Anmeldung nd
Kennwort?
Noah_Davids.CAC hat sich auf %phx_vos#m16 am 13-04-21 08:15:01 mst 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
Benutzungsstatistik für das Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Alle 762,6 Stunden (31,7 Tage) abgelaufen.
----CPU----- Letzte Min Letzte 5 Min Letzte Stunde Alle Up Time
. . . . .
Int. Zeit 0.00 0.1% 0.02 0.1% 0.23 0.1% 191.65 0.1%
netstat -statistiken
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 (durchschnittlich 0,0002/Sek.)
bereit 08:15:02
bereit 08:15:03
|
Abbildung 5 - Ausführung von send_cmds |
erwarten:
Es gibt ein Programm namens expect in der gnu_library. Die Syntax für ein expect-Skript kann sehr komplex sein. Es ermöglicht Verzweigungen auf der Grundlage verschiedener Rückgabestrings, so dass Sie Fehler intelligent behandeln können, anstatt einfach nur einen Zeitstopp einzulegen. Sie können im Internet nach Beispielen suchen, indem Sie nach "expect script examples" suchen. Ich werde ein einfaches Skript vorstellen, das sich nur anmeldet und das Makro foo.cm ausführt. Beachten Sie, dass es in frühen Versionen von gnu_tools einige Fehler gab (deshalb habe ich send_cmds geschrieben), aber ab der Version 3.4.0a sollte alles in Ordnung sein. Ich zeige es zwar nicht, aber expect kann auch Argumente verwenden, so dass das Passwort nicht Teil des Skripts sein muss, oder das Skript kann Sie nach einem Passwort fragen. Auch hier habe ich die Befehlsausgabe des Skripts abgeschnitten und Sie können sehen, dass die Nicht-Steuerzeichen der Zeichenpositionierungszeichenfolgen angezeigt werden, bis ich den Terminaltyp auf ascii setze. Expect filtert die Zeichenfolge jedoch anders, so dass nicht alle Zeichen angezeigt werden.
spawn "telnet"
erwarte "telnet>"
senden "öffnen 192.168.77.128r"
erwarte "anmelden"
senden "anmelden ndr"
erwarte "Passwort"
sendet "passwortr"
erwarte "bereit"
sendet "set_terminal_parameters -terminal_type ascii -pause_lines 0r"
erwarte "fertig"
sendet "foo.cmr"
erwarte "bereit"
|
Abbildung 6 - expect-Skript zur Anmeldung und Ausführung des Befehlsmakros foo |
>bin>expect test.expect
Telnet starten
telnet> öffnen 192.168.77.128
Versucht...
Verbunden mit 192.168.77.128.
Escape-Zeichen ist '^]'.
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Zum Booten mit einem anderen VOS-Release siehe ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Modul %phx_vos#m16
Bitte anmelden 08:51:28
Anmeldung nd
Kennwort?
Noah_Davids.CAC hat sich auf %phx_vos#m16 am 13-04-21 08:51:28 mst angemeldet.
fJ?7l20l
0;1mbereit 08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
fertig 08:51:28
foo.cm
display_system_usage
Benutzungsstatistik für das Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Alle 763,2 Stunden (31,8 Tage) in Betrieb.
----CPU----- Letzte Min Letzte 5 Min Letzte Stunde Alle Up Time
. . . .
Int. Zeit 0.00 0.1% 0.02 0.1% 0.24 0.1% 191.80 0.1%
netstat -statistiken
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 (durchschnittlich 0,0002/Sek.)
bereit 08:51:29
fertig 08:51:29
|
Abbildung 7 - Skriptausführung erwarten |
SSH:
Schließlich können Sie SSH verwenden, um einen Befehl auf einem entfernten System auszuführen. Wenn Sie auch die Authentifizierung mit öffentlichem Schlüssel eingerichtet haben, werden Sie bei der Ausführung nicht nach einem Passwort gefragt.
Bei der Verwendung von SSH gibt es eine Reihe von interessanten Problemen. Zunächst funktionieren Abkürzungen nicht, versuchen Sie nicht, dps auszuführen, 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 Fernausführung einer Befehlskürzung funktioniert nicht |
ssh [email protected] display_batch_status
Batch-Warteschlangen für %phx_vos#m16
WARTESCHLANGENSTATUS MAX. LAUFENDE AUFTRÄGE
normaler Lauf 5
bereit 12:26:43
|
Abbildung 9 - SSH zum Ausführen eines Befehls per Fernzugriff funktioniert |
Zweitens funktioniert die direkte Ausführung eines Befehlsmakros nicht; es gibt keine Ausgabe und es scheint, dass nur der erste Befehl im Makro überhaupt verarbeitet wurde.
ssh [email protected] 'foo.cm'
display_system_usage
bereit 12:08:40
|
Abbildung 10 - Die Verwendung von SSH zur Fernausführung eines Befehlsmakros funktioniert nicht immer |
Stattdessen müssen Sie den Shell-Befehl ausführen und das Befehlsmakro als dessen Argument angeben.
ssh [email protected] '/bin/sh foo.cm'
display_system_usage
Benutzungsstatistik für das Modul %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Alle 766,5 Stunden (31,9 Tage) in Betrieb.
----CPU----- Letzte Min Letzte 5 Min Letzte Stunde Alle Up Zeit
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 -Statistik
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 (durchschnittlich 0,0002/Sek.)
bereit 12:08:59
|
Abbildung 11 - Verwendung von SSH zur Fernausführung eines Befehlsmakros, indem es als Shell-Skript ausgeführt wird |
Komplexe Makros werden nicht funktionieren. Zum Beispiel wird jede Zeile des Befehlsmakros als ein separater Prozess geforkt, so dass Makros, die das process_dir verwenden, um Zwischenergebnisse zu speichern, 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
anzeigen foo3.cm
anzeigen_Zeile
analyze_system -anforderung_zeile '' -quit
analyze_system -Anforderung_Zeile '' -quit
analyze_system -Anforderung_Zeile '' -quit
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
Aktueller Prozess ist 1028ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
Der aktuelle Prozess ist 1029ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Freigabe 17.1.0ax, analyze_system Freigabe 17.1.0ax
Der aktuelle Prozess ist 1030ptep 8D3C3000, Noah_Davids.CAC
bereit 12:52:21
|
Abbildung 12 - Jeder Befehl im Makro wird als separater Prozess geforkt |
Die Verwendung von Befehlsmakros mit Variablen im VOS-Stil führt zu Syntaxfehlern, da die Shell nicht weiß, was sie sind. Das Befehlsmakro foo3.cm zeigt sich selbst an und zählt dann bis 9. Der Anzeigebefehl wird ausgeführt und das "&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 |
Aber die Verwendung von Shell-Variablen wird funktionieren. Das kann natürlich umfangreiche Neuschriften bestehender Makros erfordern. Hier ist ein Beispiel für das gleiche 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-Stilvariablen funktioniert |
Sie können jedoch Ihr Befehlsmakro im VOS-Stil als gestarteten Prozess ausführen und dann die erzeugte Ausgabedatei anzeigen. Das Makro start_foo3.cm führt start_process aus, wartet auf die Beendigung des Prozesses und zeigt dann die Ausgabedatei ohne Header an. Ich habe foo3.cm so verändert, dass die Befehls- und Makrozeilen sowie die Eingabeaufforderung "ready" ausgeschaltet werden, um die Ausgabe eines interaktiv ausgeführten Befehlsmakros besser zu imitieren.
start_process foo3.cm -wait
display foo3.out -no_header
|
Abbildung 15 - Befehlsmakro zur Ausführung von foo3.cm als gestarteter Prozess |
Mit Ausnahme des Login-Headers und des Befehlsmakronamens in den ersten beiden Zeilen und der Zeile "Process finished" am Ende sind die Ergebnisse die gleichen, wie 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 also sehen, gibt es andere Möglichkeiten, sich automatisch anzumelden und Befehle auszuführen, auch wenn Sie telnet nicht verwenden können.