来自PHP的GetFACL / SetFACL

时间:2013-11-25 18:21:42

标签: php linux shell acl

我需要在PHP的Linux机器上通过ACL管理目录权限,我们已经设置了Windows共享并将其安装在本地linux机器上。我正在寻找一种方法来获取和设置PHP类中的目录的权限,然后我可以使用它来与前端进行交互。我在subutux back in 2010找到了一些工作 - 但不确定执行:

function getfacl($f){
  //inital parsing
  $facl = shell_exec("getfacl $f");
  $facl_ = explode("\n",$facl);
  //print_r($facl_);
  foreach ($facl_ as $line){
    // Getting creator
    if (!preg_match("/^# file.*/",$line) && preg_match("/^#.*/",$line)){
    $facl_rule = explode(": ",$line);
    //print_r($facl_rule);
      if ($facl_rule[0] == "# owner"){
      $facl_output['owner'] = $facl_rule[1];
      } else if ($facl_rule[0] = "# group"){
      $facl_output['group'] = $facl_rule[1];
      }
  }
  return $facl_output;
}

所以,我有两个问题:

  1. 以上是否为GetFACL完成了工作?我将如何运行SetFACL命令?
  2. 是否有其他已知的库可以从PHP使用linux ACL?

1 个答案:

答案 0 :(得分:1)

没有收到任何回应。我最终得到了它的工作,所以我想我会发布以防其他人遇到类似的问题。

我们最终做的是从外部服务器上的MS目录在Linux机器上创建了一个共享安装。从那里我们通过用户拥有该权限。然后我使用库phpseclib,特别是ssh2组件,并运行shell命令来检索和运行ACL。

例如,这是用于检索getfacl的php的视图:

set_include_path(get_include_path() . PATH_SEPARATOR . '../phpseclib');
include('Net/SSH2.php');

$ssh = new Net_SSH2('location');
if (!$ssh->login('user', 'pass')) {
   exit('Login Failed');
}

echo $ssh->exec('ssh shared_mount_user@shared_mount_domain getfacl -R /folder/folder/file);

我可以在类似的函数中运行所有目录命令,例如setfacl,ls,rm等。

我还可以将getfacl检索并解析为特定部分,如下所示:

$facl = $ssh->exec('ssh shared_mount_user@shared_mount_domain getfacl /folder/folder');
$facl_ = explode("\n",$facl);
$users_array = array(); 
foreach ($facl_ as $line){
     if (!preg_match("/^# file.*/",$line) && preg_match("/^#.*/",$line)){
     $facl_rule = explode(": ",$line);
     if ($facl_rule[0] == "# owner"){
        $facl_output['owner'] = $facl_rule[1];
     } else if ($facl_rule[0] = "# group"){
        $facl_output['group'] = $facl_rule[1];
     }
  }
  if (!preg_match("/^#/",$line) && preg_match("/^user:/",$line)){
     $facl_user_rule = explode(":",$line);
     array_push($users_array,$facl_user_rule);
  }
}

最后,我编写了一个类,将所有这些放入了很好的小实例中,这样我就可以执行类似echo $FileManager->get_contents_array($ssh, $location);的操作,它只需运行一个ssh ls命令并解析层次结构以显示在目录UI。

希望这有助于某人。