我想在我的Ubuntu服务器上构建一个基于php的站点(自动化)一些命令
我做的第一件事是去文件(sudoers)并添加用户www-data所以我可以用root权限执行php命令!
# running the web apps with root power!!!
www-data ALL=(ALL) NOPASSWD: ALL
然后我的PHP代码是
<?php
$command = "cat /etc/passwd | cut -d\":\" -f1";
echo 'running the command: <b>'.$command."</b><br />";
echo exec($command);
?>
它只返回一个用户(最后一个用户)!如何让它返回所有用户?
谢谢
答案 0 :(得分:3)
来自exec的PHP手册:
返回值
结果的最后一行 命令。如果你需要执行一个 命令并拥有来自的所有数据 命令直接传回没有 任何干扰,使用passthru() 功能。 要获取已执行命令的输出,请务必设置并使用 输出参数。
所以你必须做类似的事情:
<?php
$output = array();
$command = "cat /etc/passwd | cut -d\":\" -f1";
echo 'running the command: <b>'.$command."</b><br />";
exec($command, &$output);
echo implode("<br />\n", $output);
?>
答案 1 :(得分:1)
就像Matt S所说,在您的服务器上允许www-data root访问是一个非常糟糕的主意。通过您的Web应用程序进行的最轻微的妥协可以让任何人完全控制您的系统。
更好的想法是为特定的加入制作单独的脚本,然后使用SUID权限。这意味着,特定用户(在本例中为www-data)可以通过执行脚本对系统进行小的更改。但是,这仍然不是一个好主意。您可以使用suPHP解决这个问题,但安全性仍然是一个主要问题。
答案 2 :(得分:1)
正如@benjamin解释的那样,不需要是root或sudo,也不需要SUID。
只是纯PHP。我使用了posix_getpwnam中的字段名称。
function getUsers() {
$result = [];
/** @see http://php.net/manual/en/function.posix-getpwnam.php */
$keys = ['name', 'passwd', 'uid', 'gid', 'gecos', 'dir', 'shell'];
$handle = fopen('/etc/passwd', 'r');
if(!$handle){
throw new \RuntimeException("failed to open /etc/passwd for reading! ".print_r(error_get_last(),true));
}
while ( ($values = fgetcsv($handle, 1000, ':')) !== false ) {
$result[] = array_combine($keys, $values);
}
fclose($handle);
return $result;
}
它返回一个包含所有用户的数组,格式如下:
[
[
'name' => 'root',
'passwd' => 'x',
'uid' => '0',
'gid' => '0',
'gecos' => 'root',
'dir' => '/root',
'shell' => '/bin/bash',
],
[
'name' => 'daemon',
'passwd' => 'x',
'uid' => '1',
'gid' => '1',
'gecos' => 'daemon',
'dir' => '/usr/sbin',
'shell' => '/usr/sbin/nologin',
],
...
]
答案 3 :(得分:0)
/ etc / passwd是任何人都可以读取的,所以你应该能够在没有任何特殊权限的情况下执行命令(除非PHP阻止它?)。