2010-08-17 14 views
6

Ich habe kürzlich entdeckt, dass CGI-Skripte in so ziemlich jeder Sprache geschrieben werden können, die auf stdout drucken kann. Ich habe einen kleine List CGI-Skript geschrieben, das auf meinem lokalen Apache funktioniert installieren, aber nicht auf meinem Hostern:Guile Scheme und CGI?

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

Dies ist der Ausgang, wenn ich das Skript von einem Shell auf meinem Host über SSH ausführen:

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

hi 

Also, offensichtlich hat mein Host Guile installiert. Wenn ich jedoch versuche, auf diese Datei in einem Browser zuzugreifen, erhalte ich einen "500 Internal Server Error". Wenn meine Fehlerprotokolle suchen, ich sehe, dass ich das gefürchtete „vorzeitige Ende der Skript-Header“ Störung erhalten:

[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 

Weil ich auf einem gemeinsamen Host bin, mit mod_lisp oder FastCGI-Implementierung Arglist indiskutabel sind . Davon abgesehen, was könnte das Problem hier sein? Ähnliche CGI-Skripte, die ich in Python, Perl, Ruby und Sh geschrieben habe, funktionieren fehlerfrei auf dem Server. Ich sehe, dass Guile 1.8.7 auf dem Host installiert ist, aber meine lokale Maschine ist auf der neuesten Version.

Ich verstehe, dass dies eine unglaublich Nischenfrage ist, würde jede Hilfe geschätzt werden!

Antwort

6

Sie könnten auch in der Lage sein, eine eigene Kopie von Guile oder Whatnot zu kompilieren und sie in Ihrem ~/bin/Verzeichnis zu speichern und Skripte dort zu zeigen.

+0

Ausgezeichnete Idee, danke! – jcw

+0

Ich habe vor kurzem diese Methode verwendet, um auf meinem Host zu arbeiten, um CGI-Programme auszuführen. Ich habe ein kleines Shell-Skript erstellt (welches die CGI-Programme ausführen), um LD_LIBRARY_PATH und GUILE_LOAD_PATH korrekt für die Installation von GUILE zu setzen. – gcbenison

4

Ich glaube, dass dieser Fehler bedeutet, dass Ihr Webserverprozess keinen Zugriff auf den Interpreter /usr/local/bin/guile hat. Überprüfen Sie die Berechtigungen für diese Datei, stellen Sie sicher, dass auf sie zugegriffen werden kann, wenn der Server in einer Chroot oder unter einer obligatorischen Zugriffssteuerung usw. ausgeführt wird. Und überprüfen Sie die Berechtigungen für Ihr Skript, während Sie gerade dabei sind.

+0

Ich habe die erste Zeile in "#!/Usr/bin/env guile" geändert, und bekomme die gleichen Fehler. Die Guile-Binärdatei hat die gleichen Berechtigungen wie die Python- und Ruby-Binärdateien, neben denen sie sich befindet, außer o + w (und ihre Gruppe ist bin, statt Rad). Ich habe keine Berechtigungen zum Chroot. Die Berechtigungen des Skripts sind 755. – jcw

1

Es stellt sich heraus, dass das Verzeichnis/usr/local/bin, das existiert, wenn ich auf dem Server ssh'ed ist, sich von/usr/local/bin unterscheidet, wenn das Skript über einen Browser bedient wird. Ich fand heraus, was Dolmetscher durch diesen CGI-Skript zur Verfügung stand:

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

Als ich lief dieses Skript über einen Browser, fand ich, dass mzscheme aufgeführt wurde, aber nicht guile. Also, Problem gelöst, ich benutze mzscheme.

Danke, Karl.