it-swarm.asia

الخلية: عرض المنح لجميع المستخدمين

MySQL's SHOW GRANTS يظهر أذونات المستخدم الحالي.

هل هناك طريقة لتسجيل الدخول كجذر وإظهار أذونات جميع المستخدمين؟

97
Adam Matan

لا شيء مدمج. أمامك خياران:

  • استخدم طريقة عرض common_schemasql_show_grants . على سبيل المثال ، يمكنك الاستعلام:

    SELECT sql_grants FROM common_schema.sql_show_grants;
    

    أو يمكنك الاستعلام عن مستخدمين معينين ، على سبيل المثال:

    SELECT sql_grants FROM common_schema.sql_show_grants WHERE user='app';
    

    لتثبيت common_schema ، اتبع التعليمات هنا .

    تنويه: أنا مؤلف هذه الأداة.

  • استخدم أدوات Percona Toolkit pt-show-grants ، على سبيل المثال:

    pt-show-grants --Host localhost --user root --ask-pass
    

في كلتا الحالتين ، يمكنك طلب الأمر GRANT أو الأمر REVOKE (المعاكس).

تتطلب الحالة الأولى تثبيت مخطط ، وتتطلب الحالة الأخيرة تثبيت مخطوطات Perl + تبعيات.

47
Shlomi Noach
select * from information_schema.user_privileges;

تعديل:

كما ذكر شلومي نواش:

ولا تسرد الامتيازات الخاصة بقاعدة البيانات ، والجدول ، والعمود ، والروتينية. لذلك ، لا تظهر المنحة GRANT SELECT ON mydb. * TO myuser @ localhost في information_schema.user_privileges. يجمع حل Common_schema المعروض أعلاه البيانات من امتيازات المستخدم والجداول الأخرى لمنحك الصورة الكاملة.

91
rumburak

هذا الجزء من لينكس شل يتكرر على جميع مستخدمي MySQL ويقوم SHOW GRANTS لكل منهم:

mysql --silent --skip-column-names --execute "select concat('\'',User,'\'@\'',Host,'\'') as User from mysql.user" | sort | \
while read u
 do echo "-- $u"; mysql --silent --skip-column-names --execute "show grants for $u" | sed 's/$/;/'
done

يعمل بشكل أفضل إذا كان بإمكانك الاتصال بـ MySQL بدون كلمة مرور.

يتم تنسيق الإخراج بحيث يمكن تشغيله في MySQL Shell. تنبيه: يحتوي الإخراج أيضًا على أذونات مستخدم الجذر MySQL وكلمة المرور! قم بإزالة هذه الأسطر إذا كنت لا تريد تغيير مستخدم MySQL الجذر.

13
mleu

بطانة واحدة (تغيير -uroot إلى -u$USER_NAME للاستخدام مع مستخدم آخر) في باش يونيكس (بسبب العلامات الخلفية):

mysql -uroot -p -sNe"`mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;"`"

أو بدون backticks ومع تضمين كلمة المرور (المسافة أمام الأمر تستثنيها من Bash history في Ubuntu):

 mysql -uroot -p"$PASSWORD" -sNe"$(mysql -uroot -p"$PASSWORD" -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;")"

في Windows:

mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',Host,'\';') FROM mysql.user;" > grants.sql
mysql -uroot -p < grants.sql
del grants.sql
10
inemanja

select * from mysql.user;

يمكن أن يمنحك قائمة المستخدمين والامتيازات المعينة لكل منهم ، ويتطلب الوصول إلى mysql.user الجدول بالرغم من ذلك و root المستخدم لديه.

9
Mahesh Patil

إذا كان يمكنك تشغيل عبارات SELECT التالية بدون خطأ:

/* User-Specific Grants     */   SELECT * FROM mysql.user;
/* Database-Specific Grants */   SELECT * FROM mysql.db;
/* Table-Specific Grants    */   SELECT * FROM mysql.tables_priv;
/* Column-Specific Grants   */   SELECT * FROM mysql.columns_priv;

ثم لا تتردد في استخدام الكود التالي (أدناه) ، مكتوبًا في بناء جملة .sql.

لقد صممت هذا الاستعلام في محاولة لإعادة إنشاء عبارات GRANT لجميع الأذونات الحالية (للصيانة المتكررة أثناء ترحيل قاعدة البيانات). هناك بعض المشكلات التي يجب حلها ، مثل ربط المستخدم بكلمة المرور ، ولكن نظرًا لأننا نقوم بتحديث كلمات المرور بشكل متكرر ، فإن ذلك لم يكن في نطاق هذا المشروع.

/* Get All Grants/Permissions for MySQL Instance */

/* [Database.Table.Column]-Specific Grants */
SELECT
    CONCAT("`",gcl.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gcl.Table_name,"`") AS 'Table(s) Affected',
    gcl.User AS 'User-Account(s) Affected',
    IF(gcl.Host='%','ALL',gcl.Host) AS 'Remote-IP(s) Affected',
    CONCAT("GRANT ",UPPER(gcl.Column_priv)," (",GROUP_CONCAT(gcl.Column_name),") ",
                 "ON `",gcl.Db,"`.`",gcl.Table_name,"` ",
                 "TO '",gcl.User,"'@'",gcl.Host,"';") AS 'GRANT Statement (Reconstructed)'
FROM mysql.columns_priv gcl
GROUP BY CONCAT(gcl.Db,gcl.Table_name,gcl.User,gcl.Host)
/* SELECT * FROM mysql.columns_priv */

UNION

/* [Database.Table]-Specific Grants */
SELECT
    CONCAT("`",gtb.Db,"`") AS 'Database(s) Affected',
    CONCAT("`",gtb.Table_name,"`") AS 'Table(s) Affected',
    gtb.User AS 'User-Account(s) Affected',
    IF(gtb.Host='%','ALL',gtb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",UPPER(gtb.Table_priv)," ",
        "ON `",gtb.Db,"`.`",gtb.Table_name,"` ",
        "TO '",gtb.User,"'@'",gtb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.tables_priv gtb
WHERE gtb.Table_priv!=''
/* SELECT * FROM mysql.tables_priv */

UNION

/* Database-Specific Grants */
SELECT
    CONCAT("`",gdb.Db,"`") AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gdb.User AS 'User-Account(s) Affected',
    IF(gdb.Host='%','ALL',gdb.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        'GRANT ',
        CONCAT_WS(',',
            IF(gdb.Select_priv='Y','SELECT',NULL),
            IF(gdb.Insert_priv='Y','INSERT',NULL),
            IF(gdb.Update_priv='Y','UPDATE',NULL),
            IF(gdb.Delete_priv='Y','DELETE',NULL),
            IF(gdb.Create_priv='Y','CREATE',NULL),
            IF(gdb.Drop_priv='Y','DROP',NULL),
            IF(gdb.Grant_priv='Y','GRANT',NULL),
            IF(gdb.References_priv='Y','REFERENCES',NULL),
            IF(gdb.Index_priv='Y','INDEX',NULL),
            IF(gdb.Alter_priv='Y','ALTER',NULL),
            IF(gdb.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
            IF(gdb.Lock_tables_priv='Y','LOCK TABLES',NULL),
            IF(gdb.Create_view_priv='Y','CREATE VIEW',NULL),
            IF(gdb.Show_view_priv='Y','SHOW VIEW',NULL),
            IF(gdb.Create_routine_priv='Y','CREATE ROUTINE',NULL),
            IF(gdb.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
            IF(gdb.Execute_priv='Y','EXECUTE',NULL),
            IF(gdb.Event_priv='Y','EVENT',NULL),
            IF(gdb.Trigger_priv='Y','TRIGGER',NULL)
        ),
        " ON `",gdb.Db,"`.* TO '",gdb.User,"'@'",gdb.Host,"';"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.db gdb
WHERE gdb.Db != ''
/* SELECT * FROM mysql.db */

UNION

/* User-Specific Grants */
SELECT
    "ALL" AS 'Database(s) Affected',
    "ALL" AS 'Table(s) Affected',
    gus.User AS 'User-Account(s) Affected',
    IF(gus.Host='%','ALL',gus.Host) AS 'Remote-IP(s) Affected',
    CONCAT(
        "GRANT ",
        IF((gus.Select_priv='N')&(gus.Insert_priv='N')&(gus.Update_priv='N')&(gus.Delete_priv='N')&(gus.Create_priv='N')&(gus.Drop_priv='N')&(gus.Reload_priv='N')&(gus.Shutdown_priv='N')&(gus.Process_priv='N')&(gus.File_priv='N')&(gus.References_priv='N')&(gus.Index_priv='N')&(gus.Alter_priv='N')&(gus.Show_db_priv='N')&(gus.Super_priv='N')&(gus.Create_tmp_table_priv='N')&(gus.Lock_tables_priv='N')&(gus.Execute_priv='N')&(gus.Repl_slave_priv='N')&(gus.Repl_client_priv='N')&(gus.Create_view_priv='N')&(gus.Show_view_priv='N')&(gus.Create_routine_priv='N')&(gus.Alter_routine_priv='N')&(gus.Create_user_priv='N')&(gus.Event_priv='N')&(gus.Trigger_priv='N')&(gus.Create_tablespace_priv='N')&(gus.Grant_priv='N'),
            "USAGE",
            IF((gus.Select_priv='Y')&(gus.Insert_priv='Y')&(gus.Update_priv='Y')&(gus.Delete_priv='Y')&(gus.Create_priv='Y')&(gus.Drop_priv='Y')&(gus.Reload_priv='Y')&(gus.Shutdown_priv='Y')&(gus.Process_priv='Y')&(gus.File_priv='Y')&(gus.References_priv='Y')&(gus.Index_priv='Y')&(gus.Alter_priv='Y')&(gus.Show_db_priv='Y')&(gus.Super_priv='Y')&(gus.Create_tmp_table_priv='Y')&(gus.Lock_tables_priv='Y')&(gus.Execute_priv='Y')&(gus.Repl_slave_priv='Y')&(gus.Repl_client_priv='Y')&(gus.Create_view_priv='Y')&(gus.Show_view_priv='Y')&(gus.Create_routine_priv='Y')&(gus.Alter_routine_priv='Y')&(gus.Create_user_priv='Y')&(gus.Event_priv='Y')&(gus.Trigger_priv='Y')&(gus.Create_tablespace_priv='Y')&(gus.Grant_priv='Y'),
                "ALL PRIVILEGES",
                CONCAT_WS(',',
                    IF(gus.Select_priv='Y','SELECT',NULL),
                    IF(gus.Insert_priv='Y','INSERT',NULL),
                    IF(gus.Update_priv='Y','UPDATE',NULL),
                    IF(gus.Delete_priv='Y','DELETE',NULL),
                    IF(gus.Create_priv='Y','CREATE',NULL),
                    IF(gus.Drop_priv='Y','DROP',NULL),
                    IF(gus.Reload_priv='Y','RELOAD',NULL),
                    IF(gus.Shutdown_priv='Y','SHUTDOWN',NULL),
                    IF(gus.Process_priv='Y','PROCESS',NULL),
                    IF(gus.File_priv='Y','FILE',NULL),
                    IF(gus.References_priv='Y','REFERENCES',NULL),
                    IF(gus.Index_priv='Y','INDEX',NULL),
                    IF(gus.Alter_priv='Y','ALTER',NULL),
                    IF(gus.Show_db_priv='Y','SHOW DATABASES',NULL),
                    IF(gus.Super_priv='Y','SUPER',NULL),
                    IF(gus.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
                    IF(gus.Lock_tables_priv='Y','LOCK TABLES',NULL),
                    IF(gus.Execute_priv='Y','EXECUTE',NULL),
                    IF(gus.Repl_slave_priv='Y','REPLICATION SLAVE',NULL),
                    IF(gus.Repl_client_priv='Y','REPLICATION CLIENT',NULL),
                    IF(gus.Create_view_priv='Y','CREATE VIEW',NULL),
                    IF(gus.Show_view_priv='Y','SHOW VIEW',NULL),
                    IF(gus.Create_routine_priv='Y','CREATE ROUTINE',NULL),
                    IF(gus.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
                    IF(gus.Create_user_priv='Y','CREATE USER',NULL),
                    IF(gus.Event_priv='Y','EVENT',NULL),
                    IF(gus.Trigger_priv='Y','TRIGGER',NULL),
                    IF(gus.Create_tablespace_priv='Y','CREATE TABLESPACE',NULL)
                )
            )
        ),
        " ON *.* TO '",gus.User,"'@'",gus.Host,"' REQUIRE ",
        CASE gus.ssl_type
            WHEN 'ANY' THEN
                "SSL "
            WHEN 'X509' THEN
                "X509 "
            WHEN 'SPECIFIED' THEN
                CONCAT_WS("AND ",
                    IF((LENGTH(gus.ssl_cipher)>0),CONCAT("CIPHER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_issuer)>0),CONCAT("ISSUER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                    IF((LENGTH(gus.x509_subject)>0),CONCAT("SUBJECT '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL)
                )
            ELSE "NONE "
        END,
        "WITH ",
        IF(gus.Grant_priv='Y',"GRANT OPTION ",""),
        "MAX_QUERIES_PER_HOUR ",gus.max_questions," ",
        "MAX_CONNECTIONS_PER_HOUR ",gus.max_connections," ",
        "MAX_UPDATES_PER_HOUR ",gus.max_updates," ",
        "MAX_USER_CONNECTIONS ",gus.max_user_connections,
        ";"
    ) AS 'GRANT Statement (Reconstructed)'
FROM mysql.user gus
WHERE gus.Password != ''
/* SELECT * FROM mysql.user gus */

/* TODO: */
/* SELECT * FROM mysql.Host ghs */
/* SELECT * FROM mysql.procs_priv gpr */

يسعدنا الرد/التحقق من أي أسئلة أو استفسارات

4
Cavallo

هذا سوف يمنحك رؤية أفضل ...

mysql> select Host, Db, User, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv from mysql.db limit 1;
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
| Host | Db   | User | Insert_priv | Update_priv | Delete_priv | Create_tmp_table_priv | Alter_priv |
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
| %    | test |      | Y           | Y           | Y           | Y                     | Y          |
+------+------+------+-------------+-------------+-------------+-----------------------+------------+
1 row in set (0.00 sec)
2
Mansur Ali

الامر SHOW GRANTS [FOR user] قد تظهر أي مستخدم تريده. انظر هنا لمزيد من التفاصيل.

1
Eugen Konkov

كما هو مذكور في هذه الإجابة ، يمكنك تشغيل مجموعة الأوامر التالية لسرد الامتيازات الخاصة بقاعدة البيانات ، والجدول ، والعمود ، والروتيني لجميع المستخدمين. لاحظ أنك تحتاج إلى تشغيل هذا من Shell ، وليس من موجه أوامر MySQL.

mysql -u root --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql -u root --skip-column-names -A

ميزة هذا النهج هو أنك لست بحاجة إلى تثبيت برامج إضافية.

1
billyw

إذا كنت تدير قواعد البيانات كثيرًا ، فمن المحتمل أن ترغب في الاحتفاظ بامتيازات ضيقة. يمكنك استخدام الإجراء المخزن لتشغيل الفحص بسرعة. هذا المثال يعمل في mariadb قد يحتاج إلى قرص للعمل مع نسخة mysql القياسية.

باستخدام إجابة منصور على مع تعديل بسيط للأعمدة وإضافة بعض الترتيب لتنظيم الإخراج بشكل أفضل.

باستخدام تسجيل دخول الجذر:

USE mysql;
DELIMITER //

CREATE PROCEDURE ShowPrivs(start, end)
BEGIN
    SELECT Db, User, Host, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv FROM mysql.db order by Db, Host, User ASC;
END;
//

DELIMITER ;

يمكنك تغيير الإجراء للتحقق من الجدول mysql.user بدلاً من ذلك.

الاستخدام ، باستخدام تسجيل دخول الجذر:

USE mysql;
CALL ShowPrivs();

لقد استخدمت منضدة mysql على Ubuntu لتشغيل جزء إجراء الإنشاء من هذه الإجابة.

جانبا وبعيدا عن الموضوع هنا ولكن ، يمكنك أيضًا أن يكون لديك إجراء لإظهار المضيفين أو المستخدمين غير المعروفين. مثال للمضيفين غير المعروفين:

USE mysql;

DELIMITER //
CREATE PROCEDURE `ShowUnknownHosts`(IN Hosts_String VARCHAR(200))
BEGIN
    SELECT user,Host FROM user
    WHERE FIND_IN_SET(Host, Hosts_String) = 0;
END//

DELIMITER ;

ملاحظة الاستخدام: قم بتوفير سلسلة من المضيفات مفصولة بفواصل بحيث يتم استخدام مجموعة واحدة فقط من '':

CALL ShowUnknownHosts('knownhost1,knownhost2');

يمكنك أيضًا جعل متغير العمود بتضمين معلمة أخرى في الإجراء واستدعائه باستخدام ShowUnknownHosts (user، 'user1، user2')؛ فمثلا.

0
Chris