2010-08-17 99 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。

谢谢,卡尔。