当前位置: 首页 > 面试题库 >

尝试授予特权时,拒绝用户'root'@'localhost'的访问。如何授予特权?

谢洛城
2023-03-14
问题内容

我看过许多类似的问题,因此表明我已经检查了基础知识。当然,这并不意味着我没有错过任何显而易见的东西。:-)

我的问题是:为什么我拒绝具有特权的用户访问权限,而我却已经在其中输入密码并被授予访问权限?(为了完整起见,我尝试输入错误的密码只是为了确保MySQL客户端在程序启动时拒绝我访问。)

背景:

通过ssh登录到运行MySQL服务器的计算机的外壳,我以root用户身份登录:

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

太棒了 我对类似问题的答案的阅读表明,我应该确保特权与授予表中的权限保持最新

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql>

接下来,请确保我是我认为的我:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

…真的 真的很 确定:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql>

到目前为止,一切都很好。现在我有什么特权?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

现在有点难以理解,所以让我们尝试这种方式(您还将看到有一个非本地“ root”用户):

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

太棒了!MySQL认为我是root @ localhost,而root @ localhost拥有所有这些特权。这意味着我应该能够做我想做的事,对不对?

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

我怎么能搞砸这个基本的东西?

旁注:对于任何想建议我没有名为root的用户都具有所有特权的用户,这很好,一旦我可以给另一个用户一些特权,我将考虑做一些事情。

谢谢!


问题答案:

注意输出

SHOW GRANTS FOR 'root'@'localhost';

没有说“ ALL PRIVILEGES”,而是不得不说出root @ localhost的含义。

授予所有特权将失败,因为用户无法授予他/她没有的特权,并且服务器似乎认为这里不存在某些东西…

现在,接下来缺少什么呢?

在我的系统上,我得到以下信息:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

5.5中还有一些新表,例如mysql.proxies_user:确保您拥有它们。

安装全新的mysql服务器实例时,安装脚本将创建具有适当结构的所有mysql。*表。

从旧版本升级时,请确保使用正确的升级过程(mysql_upgrade),它将添加缺少的表/列。

这只是一个猜测,但似乎该实例的mysql_upgrade未完成,导致出现了这种现象。



 类似资料:
  • 问题内容: 想象有一个学生表 student(id,name,city), 我想创建一个用户A,并且只授予更新id = 10的记录的权限。 我试过了,它不起作用。 问题答案: 不是只有一行, 而是包含 一行 的视图将依次更新实际的实际表。 这可以通过每个学生的特定表视图来完成(是的,这将是一个混乱的数据库结构)。仅在选择/更新之后才授予该用户对该视图的访问权限,并且主键将不可更新。当更新视图时,主

  • 问题内容: 我已经创建了数据库,例如’mydb’。 现在,我可以从任何地方登录数据库,但是无法创建表。 如何授予该数据库和(将来)表的所有特权。我无法在“ mydb”数据库中创建表。我总是得到: 问题答案: 这就是我创建“超级用户”特权的方式(尽管我通常会指定一个主机)。 虽然此答案可以解决访问问题,但可以创建一个MySQL用户,该用户可以编辑其他用户的权限。 使用GRANT OPTION特权,您

  • 已试过 获取 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,了解第1行“标识由'root'WITH GRANT option”附近使用的正确语法。 注意:在以前的版本中尝试时同样有效。 也试过 获取 错误1410(42000):不允许创建具有授权的用户 MySQL(8.0.11.0)用户名/密码是root/root。

  • 本文向大家介绍oauth 授权码授予,包括了oauth 授权码授予的使用技巧和注意事项,需要的朋友参考一下 示例 第1步 第2步 资源

  • 我不断收到这个错误。 我使用的是mySQL Workbench,我发现root的模式特权为空。根本没有特权。 我在我的服务器所使用的平台上遇到了麻烦,这是一个突如其来的问题。 root@127.0.0.1显然有很多访问权限,但我是以这个身份登录的,但它只是分配给localhost-localhost没有特权。 我已经做了一些事情,如,等,但没有发现成功的从它或互联网。 我如何恢复root的访问权限

  • 我正在尝试制作一个使用数据库的java应用程序。我已经下载了db2并创建了一个用户'student'。我的程序中有以下几行: 显然,我几乎不知道我在做什么,我不知道如何给予“学生”必要的特权。也就是说,我不知道什么用户可以给他特权,因为我从来没有创建过另一个用户。我看到有人提到过'db2admin'(我使用的是windows),但我不知道该如何处理这段信息。我不知道如何检查现有用户,也不知道对db