Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Interactuar con shell script Responder al tema
Nuevo tema


Página 1 de 1  [ 8 mensajes ] 
 
Nota 2011-06-16 11:11 @508

Perlero Nuevo
Registrado: 2011-06-16 09:13 @426
Mensajes: 3
Interactuar con shell script
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í:
Syntax: [ Download ] [ Hide ]
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);


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...


Nota 2011-06-16 12:53 @579

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Interactuar con shell script
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.


Nota 2011-06-16 13:10 @590

Perlero Nuevo
Registrado: 2011-06-16 09:13 @426
Mensajes: 3
Re: Interactuar con shell script
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.


Nota 2011-06-16 13:17 @595
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Interactuar con shell script
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:

Syntax: [ Download ] [ Hide ]
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.  

Puede que alguien piense que esto es una forma muy elaborada de algo más simple:
Syntax: [ Download ] [ Hide ]
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";

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


Nota 2011-06-16 14:13 @634

Perlero Nuevo
Registrado: 2011-06-16 09:13 @426
Mensajes: 3
Re: Interactuar con shell script
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?


Nota 2011-06-16 14:26 @643
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: Interactuar con shell script
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


Nota 2011-06-17 06:22 @307

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Interactuar con shell script
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.


Nota 2011-06-19 15:08 @672
Avatar de Usuario
Vive para Perl en Español
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor
Mensajes: 592
Re: Interactuar con shell script
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?


Responder al tema  [ 8 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO