2010-08-17 3 views
6

Недавно я обнаружил, что скрипты CGI могут быть написаны практически на любом языке, который может печатать на stdout. Я написал сценарий CGI небольшой хитростью, которая работает на моем локальном апач установить, но не на моем виртуальном хостинге:Guile Scheme и CGI?

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

Это выход, когда я запустить скрипт из командной строки на моем хосте через SSH:

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

hi 

Таким образом, очевидно, что на моем хосте установлена ​​хитрость. Однако, когда я пытаюсь получить доступ к этому файлу в браузере, я получаю «Внутреннюю ошибку сервера 500». Глядя на мои журналы ошибок, я вижу, что я получаю страшились «преждевременный конец заголовков сценария» Ошибка:

[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 

Потому что я на виртуальном хостинге, используя mod_lisp или реализации FastCGI лукавства находятся вне вопроса , Сказать, что может быть здесь? Подобные скрипты cgi, которые я написал в python, perl, ruby ​​и sh, работают на сервере без ошибок. Я вижу, что guile 1.8.7 установлен на хосте, но мой локальный компьютер находится в самой новой версии.

Я понимаю, что это невероятно нишевый вопрос, любая помощь будет оценена!

ответ

6

Вы также можете скомпилировать свою собственную копию guile или whatnot и сохранить ее в каталоге ~/bin/и там есть сценарии.

+0

Отличная идея, спасибо! – jcw

+0

Недавно я использовал этот метод, чтобы заставить guile работать на моем хосте для запуска программ CGI. Я создал небольшой скрипт оболочки (который запускает программы CGI), чтобы правильно установить LD_LIBRARY_PATH и GUILE_LOAD_PATH, где установлен guile. – gcbenison

4

Я считаю, что ошибка означает, что ваш процесс веб-сервера не имеет доступа к интерпретатору /usr/local/bin/guile. Проверьте разрешения на этот файл, убедитесь, что он доступен, если сервер работает в chroot или под обязательным контролем доступа и т. Д. И дважды проверьте разрешения на свой скрипт, пока вы на нем.

+0

Я изменил первую строку на «#!/Usr/bin/env guile» и получаю те же ошибки. Бинарный файл guile имеет те же права, что и бинарные файлы python и ruby, которые расположены рядом, кроме o + w (а его группа - bin, а не колесо). У меня нет прав на chroot. Разрешения для скрипта - 755. – jcw

1

Оказалось, что каталог/usr/local/bin, который существует, когда я на сервере ssh'ed, отличается от/usr/local/bin, когда сценарий обслуживается и доступен через браузер. Я узнал, что были доступны переводчики через этот CGI скрипт:

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

Когда я запустил этот скрипт через браузер, я обнаружил, что mzscheme был в списке, но не хитростью. Итак, проблема решена, я использую mzscheme.

Спасибо, Карл.