• Publicidad

Premature end en script sencillo

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Premature end en script sencillo

Notapor reLlene » 2012-10-03 14:38 @651

Tengo problemas como con este sencillo script.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [[[Wed Oct 03 16:32:12 2012] [error] [client 127.0.0.1] (8)Exec format error: exec of '/usr/lib/cgi-bin/hello.pl' failed
  2. [Wed Oct 03 16:32:12 2012] [error] [client 127.0.0.1] Premature end of script headers: hello.pl
  3.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  #!/usr/bin/perl -w
  2.  
  3.  
  4. use CGI qw/:all/;
  5. use CGI::Carp qw/fatalsToBrowser/;
  6. use HTML::Template;
  7.  
  8.     # open the html template
  9.     my $template = HTML::Template->new(filename => '/home/reLlene/tmpls/documento.tmpl');
  10.  
  11.     # fill in some parameters
  12.     $template->param(HOME => $ENV{HOME});
  13.     $template->param(PATH => $ENV{PATH});
  14.  
  15.         print "Content-type: text/html\n\n";
  16.         $template->output;
  17.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No veo qué hago mal porque desde otros scripts voy a buscar otros o incluso el MISMO .tmpl para mostrar en el navegador y me funciona.

Permisos del script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. -rwxr-xr-x 1 root    root      458 oct  3 16:30 hello.pl
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintaxis:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. bash# perl -c hello.pl
  2. hello.pl syntax OK
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡¡ AHH... y lo corro en la terminal y se imprime bien el html !!!
WTF ?? :?
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Publicidad

Re: Premature end en script sencillo

Notapor explorer » 2012-10-03 15:47 @699

Hay un espacio en blanco delante de '#!'.

Una cosa...

Si estás usando el módulo CGI, ¿por qué tienes escrito esto?

print "Content-type: text/html\n\n";

y $template->output(); no envía la salida a la salida estándar. Deberás ponerlo en un print().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Premature end en script sencillo

Notapor reLlene » 2012-10-04 09:59 @457

Buenísimo, explorer, ya me funciona.
Sobre el uso de CGI.pm tienes toda la razón :lol: , para eso me valgo de
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print CGI::header();
  2. print CGI::start_html();
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y con el print como dices la impresión desde el terminal sale sin problemas pero no así desde el navegador
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $template->output();
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿ Ahora, no deja de ser una salida estándar la del terminal? Es lo que no me cuerda :?
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Premature end en script sencillo

Notapor explorer » 2012-10-04 11:22 @515

Prueba con esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3.  
  4. use CGI qw/:all/;
  5. use CGI::Carp qw/fatalsToBrowser/;
  6. use HTML::Template;
  7.  
  8. # open the html template
  9. my $template = HTML::Template->new(filename => '/home/reLlene/tmpls/documento.tmpl');
  10.  
  11. # fill in some parameters
  12. $template->param(HOME => $ENV{HOME});
  13. $template->param(PATH => $ENV{PATH});
  14.  
  15. print header();
  16. print $template->output;
  17.  
  18. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Premature end en script sencillo

Notapor reLlene » 2012-10-04 12:26 @559

Lo que no consigo es la impresión de la variable $ENV{HOME} desde el navegador pero sí desde el terminal. El template es correcto, incluso:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.  
  2. <head><title>Test Template</title></head>
  3.  
  4.         <body>
  5.                 My Home Directory is <TMPL_VAR NAME=HOME>
  6.     <p>
  7.                 My Path is set to <TMPL_VAR NAME=PATH>
  8.     </body>
  9.  
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Premature end en script sencillo

Notapor explorer » 2012-10-04 13:37 @609

Claro, porque los $ENV{HOME} son distintos, en cada caso.

Cuando lo ejecutas desde la terminal, lo estás haciendo como un usuario del sistema, y éste inicializó tu entorno, incluyendo la variable $HOME (que en Perl se lee con %ENV).

Pero... cuando lo ejecutas con el navegador, quien ejecuta el programa es (el usuario que ejecuta) el servidor web, que podría tener un $HOME distinto al tuyo, o incluso no tener ninguno.

Moraleja: cuando hagas CGI ten siempre presente que quien va a ejecutar tu código es un proceso servidor (el Apache, por ejemplo), no tú. Y por lo tanto, deberás tomar las medidas apropiadas para tener acceso al resto del sistema (sistema de ficheros, variables de entorno, etc.).

Lo que sí puedes hacer es imprimir todo el contenido de %ENV y así verás el entorno con el que cuentas, que será muy distinto del que tienes como usuario, que puedes sacar con el comando env o el set del Bash.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Premature end en script sencillo

Notapor reLlene » 2012-10-04 15:35 @691

¡Ahh! Yo creía que se trataban de las MISMAS variables de entorno y por eso no comprendía cómo no mostraba la $HOME.

Gracias amigo. ¡¡Más que solucionado!! :D
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados