php调用linux命令更改文件权限

相信大家也遇到过,php程序运行时产生了一个daemon的用户,而这个用户不具备写文件的权限,我试过如下几种方法:
1、chmod函数 chmod($file, 0777),无效
2、exec函数 exec("chmod -R 777 $file"),无效
将它们改成755也不行,查过很多资料说不具备超级用户权限,但为了安全,服务器生成的这个daemon用户是没有超级用户权限的,应该如何修改,请给出具体步骤,参照了很多资料并执行其中代码都没有效果

我们的服务器是这样做的:
php一般是以apache用户身份去执行的,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件的权限,当然,属组最好不要是root,你可以为该文件夹改个其它普通用户组。

改apache/php的运行用户方法不安全,不建议使用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-30

在php教程中调用linux命令的函数是
string   exec(string   command,   string   [array],   int   [return_var]);

exec( "vpopmail ");

echo exec('whoami');

再看一实例

function exec_enabled() {
  $disabled = explode(', ', ini_get('disable_functions'));
  return !in_array('exec', $disabled);
}
<?php 
$tmp = exec("c:\Image\gm.exe convert c:\Image\file1.tiff c:\Image\file1.jpg", $results); 
?>

还有一种命令是

php通过函数system()调用系统命令。

string system ( string $command [, int &$return_var ] )

实例

system('asterisk -vvvvvvvvvvvc');

system()是一样的函数C的,它执行给定的命令和输出结果的版本。该system()的调用也尝试自动刷新网页服务器的输出缓冲器在每个输出
行如果PHP运行作为服务器模块。如果你需要执行一个命令,并已全部通过直接从背面没有任何干扰的命令数据,使用passthru()函数。

$last_line = system('ls', $retval);

function my_exec($cmd, $input='') 
         {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes); 
          fwrite($pipes[0], $input);fclose($pipes[0]); 
          $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]); 
          $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]); 
          $rtn=proc_close($proc); 
          return array('stdout'=>$stdout, 
                       'stderr'=>$stderr, 
                       'return'=>$rtn 
                      ); 
         } 
var_export(my_exec('echo -e $(</dev/stdin) | wc -l', 'h\nel\nlo'));
实例三
$cmd = "date";
   $output = system($cmd); 
   printf("System Output: $output ");
   exec($cmd, $results); 
   printf("Exec Output: {$results[0]} ");

php调用linux命令的权限问题


你可以使用定时任务执行你要调用的php,这时的权限就是root,
php通过函数system()调用系统命令


php一般是以apache用户身份去执行的,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的
权限,而apache属于这个组就可以改写该目录下所有文件的权限,当然,属组最好不要是root,你可以为该文件夹改个其它普通用户组。

改apache/php的运行用户方法不安全

第2个回答  2010-03-11
<?php // 说明:摘录自 User manager for PureFTPd 的权限显示函数 // 整理:http://www.CodeBit.cn function DisplayFilePermissions($Mode) { // Determine Type if ($Mode & 0x1000) { $Type = 'p'; // FIFO pipe } else if ($Mode & 0x2000) { $Type = 'c'; // Character special } else if ($Mode & 0x4000) { $Type = 'd'; // Directory } else if ($Mode & 0x6000) { $Type = 'b'; // Block special } else if ($Mode & 0x8000) { $Type = '-'; // Regular } else if ($Mode & 0xA000) { $Type = 'l'; // Symbolic Link } else if ($Mode & 0xC000) { $Type = 's'; // Socket } else { $Type = 'u'; // UNKNOWN } // Determine permissions $Owner['read'] = ($Mode & 00400) ? 'r' : '-'; $Owner['write'] = ($Mode & 00200) ? 'w' : '-'; $Owner['execute'] = ($Mode & 00100) ? 'x' : '-'; $Group['read'] = ($Mode & 00040) ? 'r' : '-'; $Group['write'] = ($Mode & 00020) ? 'w' : '-'; $Group['execute'] = ($Mode & 00010) ? 'x' : '-'; $World['read'] = ($Mode & 00004) ? 'r' : '-'; $World['write'] = ($Mode & 00002) ? 'w' : '-'; $World['execute'] = ($Mode & 00001) ? 'x' : '-'; // Adjust for SUID, SGID and sticky bit if ($Mode & 0x800) $Owner['execute'] = ($Owner['execute'] == 'x') ? 's' : 'S'; if ($Mode & 0x400) $Group['execute'] = ($Group['execute'] == 'x') ? 's' : 'S'; if ($Mode & 0x200) $World['execute'] = ($World['execute'] == 'x') ? 't' : 'T'; return $Type . $Owner['read'] . $Owner['write'] . $Owner['execute'] . $Group['read'] . $Group['write'] . $Group['execute'] . $World['read'] . $World['write'] . $World['execute']; } $perms = fileperms( '/etc/passwd' ); echo DisplayFilePermissions($perms); ?>
第3个回答  2010-03-11
一种方法,修改文件权限,允许去php程序去修改
另外一种方法,修改php运行程序的执行用户,
第4个回答  2010-03-11
php 用户 访问文件 是 apache 用户 的权限!你看下 那个文件 是怎么样的权限设置
相似回答