2010-08-17 6 views
6

J'ai récemment découvert que les scripts CGI peuvent être écrits dans pratiquement toutes les langues pouvant être imprimées sur stdout. J'ai écrit un petit point de fraude script cgi qui fonctionne sur mon apache installation locale, mais pas sur mon hôte partagé:Guile Scheme et CGI?

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

Ceci est la sortie, quand je lance le script à partir d'un shell sur mon hôte sur ssh:

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

hi 

Donc, évidemment, mon hôte a installé guile. Cependant, lorsque j'essaie d'accéder à ce fichier dans un navigateur, j'obtiens une erreur "500 Internal Server Error". Lorsque l'on regarde mes journaux d'erreurs, je vois que je reçois le redoutable erreur « fin prématurée des en-têtes de script »:

[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 

Parce que je suis sur un hébergement mutualisé, en utilisant la mise en œuvre mod_lisp ou fastcgi de fraude sont hors de question . Cela étant dit, quel pourrait être le problème ici? Des scripts cgi similaires que j'ai écrits en python, perl, ruby ​​et sh fonctionnent sur le serveur sans erreur. Je vois que la version 1.8.7 est installée sur l'hôte, mais ma machine locale est sur la version la plus récente. Je comprends que c'est une question incroyablement niche, toute aide serait appréciée!

Répondre

6

Vous pourriez également être en mesure de compiler votre propre copie de guile ou de n'importe quoi et de le stocker dans votre répertoire ~/bin/et d'y faire pointer des scripts.

+0

Excellente idée, merci! – jcw

+0

J'ai récemment utilisé cette méthode pour faire fonctionner le guile sur mon hôte pour exécuter des programmes CGI. J'ai créé un petit script shell (que les programmes CGI exécutent) pour définir correctement LD_LIBRARY_PATH et GUILE_LOAD_PATH là où guile est installé. – gcbenison

4

Je crois que cette erreur signifie que votre processus de serveur Web n'a pas accès à l'interpréteur /usr/local/bin/guile. Vérifiez les permissions sur ce fichier, assurez-vous qu'il est accessible si le serveur s'exécute dans un chroot ou sous un contrôle d'accès obligatoire, etc. Et vérifiez les permissions sur votre script pendant que vous y êtes.

+0

J'ai changé la première ligne en "#!/Usr/bin/env guile", et je reçois les mêmes erreurs. Le binaire guile a les mêmes permissions que les binaires python et ruby ​​auxquels il est assis, à l'exception de o + w (et son groupe est bin, plutôt que wheel). Je n'ai pas les permissions pour chrooter. Les permissions du script sont 755. – jcw

1

Il s'avère que le répertoire/usr/local/bin qui existe quand je suis sshé sur le serveur est différent de/usr/local/bin lorsque le script est servi et accessible via un navigateur. J'ai découvert ce que les interprètes étaient disponibles grâce à ce script CGI:

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

Quand je courais ce script via un navigateur, je trouve que mzscheme a été inscrit, mais pas Guile. Donc, problème résolu, j'utilise mzscheme.

Merci, Karl.