【发布时间】:2015-01-24 14:10:24
【问题描述】:
我在 Linux (Ubuntu 14.04) 上运行一个简单的 apache Web 服务器,其中有一个处理一些请求的 perl CGI 脚本。该脚本使用system 函数启动系统命令,但我希望它立即返回,而不管系统调用的结果如何。
我一直在传递给system 的标量参数的末尾添加一个和号(我知道命令注入攻击的含义),尽管这确实会导致系统命令立即返回,脚本仍然不会退出,直到底层命令完成。
如果我使用来自 perl CGI 的 system 调用触发了一个休眠 10 秒的虚拟 ruby 脚本,那么我对 Web 服务器的请求仍然会等待 10 秒才能最终得到响应。我在system 调用之后放了一条日志语句,它在发出网络请求时立即出现,因此system 调用肯定会立即返回,但脚本仍在等待结束。
This question 类似,但两种解决方案都不适合我。
下面是一些示例代码:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init(
{ level => $DEBUG, file => ">>/var/log/script.log" } );
print "Content-type: application/json\n\n";
my $cgi = CGI->new();
INFO("Executing command...");
system('sudo -u on-behalf-of-user /tmp/test.rb one two &');
INFO("Command initiated - will return now...");
print '{"error":false}';
编辑:
命令调用是使用sudo -u 执行的,因为apache 用户www-data 需要代表脚本所有者执行脚本的权限,并且为此我已经适当地更新了我的sudoers 文件。这不是我的问题的原因,因为我也尝试将脚本所有权更改为 www-data 并运行 system("/tmp/test.rb one two &") 但结果是一样的。
编辑 2:
我还尝试将exit 0 添加到脚本的最后,但这没有任何区别。脚本是否有可能立即退出,但 apache 服务器一直在等待响应,直到 perl CGI 调用的脚本完成?还是操作系统的某些设置或配置可能导致问题?
编辑 3:
直接从终端运行 perl CGI 脚本可以正常工作。 perl 脚本立即结束,因此这不是 Perl 的固有问题。这可能仅意味着 Apache Web 服务器一直保留请求,直到从 system 调用的命令完成。为什么?
【问题讨论】:
-
我知道,它们几乎是相同的,但是在那个问题中,我专门询问了
system调用的数组版本以防止命令注入。在任何情况下,这些解决方案中的 none 都不适合我,导致与此问题中描述的行为相同。此外,当我接受该问题的答案时,我没有正确测试,所以我没有意识到它仍然无法正常工作。