【问题标题】:Re-assign host access permission to MySQL user将主机访问权限重新分配给 MySQL 用户
【发布时间】:2010-12-27 04:55:26
【问题描述】:

我有几千个 MySQL 用户都设置为允许从特定主机访问。问题是现在我将拥有两台机器(将来会更多),它们需要使用同一个帐户来访问它们的每个数据库。

我想要一种快速简便(尽可能自动化)的方式来运行和修改每个用户帐户的主机部分以适应内部网络通配符。例如:

'bugsy'@'internalfoo' 可以访问 'bugsy' 数据库。

我现在想允许从内部网络的任何地方进行错误访问

'bugsy'@'10.0.0.%' 可以访问 'bugsy' 数据库。

【问题讨论】:

  • 我想知道这在 serverfault.com 上是否会有更多的运气
  • 谢谢 T.J.我也会检查 serverfault.com(不知道!)
  • 既然您已经在此处发布了此问题,我建议您将其关闭。它与编程无关,更多的是服务器故障。

标签: mysql permissions


【解决方案1】:

我没有必要这样做,所以带着一粒盐和“测试、测试、测试”的巨大帮助。

如果(在安全受控的测试环境中)您直接修改mysql.user 和可能mysql.db 表中的Host 列,会发生什么情况? (例如,使用 update 语句。)我不认为 MySQL 使用用户的主机作为密码编码的一部分(PASSWORD 函数不建议这样做),但你必须尝试它确定。您可能需要发出FLUSH PRIVILEGES 命令(或停止并重新启动服务器)。

对于某些存储引擎(例如 MyISAM),您可能还需要检查/修改.frm 文件中用户创建的任何视图。 .frm 文件存储定义者,包括定义者的主机。 (我已经必须这样做,当在主机之间移动数据库时,由于配置错误导致错误的主机被记录...)

【讨论】:

  • 感谢您的回复 T.J.我尝试修改 mysql.user 和 mysql.db 的用户记录,尽管更改似乎执行得很好,但除了允许用户访问的原始主机之外,我仍然无法从内部网络上的任何主机连接。我不确定如何修改 .frm 文件(它们是二进制文件)...我假设您的意思是 mysql/ 目录中的文件(而不是用户有权访问的适用数据库)。不过,我很犹豫是否直接在文件中乱搞。在 MySQL 中真的没有支持的方法吗?这似乎是相当短视的。
  • 更改表后,我希望您需要执行FLUSH PRIVILEGES 命令(请参阅dev.mysql.com/doc/refman/5.0/en/flush.html),或者当然,停止并启动服务。我正在谈论的frm 文件将用于数据库中的视图,因此将在数据库子目录中。我熟悉的 MyISAM 存储引擎是纯文本; YMMV。
  • “家庭”?我的打字技能真的变差了……;)
  • 作为参考,解决方案是: UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root';刷新特权;
【解决方案2】:

供参考,解决方法是:

UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root';
UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root';
FLUSH PRIVILEGES;

【讨论】:

  • 好买卖! (是的,将其作为答案发布比原始评论要好得多。我当时错过了您的评论......)
  • 这并没有正确地重新分配所有权限,@pedrocheckos 下面的回答正确地执行了所需的操作。
【解决方案3】:

更一般的答案是

UPDATE mysql.user SET host = {newhost} WHERE user = {youruser}

【讨论】:

    【解决方案4】:

    接受的答案只是重命名了用户,但权限被留下了。

    我建议使用:

    RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5';
    

    根据MySQL documentation

    RENAME USER 使旧用户拥有的权限成为新用户拥有的权限。

    【讨论】:

    • 我收到ERROR 1396 (HY000): Operation RENAME USER failed for 'foo'@'%'
    • foo 是一个示例 - 将 foo 替换为数据库中的实际用户名
    • 我已经改成用户名了。 'foo' 只是我和你的别名。
    • 这应该是公认的答案,因为权限不会保持更新hostname
    • 这正是我正在寻找的目的。即只需将主机从 % 更新为 localhost 并保持所有权限不变。我还要说这应该是公认的答案。
    【解决方案5】:

    我获得权限失败的类似问题。在我的设置中,我只使用 SSH。所以我为纠正这个问题所做的是

    sudo MySQL
    SELECT User, Host FROM mysql.user WHERE Host <> '%';
    MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
    +-------+-------------+
    | User  | Host        |
    +-------+-------------+
    | root  | 169.254.0.% |
    | foo   | 192.168.0.% |
    | bar   | 192.168.0.% |
    +-------+-------------+
    4 rows in set (0.00 sec)
    

    我需要将这些用户移至“本地主机”。所以我发出了以下内容:

    UPDATE mysql.user SET host = 'localhost' WHERE user = 'foo';
    UPDATE mysql.user SET host = 'localhost' WHERE user = 'bar';
    

    运行 SELECT User, Host FROM mysql.user WHERE Host '%';再次,我们看到:

    MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
    +-------+-------------+
    | User  | Host        |
    +-------+-------------+
    | root  | 169.254.0.% |
    | foo   | localhost   |
    | bar   | localhost   |
    +-------+-------------+
    4 rows in set (0.00 sec)
    

    然后我又可以正常工作了。希望对某人有所帮助。

    $ mysql -u foo -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 74
    Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    

    【讨论】:

      【解决方案6】:

      我收到与RENAME USER 相同的错误,并且当前接受的解决方案未涵盖 GRANTS:

      最可靠的方法似乎是为旧用户运行SHOW GRANTS,找到/替换您想要更改的关于用户名和/或主机的内容并运行它们,然后最后运行DROP USER旧用户。不要忘记运行FLUSH PRIVILEGES(最好在添加新用户的授权后运行它,测试新用户,然后删除旧用户并再次刷新以进行良好的测量)。

          > 显示 'olduser'@'oldhost' 的授权;
          +-------------------------------------------------- ----------------------------------+
          | olduser@oldhost 的赠款 |
          +-------------------------------------------------- ----------------------------------+
          |将 *.* 上的使用权限授予由密码 '*PASSHASH' 识别的 'olduser'@'oldhost' |
          | GRANT SELECT ON `db`.* TO 'olduser'@'oldhost' |
          +-------------------------------------------------- ----------------------------------+
          2 行(0.000 秒)
      
          > 将 *.* 上的使用权限授予 'newuser'@'newhost' 由密码 '*SAME_PASSHASH' 识别;
          查询正常,0 行受影响(0.006 秒)
      
          > GRANT SELECT ON `db`.* TO 'newuser'@'newhost';
          查询正常,0 行受影响(0.007 秒)
      
          > 删除用户'olduser'@'oldhost';
          查询正常,0 行受影响(0.016 秒)
      

      【讨论】:

        猜你喜欢
        • 2012-05-23
        • 2016-07-10
        • 2011-12-24
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2010-10-27
        相关资源
        最近更新 更多