0

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

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

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

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

所以后来我记得当我尝试每个命令行功能时,有些人会抛出“不允许在安全模式下”类型错误,而其他人什么也没做。如果我放一些类似的东西:

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

4 回答 4

1

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

我认为您不能依靠套接字来读取本地文件,套接字用于与网络相关的事情。

于 2009-09-30T15:57:50.027 回答
0

Exec 返回一个值,所以这样做:

$var = exec("finger user"); 

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

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

要不就:

echo exec("finger user");

如果您只想查看输出。

于 2009-09-30T15:57:36.033 回答
0

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

尝试类似的东西,

exec("finger user",$output);

echo "[[";
foreach($output as $key => $value){
echo $value;
}
echo "]]";
于 2009-09-30T15:59:50.480 回答
0

感谢所有回复,以下是最终奏效的方法:

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

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

我不知道这对我的服务器配置是否有特殊意义,但我可以运行exec()并获得我想要的东西。

于 2009-10-06T01:28:08.267 回答