在没有目录777 permision的托管服务器上使用mysqldump

时间:2016-07-19 14:07:48

标签: php mysql mysqldump database-backups

我试图创建一个cron将访问的php文件。此文件将创建与其连接的数据库的备份。为此,它使用PHP的exec()mysqldump

这一切都很好,但是,只有当它正在编写的目录具有权限0777时,它才有效。我已经使用不同的权限进行了测试,似乎只有世界数字需要为7.(或者至少写入和阅读我认为)

问题是,除了服务器之外,我不希望任何人能够看到此备份,因为它包含用户信息! (即使此信息已加密) 我尝试在目录上使用chmod仅在编写文件时使其为0777,但它无法更改权限,这可能是另一个安全风险。

有没有办法将此文件写入具有0700权限的目录?或者还有其他方式我现在没有看到......

源代码:

<?php
backup('notecms', 'root');
function backup($name, $user, $pass = NULL) {
  $filename='/note_db_backup_'.date('G_a_m_d_y').'.sql';
  if ($pass == NULL) {
    $result=exec('mysqldump notecms --single-transaction --user='. $user .' -r '. $filename . ' 2>&1', $output, $return_var);
  }
  else {
    $result=exec('mysqldump notecms --single-transaction --user='. $user .' -p='. $pass .' -r '. $filename . ' 2>&1', $output, $return_var);
  }
  if($return_var == 0){
    //return 0;
    if (!chmod($filename, 0600)) {
      die('could not change backup permissions');
    }
    deleteold();
  }
  else {
    print_r($output);
    global $backup_output;
    $backup_output = $output;
    //return 1;
  }
}

function deleteold() {
  $filecount = count(scandir("../backup/")) - 2;
  if ($filecount > 5) {
    $files = glob( '../backup/*' );
    array_multisort(
    array_map( 'filemtime', $files ),
    SORT_NUMERIC,
    SORT_ASC,
    $files
    );
    unlink($files[0]);
  }
}
?>

2 个答案:

答案 0 :(得分:3)

没有理由将权限设为0777。您需要执行该脚本的用户具有对该目录的读/写访问权限,因此请确保该用户拥有该目录,您只需要0700

答案 1 :(得分:1)

您的脚本必须作为目录的所有者运行,或者能够sudo到该所有者以运行脚本。当您需要在许多服务器上完成时,您应该与系统管理员联系,让他们进行设置。

他们可以将其设置为仅适用于该任务,并且可能有一种方法将其推送到所有服务器。