如何从PHP脚本执行命令行

时间:2009-09-30 15:50:48

标签: php command-line exec safe-mode

我需要编写一个脚本,在给定的Unix帐户(脚本所在的Unix服务器)上提供用户信息。通常是passwd文件中的各种东西,或通过手指可用的东西。

PHP处于安全模式,因此我无法通过像file_get_contents()这样内置于php中的内容访问passwd文件。此外,由于它处于安全模式,因此禁用了各种其他命令行功能。

我以为我可以通过套接字获取信息(不知道那意味着什么,但我想我会尝试)但是我得到一个致命的错误socket_create()是一个未知函数。我拉起了php-config文件(我无法更改,仅供参考),果然,套接字没有启用。

然而,当我在那里时,我看到了行'--with-exec-dir='没有设置实际目录。

然后我记得当我尝试 EVERY 命令行函数时,有些人抛出了“不允许安全模式”的类型错误,而其他人则什么也没做。如果我提出类似的东西:

echo "[[";
exec("finger user");
echo "]]";

我最终得到了[[]]。所以没有错误,也没有结果。

底线:

有没有我尝试过的东西? (一般来说) 我可以设置运行时配置选项以使exec()有效吗?

快速说明:我也尝试了passthru(),特别是passthru("pwd")仍然没有输出。

更新

根据反馈,我尝试了以下两种方法:

$stuff = exec("pwd", $return);

echo "stuff=".$stuff."\n";
echo "return=";
print_r($return);

导致:

stuff=
return=Array
(
)

$stuff = passthru("pwd", $return);

echo "stuff=".$stuff."\n";
echo "return=";
print_r($return);

导致:

stuff=
return=1

1听起来很有希望,但不是我想要的。

所以这实际上是对现有脚本的更新(请不要问)我无权访问。这是一个通过cgi调用的perl脚本。有没有办法通过cgi做php(所以我不需要处理perl或依赖旧代码)?

4 个答案:

答案 0 :(得分:1)

我担心你不能在安全模式下这样做。如果您可以控制服务器配置,则必须删除安全模式。

我认为你不能依靠套接字来读取本地文件,套接字用于网络相关的东西。

答案 1 :(得分:0)

Exec返回一个值,所以:

$var = exec("finger user"); 

然后解析输出以获得您想要的内容。您可以通过添加可选变量来获得返回状态:

exec("finger user", $var, $return_status);

或只是:

echo exec("finger user");

如果你想要的只是看到输出。

答案 2 :(得分:0)

exec本身并不返回任何数据。

尝试类似的事情,

exec("finger user",$output);

echo "[[";
foreach($output as $key => $value){
echo $value;
}
echo "]]";

答案 3 :(得分:0)

感谢所有回复,以下是最终的工作:

  • 创建一个cgi-bin文件夹
  • 将以下内容添加到php脚本的顶部:

     #!/usr/local/bin/php-cgi
    

我不知道这在我的服务器配置上是否有特殊之处,但我可以运行exec()并获得我想要的内容。