2010-08-17 23 views
6

Recientemente descubrí que los scripts CGI se pueden escribir en prácticamente cualquier idioma que se pueda imprimir en stdout. He escrito un script CGI pequeña astucia que funciona en mi apache instalación local, pero no en mi servidor compartido:Guile Scheme and CGI?

#!/usr/local/bin/guile -s 
!# 
(display "Content-Type: text/html") 
(newline) 
(newline) 
(display "hi") 
(newline) 

Ésta es la salida, cuando corro el guión de una concha en mi host a través de SSH:

$ ./scheme.cgi 
Content-Type: text/html 

hi 

Así que, obviamente, mi anfitrión ha sido instalado. Sin embargo, cuando intento acceder a este archivo en un navegador, aparece el mensaje "500 Internal Server Error". Cuando se mira en mis registros de errores, veo que me estoy haciendo el "fin prematuro de las cabeceras de script" temido error:

[server.com] [Tue Aug 17 00:54:19 2010] [error] [client xx.xx.xx.xxx] (2)No such file or directory: 
exec of '/home/www/vhosts/jcw.geekisp.com/cgi-bin/scheme.cgi' failed 

[server.com] [Tue Aug 17 00:54:19 2010] [error] [client xx.xx.xx.xxx] Premature end 
of script headers: scheme.cgi 

porque estoy en un servidor compartido, usando mod_lisp o implementación fastcgi de Guile están fuera de la cuestión . Dicho eso, ¿cuál podría ser el problema aquí? Los scripts cgi similares que he escrito en python, perl, ruby ​​y sh funcionan en el servidor sin errores. Veo que guile 1.8.7 está instalado en el host, pero mi máquina local está en la versión más nueva.

Entiendo que esta es una pregunta muy nicho, ¡cualquier ayuda sería apreciada!

Respuesta

6

También podría compilar su propia copia de Guile o lo que sea, y almacenarla en su directorio ~/bin/y tener scripts apuntando allí.

+0

¡Excelente idea, gracias! – jcw

+0

Hace poco utilicé este método para obtener astucia trabajando en mi host para ejecutar programas CGI. Creé un pequeño script de shell (que los programas CGI ejecutan) para establecer LD_LIBRARY_PATH y GUILE_LOAD_PATH correctamente para donde se instale Guile. – gcbenison

4

Creo que el error significa que el proceso de su servidor web no tiene acceso al intérprete /usr/local/bin/guile. Verifique los permisos en ese archivo, asegúrese de que esté accesible si el servidor se ejecuta en un chroot o bajo control de acceso obligatorio, etc. Y vuelva a verificar los permisos en su secuencia de comandos mientras lo hace.

+0

He cambiado la primera línea a "#!/Usr/bin/env guile", y estoy obteniendo los mismos errores. El binario malicioso tiene los mismos permisos que los binarios de python y ruby ​​que está junto a él, a excepción de o + w (y su grupo es bin, en lugar de rueda). No tengo permisos para chroot. Los permisos del guión son 755. – jcw

1

Resulta que, el directorio/usr/local/bin que existe cuando estoy ssh'ed en el servidor es diferente de/usr/local/bin cuando se sirve el script y se accede a través de un navegador. Me enteré de lo que se dispone de intérpretes a través de esta secuencia de comandos CGI:

#!/bin/sh 
echo "Content type: text/html\r\n\r\n" 
echo "ls /usr/local/bin" 

Cuando me encontré con este script a través de un navegador, me encontré con que MzScheme estaba en la lista, pero no Guile. Entonces, problema resuelto, estoy usando mzscheme.

Gracias, Karl.