mysql: सभी उपयोगकर्ताओं के लिए GRANTs दिखाएं


87

MySQL SHOW GRANTSवर्तमान उपयोगकर्ता की अनुमति दिखाता है।

क्या रूट के रूप में लॉग इन करने और सभी उपयोगकर्ताओं की अनुमति दिखाने का कोई तरीका है?

जवाबों:


45

कुछ भी नहीं बनाया। आपके पास हालांकि दो विकल्प हैं:

  • common_schema'S sql_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, यहां दिए गए निर्देशों का पालन करें

    अस्वीकरण: मैं इस उपकरण का लेखक हूं।

  • pt-show-grantsउदाहरण के लिए पर्कोना टूलकिट का उपयोग करें :

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

दोनों मामलों में आप GRANTकमांड या REVOKEविपरीत (विपरीत) कमांड के लिए पूछ सकते हैं ।

पहले मामले के लिए आवश्यक है कि आप एक स्कीमा स्थापित करें, बाद के लिए आवश्यक है कि आप पर्ल स्क्रिप्ट + निर्भरताएँ स्थापित करें।


11
क्या आप कृपया अधिक विवरण में बता सकते हैं कि आम_केम का sql_show_grants दृश्य का उपयोग कैसे करें? मुझे एक त्रुटि मिलती हैERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist
मार्टिन वेगाटर

2
@MartinVegter, क्या आपने common_schema स्थापित किया है? यहां डाउनलोड करें और इन निर्देशों का पालन करते हुए इंस्टॉल करें
श्लोमी नोआच

1
@ श्लोमीनेच, जब आप कहते हैं कि "कुछ भी नहीं बनाया गया है ..." क्या कोई त्रुटि है information_schema.user_privileges?
पचेरियर

2
क्षमा करें, लेकिन 'common_schema' जैसी कोई चीज नहीं है। यह मौजूद नहीं है।
ब्रेंडन बर्ड

2
लिंक sql_show_grants टूट गया
Cyzanfar

81
select * from information_schema.user_privileges;

संपादित करें:

जैसा कि श्लोमी नोआच ने बताया है:

यह डेटाबेस-विशिष्ट, तालिका-विशिष्ट, स्तंभ-विशिष्ट, नियमित-विशिष्ट विशेषाधिकार को सूचीबद्ध नहीं करता है। इसलिए, अनुदान mydb पर अनुदान का चयन करें। ऊपर प्रस्तुत आम_समेह समाधान आपको पूरी तस्वीर देने के लिए user_privileges और अन्य तालिकाओं से डेटा एकत्र करता है।


5
क्षमा करें, यह स्वीकृत उत्तर नहीं होना चाहिए। information_schema.user_privilegesकेवल उपयोगकर्ता-स्तरीय विशेषाधिकारों को सूचीबद्ध करता है, जैसे कि SUPER, RELOADइत्यादि SELECT। यह डेटाबेस-विशिष्ट, तालिका-अलग, स्तंभ-विशिष्ट, नियमित-विशिष्ट विशेषाधिकार को सूचीबद्ध नहीं करता है । वहाँ सामने, अनुदान GRANT SELECT ON mydb.* TO myuser@localhostकरता नहीं पर दिखाने information_schema.user_privilegescommon_schemaसे डेटा एकत्र करेगा ऊपर प्रस्तुत समाधान user_privilegesऔर अन्य तालिकाओं आप पूरी तस्वीर देने के लिए।
श्लोमी नोआच

11

यह लिनक्स खोल टुकड़ा सभी 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 शेल में चलाया जा सकता है। सावधानी: आउटपुट में MySQL रूट उपयोगकर्ता अनुमतियाँ और पासवर्ड भी शामिल हैं! यदि आप नहीं चाहते हैं कि MySQL रूट उपयोगकर्ता बदल जाए तो उन पंक्तियों को हटा दें।


6
आप इस बारे में कुछ विवरण जोड़ना चाह सकते हैं कि यह क्या करता है या कैसे यह प्रश्न का उत्तर देता है। बस कोड का एक गुच्छा प्रदर्शित करने से किसी को यह समझने में मदद नहीं मिलती है कि आपका समाधान क्यों काम करता है।
मैक्स वर्नन

मैं पासवर्ड कहां दे सकता हूं?
मियां असबत अहमद

एक पासवर्ड प्रदान करने के लिए एक विकल्प फ़ाइल या mysql कमांड के --password ध्वज का उपयोग किया जा सकता है ।
मलेउ

क्या सभी उपयोगकर्ताओं को अनुदान प्राप्त करने के लिए एक रूट पासवर्ड देना और क्वेरी चलाना संभव नहीं होगा?
मियां असबत अहमद

2
आप केवल एक कनेक्शन बनाने के लिए अनुरोधों को स्ट्रीम कर सकते हैं, और एक मोड 400 रूट-स्वामित्व वाली क्रेडेंशियल फ़ाइल का उपयोग कर सकते हैं। मेरा संस्करण:mysql --defaults-file=/auth/root-mysql.cnf --batch --skip-column-names --execute "SELECT User, Host from mysql.user" | while read user host; do echo "SHOW GRANTS FOR '${user}'@'${host}';"; done | mysql --defaults-file=/auth/root-mysql.cnf --batch | sed 's/^Grants for/-- Grants for/'
बेसजेन

9

select * from mysql.user;

आप उनमें से प्रत्येक को सौंपी गई उपयोगकर्ता सूची और विशेषाधिकार दे सकते हैं, mysql.userहालांकि इसके लिए तालिका की पहुंच आवश्यक है और rootउपयोगकर्ता के पास है।


4
यह केवल आपको "शीर्ष स्तर" (सर्वर स्तर) विशेषाधिकार प्रदान करता है। विशिष्ट स्कीमा पर लगाए गए विशेषाधिकार हैं mysql.db। विशिष्ट तालिकाओं पर विशेषाधिकार हैं mysql.tables_priv, और इसी तरह। तो यह इतना आसान नहीं है।
श्लोमी नोआच

इंद्रधनुष तालिका शेंनिगन्स के लिए , अपने पासवर्ड हैश select * from mysql.userको crackstation.net से फेंक दें और अनहैस्ड आउटपुट देखें।
पचेरियर

8

एक लाइनर (बदलने -urootके लिए -u$USER_NAME(क्योंकि बैकटिक की) एक यूनिक्स बैश में अन्य उपयोगकर्ता के साथ उपयोग के लिए):

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

या बिना बैकटिक्स और पासवर्ड इनलाइन के (कमांड के सामने वाला स्थान इसे उबंटू में बैश इतिहास से बाहर करता है):

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

विंडोज में:

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

4

यदि आप त्रुटि के बिना निम्नलिखित चयन बयान चला सकते हैं :

/* 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 */

किसी भी प्रश्न या चिंताओं का उत्तर देने / सत्यापित करने में प्रसन्नता


मुझे पता है कि यह कोषेर नहीं है, लेकिन ... आपकी पटकथा अद्भुत है! अब, मुझे बस इसे स्वचालित करना है। मैं
हंज़ो 2001

2

यह आपको एक बेहतर दृश्य देगा ...

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)


0

जैसा कि इस उत्तर में बताया गया है , आप सभी उपयोगकर्ताओं के डेटाबेस-विशिष्ट, तालिका-विशिष्ट, स्तंभ-विशिष्ट और नियमित-विशिष्ट विशेषाधिकारों को सूचीबद्ध करने के लिए निम्न सेट चला सकते हैं। ध्यान दें कि आपको इसे शेल से चलाने की आवश्यकता है, न कि 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

इस दृष्टिकोण का लाभ यह है कि आपको अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता नहीं है।


0

यदि आप अक्सर डेटाबेस का संचालन कर रहे हैं, तो आप संभवतः विशेषाधिकारों को रखना चाहेंगे। आप जल्दी से एक चेक चलाने के लिए एक संग्रहीत प्रक्रिया का उपयोग कर सकते हैं। यह उदाहरण mariadb में काम करता है मानक mysql संस्करण के साथ काम करने के लिए एक tweak की आवश्यकता हो सकती है।

स्तंभों को फिर से व्यवस्थित करने और आउटपुट को बेहतर ढंग से व्यवस्थित करने के लिए कुछ क्रम में जोड़ने के साथ मंसूर अली के उत्तर का उपयोग करना।

रूट लॉगिन का उपयोग करना:

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 कार्यक्षेत्र का उपयोग किया।

यहाँ एक तरफ और विषय से थोड़ा हटकर, लेकिन, आपके पास अज्ञात होस्ट या उपयोगकर्ताओं को दिखाने के लिए एक प्रक्रिया भी हो सकती है। अज्ञात मेजबानों के लिए एक उदाहरण:

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');

आप प्रक्रिया में किसी अन्य पैरामीटर को शामिल करके स्तंभ को भी चर बना सकते हैं और इसे ShowUnognHosts (उपयोगकर्ता, 'user1, user2') के साथ कॉल कर सकते हैं; उदाहरण के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.