2010-08-17 14 views
6

Recentemente ho scoperto che gli script CGI possono essere scritti in quasi tutti i linguaggi che possono essere stampati su stdout. Ho scritto uno script CGI piccola astuzia che funziona sul mio apache installazione locale, ma non sul mio host condiviso:Schema del Guile e CGI?

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

Questa è l'uscita, quando ho eseguito lo script da una shell su mio ospite su SSH:

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

hi 

Quindi, ovviamente il mio host ha installato guile. Tuttavia, quando provo ad accedere a questo file in un browser, viene visualizzato il messaggio "Errore interno server 500". Se si guarda a miei log di errore, vedo che sto ottenendo la "fine prematura di intestazioni di script" temuto errore:

[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 

Perché io sono su un host condiviso, utilizzando mod_lisp o implementazione di FastCGI di frode sono fuori questione . Detto questo, quale potrebbe essere il problema qui? Script cgi simili che ho scritto in python, perl, ruby ​​e sh sul server senza errori. Vedo che 1.8.7 guile è installato sull'host, ma il mio computer locale è sulla versione più recente.

Capisco che questa è una domanda incredibilmente di nicchia, qualsiasi aiuto sarebbe apprezzato!

risposta

6

Si potrebbe anche essere in grado di compilare la vostra copia di astuzia o roba del genere e memorizzare nel vostro ~/bin/e hanno gli script punto c'è.

+0

Ottima idea, grazie! – jcw

+0

Recentemente ho usato questo metodo per ottenere l'ingiunzione di lavorare sul mio host per l'esecuzione di programmi CGI. Ho creato un piccolo script di shell (che eseguire i programmi CGI) per impostare LD_LIBRARY_PATH e GUILE_LOAD_PATH correttamente per cui è installato l'astuzia. – gcbenison

4

Credo che l'errore indichi che il processo del server Web non ha accesso all'interprete /usr/local/bin/guile. Verifica le autorizzazioni su quel file, assicurati che sia accessibile se il server viene eseguito in chroot o sotto controllo obbligatorio degli accessi, ecc. Verifica due volte le autorizzazioni sul tuo script mentre ci sei.

+0

Ho modificato la prima riga in "#!/Usr/bin/env guile" e sto ottenendo gli stessi errori. Il binario astuzia ha le stesse autorizzazioni come i binari Python e Ruby si è seduta accanto a, ad eccezione di o + w (e il suo gruppo è bin, piuttosto che ruota). Non ho i permessi per chroot. Le autorizzazioni dello script sono 755. – jcw

1

Si scopre che, la directory/usr/local/bin che esiste quando sono ssh'ed sul server è diversa da/usr/local/bin quando lo script è servito e accessibile tramite un browser. Ho scoperto che cosa erano disponibili interpreti attraverso questo script CGI:

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

Quando ho eseguito questo script attraverso un browser, ho scoperto che MzScheme è stato elencato, ma non Guile. Quindi, problema risolto, sto usando mzscheme.

Grazie, Karl.