我需要编写一个脚本,在给定的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或依赖旧代码)?
答案 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)
感谢所有回复,以下是最终的工作:
将以下内容添加到php脚本的顶部:
#!/usr/local/bin/php-cgi
我不知道这在我的服务器配置上是否有特殊之处,但我可以运行exec()
并获得我想要的内容。