【发布时间】:2014-01-17 00:12:07
【问题描述】:
我有一个使用 CGI 实现的 webapp。它基本上使用 system() 调用来启动其他程序,结果将以 html 呈现。
现在,我正在尝试使用 Dancer 来实现它。为了运行这些外部程序,我在 /MyApp 中创建了一个“脚本”目录,所以它就像 /MyApp/scripts。我将所有其他脚本放在那里,它们将在路由处理程序中调用。
get '/analysis' => sub {
if (session('user') && session('logged_in')) {
open FH, "<", "./scripts/test.out";
my $msg = <FH>;
close FH;
chdir ("./scripts");
system("call sth"); #call external programs to generate a "test.png"
my $err;
copy ("test.png", "../public/images/test.png") || ($err = "cannot copy"); #copy the "test.png" to public/images directory, so the
my $img = "test.png";
template 'analysis',{msg => $msg, img => $img, err => $err};
}
else {
return redirect '/'
}
};
但是,我可以作为独立应用程序或使用 plackup/starman 成功启动此应用程序。但我不能用 CGI 部署它。我使用 dancer 的关于 cgi 部署的文档完成了每一步。我可以成功地使用 cgi 来启动舞者的示例应用程序。但是当我尝试像上面那样启动自己的时候,我总是得到错误:
应用程序目录 '/home/tester/MyApp/bin/..' 不可写/可执行,并且不能在 /usr/local/share/perl/5.14.2/Dancer/Logger.pm 行对其进行 chmod 16、referer:本地主机
这似乎是一个权限问题,但我不知道如何解决它。有没有更好的方法从路由处理程序启动外部程序?我应该将这些外部程序存储在哪里,以便当舞者应用程序部署为 CGI 时它们可以被执行。
谁能帮帮我?谢谢。
小宽
【问题讨论】:
-
似乎您的目录上的权限设置为 group:none, others:none,并且 Web 服务器在不同的用户(不是您的)下运行。尝试将相关目录更改为 755,或者在您的代码将 test.png 复制到的 public/images 的情况下可能为 777。当你让它工作时,考虑一下在哪里需要哪些权限,以尽可能少地授予网络服务器的权限以防止黑客攻击。
-
我已经仔细调整了权限。效果很好。