La semaine dernière (enfin c'était la semaine dernière quand j'ai commencé à écrire ceci), nous avons eu un problème au CAC où quelqu'un voulait écrire une macro de commande qui faisait tourner telnet pour se connecter à un système et exécuter certaines commandes, par exemple la macro de commande test.cm se connecte à un hôte distant et exécute la macro de commande foo.cm.
&attach_input
telnet 192.168.77.128
mot de passe
foo.cm
|
Figure 1 - Macro test de commande telnet.cm |
display_line display_system_usage
utilisation_du_système_d'affichage
display_line netstat -statistics -protocol tcp
netstat -statistiques
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -request_line 'stcp_meters' -quit
|
Figure 2 - foo.cm |
Malheureusement, telnet n'est pas conçu pour s'exécuter dans une macro de commande et il échoue.
test
telnet : erreur fatale - échec de tcgetattr
Erreur sur la ligne 3 du test.
commande_processeur : Objet non trouvé. mot de passe. Dans la macro de commande
%azvos#m17_mas>SysAdmin>Noah_Davids>test.cm
|
Figure 3 - exécution du test.cm échoue |
Il existe cependant plusieurs façons de se connecter automatiquement à un hôte distant, puis d'exécuter une commande.
send_cmds.c :
Il y a quelque temps, j'ai écrit un programme qui établit une connexion à un serveur telnet, envoie des chaînes de caractères et analyse la sortie. Le langage de script est simple, mais pour les choses simples, il fonctionne bien. Le code source avec des exemples plus complets peut être trouvé ici
Le script est essentiellement une chaîne d'envoi suivie d'une chaîne d'attente. Le script passe à la ligne suivante lorsque la chaîne d'attente est vue, comme je l'ai dit très simplement. Le script a des arguments, dans la figure 4 j'utilise arg0 pour le mot de passe, donc mon mot de passe n'est pas stocké dans le script. L'exécution du script suit dans la figure 5. J'ai tronqué la sortie de chaque commande dans le but d'économiser de l'espace. Vous remarquerez que les caractères de non contrôle des chaînes de positionnement des caractères sont affichés jusqu'à ce que je mette le type de terminal sur ascii.
//login
/login nd/Password?
/arg0/ready
/set_terminal_parameters -terminal_type ascii -pause_lines 0/ready
/foo.cm/ready
/quit/quit
|
Figure 4 - Script send_cmds pour se connecter et exécuter la macro de commande foo |
send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 mot de passe
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Pour démarrer un autre communiqué de presse, voir ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS version 17.1.0ax, Module %phx_vos#m16
Veuillez vous connecter 08:15:01
login nd
Mot de passe ?
Noah_Davids.CAC s'est connecté sur %phx_vos#m16 le 13-04-21 08:15:01 mst.
[f[J[?7l[20l=[1m[1;24r[f[J[J[24;80f
[0;1mprêt 08:15:01
[0mset_terminal_parameters -terminal_type ascii -pause_lines 0
[1mset_terminal_parameters -terminal_type ascii -pause_lines 0
prêt 08:15:01
foo.cm
affichage_utilisation_du_système
Statistiques d'utilisation pour le module %phx_vos#m16, G94330, OpenVOS version 17.1.0ax
Les 762,6 heures (31,7 jours) sont toutes écoulées.
----CPU----- Last Min Last 5 Min Last Hour All Up Time
. . . . .
Int. Temps 0,00 0,1% 0,02 0,1% 0,23 0,1% 191,65 0,1%
netstat -statistiques
tcp :
. . . .
201766 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
La procédure actuelle est la 884, étape 8D3E6000, Noah_Davids.CAC
stcp_meters %phx_vos#m16 762:36:19 13-04-21 08:15:02
. . . .
bufdat exécuté 678 (moyenne 0.0002/sec)
prêt 08:15:02
prêt 08:15:03
|
Figure 5 - Exécution de send_cmds |
attendre :
Il existe un programme appelé expect dans la gnu_library. La syntaxe d'un script expect peut être très complexe, il permet de se ramifier en fonction de différentes chaînes de retour afin de pouvoir gérer intelligemment les erreurs au lieu de se contenter d'un simple délai d'attente. Vous pouvez consulter le site web pour des exemples, il suffit de chercher "expect script examples". Je vais vous présenter un script simple qui se connecte simplement et exécute la macro foo.cm. Notez qu'il y avait quelques bogues dans les premières versions de gnu_tools (c'est pourquoi j'ai écrit send_cmds) mais à partir de la version 3.4.0a, vous devriez être OK. Bien que je ne le montre pas, expect peut aussi utiliser des arguments pour que le mot de passe ne fasse pas partie du script ou que le script puisse vous demander un mot de passe. Encore une fois, j'ai tronqué la sortie de commande du script et vous pouvez voir que les caractères non contrôlés des chaînes de positionnement des caractères sont affichés jusqu'à ce que je règle le type de terminal sur ascii. Attendez-vous cependant à ce que la chaîne soit filtrée différemment, de sorte que tous les caractères ne soient pas affichés.
frai "telnet
attendre "telnet>".
envoyer "open 192.168.77.128r"
s'attendre à un "login".
envoyer "login ndr"
s'attendre à un "mot de passe".
envoyer le "mot de passe
s'attendre à ce qu'il soit "prêt".
envoyer "set_terminal_parameters -terminal_type ascii -pause_lines 0r"
s'attendre à ce qu'il soit "prêt".
envoyer "foo.cmr"
s'attendre à ce qu'il soit "prêt".
|
Figure 6 - Attendez-vous à ce que le script se connecte et exécute la macro de commande foo |
>bin>expect test.expect
spawn telnet
telnet> ouvert 192.168.77.128
Essayer...
Connecté au 192.168.77.128.
Le caractère d'échappement est "^]".
PHOENIX CAC VOS TEST SYSTEM (%phx_vos#m16)
*** Pour démarrer un autre communiqué de presse, voir ***
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS version 17.1.0ax, Module %phx_vos#m16
Veuillez vous connecter 08:51:28
login nd
Mot de passe ?
Noah_Davids.CAC s'est connecté sur %phx_vos#m16 le 13-04-21 08:51:28 mst.
fJ?7l20l
0;1mprêt 08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
prêt 08:51:28
foo.cm
utilisation_du_système_d'affichage
Statistiques d'utilisation pour le module %phx_vos#m16, G94330, OpenVOS version 17.1.0ax
Les 763,2 heures (31,8 jours) sont toutes écoulées.
----CPU----- Last Min Last 5 Min Last Hour All Up Time
. . . .
Int. Temps 0,00 0,1% 0,02 0,1% 0,24 0,1% 191,80 0,1%
netstat -statistiques
tcp :
. . . .
201926 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
La procédure actuelle est la 895, étape 8D2E1200, Noah_Davids.CAC
stcp_meters %phx_vos#m16 763:12:46 13-04-21 08:51:29
. . . .
bufdat exécuté 678 (moyenne 0.0002/sec)
prêt 08:51:29
prêt 08:51:29
|
Figure 7 - Attente de l'exécution du script |
SSH :
Enfin, vous pouvez utiliser SSH pour exécuter une commande sur un système distant. Si vous avez également mis en place une authentification par clé publique, aucun mot de passe ne vous est demandé au moment de l'exécution.
Il y a un certain nombre de rides intéressantes lorsqu'on utilise les sciences humaines. Les premières abréviations ne fonctionnent pas, n'essayez pas d'exécuter les dps, utilisez display_print_status.
ssh [email protected] dbs
sh : dbs : commande non trouvée
prêt 12:26:25
|
Figure 8 - L'utilisation de SSH pour exécuter à distance une abréviation de commande ne fonctionne pas |
ssh [email protected] display_batch_status
Files d'attente par lots pour %phx_vos#m16
QUEUE ÉTAT MAX EMPLOIS EN COURS
fonctionnement normal 5
prêt 12:26:43
|
Figure 9 - L'utilisation de SSH pour exécuter une commande à distance fonctionne |
Deuxièmement, l'exécution directe d'une macro de commande ne fonctionne pas ; notez qu'il n'y a pas de sortie et qu'il semble que seule la première commande de la macro ait été traitée.
ssh [email protected] "foo.cm
utilisation_du_système_d'affichage
prêt 12:08:40
|
Figure 10 - L'utilisation de SSH pour exécuter à distance une macro de commande ne fonctionne pas toujours |
Vous devez plutôt exécuter la commande shell et fournir la macro de commande comme argument.
ssh [email protected] '/bin/sh foo.cm
utilisation_du_système_d'affichage
Statistiques d'utilisation pour le module %phx_vos#m16, G94330, OpenVOS version 17.1.0ax
Les 766,5 heures (31,9 jours) sont toutes écoulées.
----CPU----- Last Min Last 5 Min Last Hour All Up Time
Minutes CPU 0,02 0,5% 0,09 0,4% 0,91 0,4% 724,76 0,4%
. . . .
Int. Temps 0,00 0,1% 0,02 0,1% 0,23 0,1% 192,57 0,1%
netstat -statistiques
tcp :
. . . .
202796 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
Le processus actuel est le 922, étape 8D3C2780, Noah_Davids.CAC
stcp_meters %phx_vos#m16 766:30:14 13-04-21 12:08:57
. . . .
bufdat exécuté 678 (moyenne 0.0002/sec)
prêt 12:08:59
|
Figure 11 - Utilisation de SSH pour exécuter à distance une macro de commande en l'exécutant comme un script shell |
Les macros complexes ne fonctionneront pas. Par exemple, chaque ligne de la macro de commande est bifurquée comme un processus séparé, de sorte que les macros qui utilisent le process_dir pour contenir des résultats intermédiaires ne fonctionneront pas. Notez que chaque invocation de analyze_system rapporte un numéro de processus différent.
ssh [email protected] '/bin/sh foo3.cm
%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-21 12:52:20 mst
afficher foo3.cm
display_line
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
Le processus actuel est le suivant 1028, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
Le processus actuel est le suivant 1029, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS version 17.1.0ax, analyze_system version 17.1.0ax
Le processus actuel est le suivant 1030, ptep 8D3C3000, Noah_Davids.CAC
prêt 12:52:21
|
Figure 12 - Chaque commande de la macro est bifurquée comme un processus distinct |
L'utilisation de macros de commande avec des variables de style VOS va générer des erreurs de syntaxe puisque le shell ne sait pas ce qu'elles sont. La macro de commande foo3.cm s'affiche et compte jusqu'à 9. La commande display est exécutée et le "&set" génère une erreur de syntaxe.
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
|
Figure 13 - Les macros de commande avec des variables de style VOS ne fonctionneront pas |
Mais l'utilisation de variables shell fonctionnera. Cela peut bien sûr nécessiter des réécritures importantes des macros existantes. Voici un exemple de la même macro qu'un script shell.
ssh [email protected] '/bin/sh foo3u
cat foo3u
nombre=1
alors que [[[$count -le 9 ]]]
faire
echo "$count"
(( compter++ ))
fait
1
2
3
4
5
6
7
8
9
prêt 07:44:41
|
Figure 14 - Un script shell avec des variables de style shell fonctionne |
Cependant, vous pouvez exécuter votre macro de commande de style VOS comme un processus lancé et ensuite afficher le fichier de sortie qui est produit. La macro start_foo3.cm exécute start_process, attend que le processus se termine et affiche ensuite le fichier de sortie sans en-tête. J'ai modifié foo3.cm pour désactiver les lignes de commande et de macro ainsi que l'invite de commande pour imiter plus complètement la sortie d'une macro de commande exécutée de manière interactive.
start_process foo3.cm -wait
afficher foo3.out -no_header
|
Figure 15 - Macro de commande pour exécuter foo3.cm comme un processus lancé |
À l'exception de l'en-tête de connexion et du nom de la macro de commande sur les 2 premières lignes et de la ligne "Process finished" à la fin, les résultats sont les mêmes que si vous aviez exécuté la macro à partir de la ligne de commande 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
|
Figure 16 - Résultats de l'exécution de foo.cm dans un processus commencé |
Ainsi, comme vous pouvez le voir, même si vous ne pouvez pas utiliser telnet, il existe d'autres moyens de se connecter et d'exécuter des commandes de manière automatique.