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

Php 在没有目录777许可的托管服务器上使用mysqldump,php,mysql,mysqldump,database-backups,Php,Mysql,Mysqldump,Database Backups,我试图创建一个由cron访问的php文件。此文件将创建其连接到的数据库的备份。为此,它使用PHP的exec()和mysqldump 这一切都可以正常工作,但是,只有当它正在编写的目录具有权限时,它才可以工作0777。我用不同的权限进行了测试,似乎只有世界数字需要是7。(或者至少我认为写和读) 问题是,我不希望除了服务器之外的任何人都能看到这个备份,因为它包含用户信息!(即使此信息已加密) 我尝试在目录上使用chmod,使其仅在写入文件时为0777,但无法更改权限,这可能是另一个安全风险 有没有办

我试图创建一个由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]);
  }
}
?>


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

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

您的脚本必须以目录所有者的身份运行,或者能够访问该所有者来运行脚本。由于您需要在多台服务器上完成此操作,您应该与系统管理员联系,让他们进行设置


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

您的脚本必须以目录所有者的身份运行,或者可以使用该所有者的身份运行脚本。由于您需要在多台服务器上完成此操作,您应该与系统管理员联系,让他们进行设置



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

好的,我想我应该使用
chown()
。我将如何继续这样做。这个文件可能会出现在很多不同的服务器上,我担心在很多情况下,所有者必须是不同的。理想情况下,您可以在每台服务器上创建一个备份用户,以备份用户的身份执行此文件,然后写入备份用户的主目录。理想情况下,您应该有一个ansible脚本,用于上载php文件、创建备份用户及其主目录、安装cron作业等。其工作方式是:此代码是cms的一部分。cms将安装此文件以及其他文件,并可能设置cron作业。我如何设置用户并让他们只使用php运行此文件。我将无法访问服务器adminpanel,并且希望它完全没有用户的交互。那么,我认为没有一个解决方案可以通用和安全地执行此操作。如果您不控制要部署到的服务器,那么依赖
exec
mysqldump
都可用也是相当危险的。这里似乎就是这样。。。用纯php编写这个函数,使用普通查询生成备份文件怎么样。这意味着我不需要同时使用
exec
mysqldump
。你觉得这样行吗?好吧,我想我应该用
chown()
来做这个。我将如何继续这样做。这个文件可能会出现在很多不同的服务器上,我担心在很多情况下,所有者必须是不同的。理想情况下,您可以在每台服务器上创建一个备份用户,以备份用户的身份执行此文件,然后写入备份用户的主目录。理想情况下,您应该有一个ansible脚本,用于上载php文件、创建备份用户及其主目录、安装cron作业等。其工作方式是:此代码是cms的一部分。cms将安装此文件以及其他文件,并可能设置cron作业。我如何设置用户并让他们只使用php运行此文件。我将无法访问服务器adminpanel,并且希望它完全没有用户的交互。那么,我认为没有一个解决方案可以通用和安全地执行此操作。如果您不控制要部署到的服务器,那么依赖
exec
mysqldump
都可用也是相当危险的。这里似乎就是这样。。。用纯php编写这个函数,使用普通查询生成备份文件怎么样。这意味着我不需要同时使用
exec
mysqldump
。你认为这能起作用吗?每个用户都有自己的CROTAB,只是确保那个目录的所有者是运行CRON作业的所有者。考虑在BASH中重写这个脚本以移除PHP依赖性。或者,如果您想将其保存在PHP中,请确保使用backup正在根目录上运行的函数对插值变量($user、$pass和$filename)进行转义。如果$filename定义中有硬编码路径,请尝试传递$filename='note\u db\u backup'.date('G\u a\u m\u d\u y')..sql';没有slash@WouterH因为这将停留在PHP中,谢谢!即使这些值不应该是这样的,为了安全起见,我还是会执行它@你说得对。这就是最初的情况,所以这不是问题所在。谢谢你指出了这一点。每个用户都有自己的CROTAB,只是确保那个目录的所有者是运行CRON作业的所有者。考虑在BASH中重写这个脚本以移除PHP依赖关系。或者,如果您想将其保存在PHP中,请确保使用backup正在根目录上运行的函数对插值变量($user、$pass和$filename)进行转义。你有