La semana pasada (bueno, fue la semana pasada cuando empecé a escribir esto) tuvimos un problema en el CAC en el que alguien quería escribir una macro de comando que corría telnet para entrar en un sistema y ejecutar algunos comandos, por ejemplo la macro de comando test.cm entra en un host remoto y ejecuta la macro de comando foo.cm.
&attach_input
telnet 192.168.77.128
Contraseña
foo.cm
|
Figura 1 - prueba de macrocomando de telnet.cm |
display_line display_system_usage
display_system_usage
display_line netstat -estadísticas -protocolo tcp
netstat -estadística
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -request_line 'stcp_meters' -quit
|
Figura 2 - foo.cm |
Desafortunadamente telnet no está diseñado para ejecutarse en una macro de comando y falla.
prueba
telnet: error fatal - tcgetattr fallido
Error en la línea 3 de la prueba.
procesador_de_comandos: Objeto no encontrado. Contraseña. En la macro del comando
SysAdmin>Noah_Davids>test.cm
|
Figura 3 - ejecución de la prueba.cm falla |
Sin embargo, hay varias maneras de hacer el ingreso automágico a un host remoto seguido de la ejecución de comandos.
send_cmds.c:
Escribí un programa hace un tiempo que hace una conexión a un servidor telnet, envía cadenas y analiza la salida. El lenguaje de scripts es simple, pero para cosas simples funciona bien. El código fuente con ejemplos más extensos se puede encontrar aquí
El guión es básicamente una cadena de envío seguida de una cadena de espera. El guión avanza a la siguiente línea cuando se ve la cadena de espera, como dije muy simple. El guión tiene argumentos, en la figura 4 uso arg0 para la contraseña, así que mi contraseña no está almacenada en el guión. La ejecución del guión sigue en la figura 5. Trunqué la salida de cada comando en aras de ahorrar espacio. Notarán que los caracteres no controlados de las cadenas de posicionamiento de los caracteres se muestran hasta que configuro el tipo de terminal en 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 para iniciar sesión y ejecutar el macro del comando foo |
send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 contraseña
SISTEMA DE PRUEBA PHOENIX CAC VOS (%phx_vos#m16)
*** Para arrancar en un lanzamiento de VOS diferente, vea el artículo sobre el lanzamiento de VOS.
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Module %phx_vos#m16
Por favor, inicie sesión a las 08:15:01
login nd
¿Contraseña?
Noah_Davids.CAC se registró en %phx_vos#m16 en 13-04-21 08:15:01 mst.
[f[J[?7l[20l=[1m[1;24r[f[J[J[24;80f
[0;1mlisto 08:15:01
[0mset_terminal_parameters -terminal_type ascii -pause_lines 0
[1mset_terminal_parameters -terminal_type ascii -pause_lines 0
listo 08:15:01
foo.cm
display_system_usage
Estadísticas de uso del módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas las 762,6 horas (31,7 días) arriba.
----CPU----- Last Min Last 5 Min Last Hour All Up Time
. . . . .
Int. Tiempo 0.00 0.1% 0.02 0.1% 0.23 0.1% 191.65 0.1%
netstat -estadística
tcp:
. . . .
201766 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 884, paso 8D3E6000, Noah_Davids.CAC
stcp_meters %phx_vos#m16 762:36:19 13-04-21 08:15:02
. . . .
bufdat ejecutado 678 (avg 0.0002/seg)
listo 08:15:02
listo 08:15:03
|
Figura 5 - ejecución de send_cmds |
esperar:
Hay un programa llamado expect en la gnu_library. La sintaxis de un script expect puede ser muy compleja, permite hacer bifurcaciones basadas en diferentes cadenas de retorno para que puedas manejar los errores de forma inteligente en lugar de sólo cronometrarlos. Puedes revisar la web para ver ejemplos, sólo tienes que buscar "ejemplos de guión expect". Presentaré un simple script que simplemente se conecta y ejecuta la macro foo.cm. Tengan en cuenta que había algunos errores en las primeras versiones de gnu_tools (por eso escribí send_cmds) pero a partir de la versión 3.4.0a deberían estar bien. Aunque no lo demuestro, expect también puede usar argumentos para que la contraseña no tenga que ser parte del script o el script pueda pedirte una contraseña. De nuevo trunqué la salida del comando desde el script y puedes ver que los caracteres no controlables de las cadenas de posicionamiento de los caracteres se muestran hasta que establezco el tipo de terminal en ascii. Sin embargo, espera que filtre la cadena de forma diferente para que no se muestren todos los caracteres.
desovar "telnet"
espera "telnet>"
enviar "abrir 192.168.77.128r"
espera "login"
enviar "login ndr"
espera "Contraseña"
enviar "passwordr"
espera "listo"
enviar "set_terminal_parameters -terminal_type ascii -pause_lines 0r"
espera "listo"
enviar "foo.cmr"
espera "listo"
|
Figura 6 - espera que el script se conecte y ejecute la macro del comando foo |
>bin>espera prueba.espera
spawn telnet
telnet> abierto 192.168.77.128
Intentando...
Conectado al 192.168.77.128.
El carácter de escape es '^]'.
SISTEMA DE PRUEBA PHOENIX CAC VOS (%phx_vos#m16)
*** Para arrancar en un lanzamiento de VOS diferente, ver el artículo sobre el lanzamiento de VOS.
*** >Overseer>COMMON>cfg>reconfig_instructions ***
OpenVOS Release 17.1.0ax, Module %phx_vos#m16
Por favor, inicie sesión 08:51:28
login nd
¿Contraseña?
Noah_Davids.CAC se registró en %phx_vos#m16 a las 13-04-21 08:51:28 mst.
fJ?7l20l
0;1mlisto 08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
listo 08:51:28
foo.cm
display_system_usage
Estadísticas de uso del módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas las 763,2 horas (31,8 días) arriba.
----CPU----- Ultimo minuto Ultimo 5 minutos Ultima hora todo el tiempo
. . . .
Int. Tiempo 0.00 0.1% 0.02 0.1% 0.24 0.1% 191.80 0.1%
netstat -estadística
tcp:
. . . .
201926 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 895, paso 8D2E1200, Noah_Davids.CAC
stcp_meters %phx_vos#m16 763:12:46 13-04-21 08:51:29
. . . .
bufdat ejecutado 678 (avg 0.0002/seg)
listo 08:51:29
listo 08:51:29
|
Figura 7 - esperar la ejecución del guión |
SSH:
Finalmente puedes usar SSH para ejecutar un comando en un sistema remoto. Si también has configurado la autenticación de clave pública no se te pedirá una contraseña en el momento de la ejecución.
Hay un número de arrugas interesantes cuando se usa SSH. Las primeras abreviaturas no funcionan, no intente ejecutar dps, use display_print_status.
ssh [email protected] dbs
sh: dbs: comando no encontrado
listo 12:26:25
|
Figura 8 - Usar SSH para ejecutar remotamente una abreviatura de comando no funciona |
ssh [email protected] display_batch_status
Colas de lotes para %phx_vos#m16
ESTADO DE COLA MÁXIMO DE TRABAJOS EN CURSO
funcionamiento normal 5
listo 12:26:43
|
Figura 9 - El uso de SSH para ejecutar remotamente un comando funciona |
En segundo lugar, la ejecución directa de una macro de comando no funciona; note que no hay salida y parece que sólo el primer comando de la macro fue siquiera procesado.
ssh [email protected] 'foo.cm'
display_system_usage
listo 12:08:40
|
Figura 10 - Usar SSH para ejecutar remotamente una macro de comando no siempre funciona |
En su lugar tienes que ejecutar el comando shell y proporcionar el comando macro como su argumento.
ssh [email protected] '/bin/sh foo.cm'
display_system_usage
Estadísticas de uso del módulo %phx_vos#m16, G94330, OpenVOS Release 17.1.0ax
Todas las 766,5 horas (31,9 días) arriba.
----CPU----- Ultimo minuto Ultimo 5 minutos Ultima hora todo el tiempo
Minutos de CPU 0.02 0.5% 0.09 0.4% 0.91 0.4% 724.76 0.4%
. . . .
Int. Tiempo 0.00 0.1% 0.02 0.1% 0.23 0.1% 192.57 0.1%
netstat -estadística
tcp:
. . . .
202796 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 922, paso 8D3C2780, Noah_Davids.CAC
stcp_meters %phx_vos#m16 766:30:14 13-04-21 12:08:57
. . . .
bufdat ejecutado 678 (avg 0.0002/seg)
listo 12:08:59
|
Figura 11 - Usando SSH para ejecutar remotamente una macro de comando ejecutándola como un shell script |
Las macros complejas no funcionarán. Por ejemplo, cada línea del comando macro se bifurca como un proceso separado, por lo que las macros que utilizan el directorio de proceso para guardar resultados intermedios no funcionarán. Tenga en cuenta que cada invocación de analyze_system está reportando un número de proceso diferente.
ssh [email protected] '/bin/sh foo3.cm'
SysAdmin>Noah_Davids>foo3.cm 13-04-21 12:52:20 mst
mostrar foo3.cm
línea_de_visualización
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 1028, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 1029, ptep 8D3C3000, Noah_Davids.CAC
OpenVOS versión 17.1.0ax, analyze_system versión 17.1.0ax
El proceso actual es 1030, ptep 8D3C3000, Noah_Davids.CAC
listo 12:52:21
|
Figura 12 - Cada comando en la macro se bifurca como un proceso separado |
El uso de macros de comando con variables de estilo VOS generará errores de sintaxis ya que el shell no sabe cuáles son. La macro de comando foo3.cm se muestra y luego cuenta hasta 9. El comando display se ejecuta y el "&set" genera un error de sintaxis.
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 - Las macros de comando con variables estilo VOS no funcionarán |
Pero el uso de las variables de la cáscara funcionará. Eso, por supuesto, puede requerir extensas reescrituras de las macros existentes. Aquí hay un ejemplo de la misma macro que un script de shell.
ssh [email protected] '/bin/sh foo3u'
cat foo3u
cuenta=1
mientras que [[[ $count -le 9 ]]]
hacer
eco "$cuenta"
(( cuenta++ )))
hecho
1
2
3
4
5
6
7
8
9
listo 07:44:41
|
Figura 14 - El script de shell con variables de estilo de shell funciona |
Sin embargo, puede ejecutar su macro de comando estilo VOS como un proceso iniciado y luego mostrar el archivo de salida que se produce. La macro start_foo3.cm ejecuta start_process, espera a que el proceso termine y luego muestra el archivo de salida sin una cabecera. He modificado foo3.cm para desactivar las líneas de comando y de macro y también el prompt listo para imitar más completamente la salida de una macro de comando ejecutada interactivamente.
start_process foo3.cm -wait
mostrar foo3.out -no_header
|
Figura 15 - Comando macro para ejecutar foo3.cm como un proceso iniciado |
Con la excepción del encabezado de entrada y el nombre de la macro de comando en las primeras 2 líneas y la línea de "Proceso terminado" al final, los resultados son los mismos que si se ejecutara la macro desde la línea de comando de 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 de correr foo.cm en un proceso iniciado |
Así que, como puedes ver mientras no puedes usar telnet que son otras formas de acceder y ejecutar comandos de forma automática.