• Publicidad

Interactuar con shell script

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Interactuar con shell script

Notapor djosuef » 2011-06-16 11:11 @508

Hola a todos...

Soy nuevo con Perl. Está excelente esta página.

Empecé a usar Perl porque necesito interactuar con un script de shell. El script es el instalador de una aplicación, y al ejecutarlo pide ingresar algunas opciones por teclado. Pero mi intención es que estas opciones se ingresen automáticamente.

Esto es lo que escribí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/local/perl -w
  2.  
  3. $linea = 1;
  4. open(INSTAL,"|/root/Desktop/if_compiler/install.sh");
  5. while(INSTAL && $linea<13)
  6. {
  7.   print $linea;
  8.  
  9.   if ($linea==1)
  10.       {  print INSTAL "1\n";}
  11.   if ($linea==2)
  12.       {  print INSTAL "2\n";}
  13.   if ($linea==3)
  14.       {  print INSTAL "/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic\n";}
  15.   if($linea==4)
  16.       {  print INSTAL "yes\n";}
  17.   if($linea==5)
  18.       {  print INSTAL "1\n";}
  19.   if($linea==6)
  20.       {  print INSTAL "\n";}
  21.   if($linea==7)
  22.       {  print INSTAL "q";}
  23.   if($linea==8)
  24.       {  print INSTAL "accept\n";}
  25.     if($linea==9)
  26.       {  print INSTAL "/\n";}
  27.     if($linea==10)
  28.       {  print INSTAL "\n";}
  29.     if($linea==11)
  30.       {  print INSTAL "\n";}
  31.     if($linea==12)
  32.       {  print INSTAL "\n";}
  33.   $linea = $linea+1;
  34. }
  35. close(INSTAL);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El install.sh se ejecuta y recibe las primeras 3 opciones enviadas pero luego no se qué ocurre, y aunque termina la ejecución, no instala la aplicación.

Gracias por cualquier ayuda...
djosuef
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-06-16 09:13 @426

Publicidad

Re: Interactuar con shell script

Notapor pvaldes » 2011-06-16 12:53 @579

Tus opciones dependen de lo que quieras hacer.

Si las opciones son fijas, mételas en el script en una variable.

Si no son fijas y pueden pasarse como argumentos de la función, hazlo.

Si son demasiado complicadas para que el humano al cargo las escriba, haz una llamada a otro programa y que las averigüe por ti.

print INSTAL "/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic\n"

Esto simplemente escribe "/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic" en un archivo, lo cual dicho sea de paso está, muy feo...

... porque no deberías hacer eso desde una sesión de root.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Interactuar con shell script

Notapor djosuef » 2011-06-16 13:10 @590

Te entiendo, pero el problema es que el script
install.sh no es hecho por mi y no encuentro manera
de escribirle las opciones para que las tome fijas ni pasárselas por parámetro ya que éste al parecer ejecuta binarios que son los que piden y capturan las opciones por teclado.

En
print INSTAL "/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic\n"

lo que trato de hacer es darle al install.sh una de las opciones que me pide, que es el path de la licencia.
djosuef
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-06-16 09:13 @426

Re: Interactuar con shell script

Notapor explorer » 2011-06-16 13:17 @595

Bienvenido a los foros de Perl en español, djosuef.

Si el script que realiza la instalación, admite la entrada de órdenes desde la entrada estándar, has elegido una buena estrategia.

Lo que podemos pensar es que, si es un shell UNIX normal, lo normal (repito) será que el carácter que indica el final de la introducción de un comando, es el del fin de línea ("\n"). Así que tu programa se puede reducir a:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $|++;                                                     # eliminamos el caché de salida
  2. open( INSTALL, "|/root/Desktop/if_compiler/install.sh");  # ejecutamos el instalador, entubando su entrada estándar
  3.                                                           # a nuestra salida estándar
  4. print INSTALL join(                                       # sacamos unidos
  5.     "\n",                                                 # por el carácter de fin de línea
  6.     1,                                                    # las distintas opciones
  7.     2,
  8.     '/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic',
  9.     'yes',
  10.     1,
  11.     '',
  12.     'q',
  13.     'accept',
  14.     '/',
  15.     '',
  16.     '',
  17.     '',
  18. ),
  19. "\n"                                                      # último fin de línea
  20. ;
  21. close INSTALL;
  22.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Puede que alguien piense que esto es una forma muy elaborada de algo más simple:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print INSTALL "1\n2\n/root/Desktop/if_compiler/l_for_ncomMMSWX585.lic\nyes\n1\n\nq\naccept\n/\n\n\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero... es un poco lioso... y feo ;) pero funciona...

Esto funcionará, siempre y cuando el instalador no realice un flush() de la entrada estándar al principio de cada entrada de comandos. Si admite la entrada estándar, le mandas en un churro todas las opciones.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Interactuar con shell script

Notapor djosuef » 2011-06-16 14:13 @634

explorer, gracias por tu respuesta.

Sí. Al ejecutar en un terminal el install.sh me empieza a pedir por allí mismo las opciones, pero el programa se sigue comportando igual que antes.

Pasa por todas las opciones, pero algo no está bien porque no se instala...

En el terminal se muestra lo que me pide el install.sh pero no muestra lo que ingreso por el guión de Perl. ¿Cómo puedo ver todo lo que se ejecuta paso por paso?
djosuef
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-06-16 09:13 @426

Re: Interactuar con shell script

Notapor explorer » 2011-06-16 14:26 @643

Si el programa pasa por todas las opciones, entonces está identificando, al menos, todos los caracteres "\n" que le estamos enviando.

La cuestión es que debemos estar completamente seguros de que le estamos enviando, correctamente, todos los argumentos, en la secuencia correcta.

Si llega al final, y no se instala, debemos ver por qué no lo ha hecho. Es posible que el programa de instalación tenga un mensaje o un registro log donde quede reflejado todos los pasos que ha hecho, y el porqué no ha podido terminar de forma correcta.

El verlo paso a paso es complicado... porque estamos hablando de la ejecución de dos programas "en paralelo".

Ahora bien... si el instalador es un '.sh' (un shell), puedes editar la línea del shebang (la primera), y le agregas un '-x' para que el shell saque una traza de todas las líneas ejecutadas.

Por otra parte... quizás lo estamos complicando...

La extensión '.sh' del instalador indica que el programa está escrito en shell, así que debería ser fácil modificarlo para agregarle los argumentos por defecto.

Otra opción es usar un módulo como Expect.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Interactuar con shell script

Notapor pvaldes » 2011-06-17 06:22 @307

Y otra más, meter los comandos de los binarios con las opciones necesarias dentro de un system(). Puedes probarlo aunque sea sólo para ver si podemos descartar que el problema esté en la shell y no en Perl.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Interactuar con shell script

Notapor creating021 » 2011-06-19 15:08 @672

Probablemente hace falta hacer un autoflush al buffer de entrada.

¿Por qué no usas IPC::Open3?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron