【问题标题】:Issue with mysqldump returning Permission deniedmysqldump返回权限被拒绝的问题
【发布时间】:2020-12-31 15:38:06
【问题描述】:

我正在尝试使用mysqldump 命令从 PHP 为 MySQL 设置备份系统,但我遇到了权限被拒绝错误。 我在 MacOS Catalina 10.15.6 上,使用系统 PHP 和 Homebrew mysql@57。

经过多次尝试,我可以在终端中重现此问题。如果我以我的身份运行该命令,它可以正常工作并且正确创建了备份文件,但是当我以_www 运行它时,我得到了错误。

这行得通:

% mysqldump --defaults-extra-file="crd" --extended-insert mydb > backup.sql.gz

这不起作用:

% sudo -u _www mysqldump --defaults-extra-file="crd" --extended-insert mydb > backup.sql.gz
sudo: unable to execute /usr/local/opt/mysql@5.7/bin/mysqldump: Permission denied

我检查了mysqldump可以被用户、组和其他人执行:

% ls -la /usr/local/opt/mysql@5.7/bin | grep mysqldump                                     
-r-xr-xr-x   1 jbogdani  staff   3853364 Aug 17 21:22 mysqldump

在命令中提供用户名和密码的其他尝试也失败了。

【问题讨论】:

  • 为什么是sudo -u _www?那不是真正的用户,只是为了设置权限。
  • 您的用户名和密码错误。请仔细检查这些:)
  • 您可以尝试使用mysqldump 的完整路径,例如通过终端执行/usr/local/opt/mysql@5.7/bin/mysqldump 吗?
  • @tadman 因为当我尝试通过运行为 _www 的 Apache 从 PHP 运行命令时,我得到了错误only。当我从我的用户运行它时,不会引发错误。

标签: mysql bash macos homebrew


【解决方案1】:

mysqldump 需要 mysql 用户 root 的密码。如果您不提供该密码,它将不起作用,sudo 或不使用 sudo。

不要使用sudo -u _www,而是使用当前的mysql用户帐户执行它。

if you need further reading

【讨论】:

    【解决方案2】:

    您需要在输出中使用完整路径。

    您无权写入 /usr/local/opt/mysql@5.7/bin/backup.sql.gz。将目标备份存档的完整路径指定到另一个目录

    【讨论】:

    • 我在这里报告了脚本的简化版本,带有路径。目标路径和脚本路径都是正确的,如果从我的用户运行,脚本可以正常工作。失败的是 _www 用户。
    • 您是否尝试指定其他路径?例如 /tmp/backup.tar.gz?问题是用户_www没有权限写入当前用户主目录(/root/backup.tar.gz)
    • 其实dump文件正在创建,但是是空的
    【解决方案3】:

    我想你会发现 _www 用户在某种程度上受到了限制。它可能没有有效的 shell,它可能被锁定,或者可能有 apparmour/selinux 限制阻止它运行。

    检查 dmesg 和 /var/log/secure 的输出以获取有用的日志,否则使用 usermod 检查和更改用户的 shell 和状态以查找和隔离问题。

    不过,请确保在生产中执行任何操作之前考虑安全后果。

    【讨论】:

    • 我猜你是对的,但我的系统上没有这样的日志文件:/var/log/secure。我确定 php 正在使用bin/sh shell。我还尝试更改 shell 并在shmysqldump --def...sudo -u _www mysqldump --def...)中启动这两个命令,获得与上述相同的结果。
    • 您应该能够通过一些快速的互联网搜索和您现有的知识(例如您运行的发行版)找到您的 /var/log/secure 版本。请记住,用户需要有一个有效的默认 shell 才能以交互方式运行命令 - 运行 'grep _www /etc/passwd' 并查看最后一个值是什么来检查它。运行“man passwd”,并阅读 --status 选项以了解它是否已锁定。有很多事情可能会阻止用户运行命令 - 谷歌搜索它们很容易,战斗首先要知道这是一个问题。
    猜你喜欢
    • 2015-01-28
    • 2015-05-24
    • 2021-08-30
    • 1970-01-01
    • 2011-07-11
    • 2011-03-09
    • 2012-12-29
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多