2010-08-17 97 views
6

我最近發現,CGI腳本可以用幾乎可以打印到標準輸出的任何語言編寫。我寫了一個小詭計CGI腳本,它在我的本地apache的安裝工作,但不是我的共享主機:Guile計劃和CGI?

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

這是輸出,當我從我的主機通過ssh的shell運行腳本:

$ ./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的實現是不可能的。話雖如此,這裏可能是什麼問題?我用python,perl,ruby和sh編寫的類似cgi腳本在服務器上工作,沒有任何錯誤。我看到主機上安裝了guile 1.8.7,但我的本地機器是最新版本。

我明白,這是一個令人難以置信的利基問題,任何幫助將不勝感激!

回答

6

你也許可以編譯你自己的guile或whatnot的副本,並將它存儲在你的〜/ bin /目錄下並且有腳本指向那裏。

+0

非常好的主意,謝謝! – jcw 2010-08-22 18:40:35

+0

我最近使用這種方法在我的主機上運行CGI程序時使用了guile。我創建了一個小型shell腳本(CGI程序運行時),以正確設置安裝了guile的LD_LIBRARY_PATH和GUILE_LOAD_PATH。 – gcbenison 2012-03-03 05:32:59

4

我相信錯誤意味着您的網絡服務器進程無權訪問/usr/local/bin/guile解釋器。檢查該文件的權限,確保在服務器運行在chroot或強制訪問控制等情況下可以訪問該權限。在您處於腳本時仔細檢查腳本的權限。

+0

我已將第一行更改爲「#!/ usr/bin/env guile」,並且得到相同的錯誤。 guile二進制文件與它所坐的python和ruby二進制文件具有相同的權限,除了o + w(其組是bin,而不是wheel)。我沒有權限chroot。腳本的權限爲755. – jcw 2010-08-18 19:19:18

1

事實證明,當我在服務器上運行ssh時存在的/ usr/local/bin目錄與腳本通過瀏覽器訪問和訪問時與/ usr/local/bin不同。我發現了什麼口譯員可通過這個CGI腳本:

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

當我通過瀏覽器運行此腳本,我發現的MzScheme上市,但不狡猾。所以,問題解決了,我正在使用mzscheme。

謝謝,卡爾。