MySQL SHOW GRANTS
वर्तमान उपयोगकर्ता की अनुमति दिखाता है।
क्या रूट के रूप में लॉग इन करने और सभी उपयोगकर्ताओं की अनुमति दिखाने का कोई तरीका है?
MySQL SHOW GRANTS
वर्तमान उपयोगकर्ता की अनुमति दिखाता है।
क्या रूट के रूप में लॉग इन करने और सभी उपयोगकर्ताओं की अनुमति दिखाने का कोई तरीका है?
जवाबों:
कुछ भी नहीं बनाया। आपके पास हालांकि दो विकल्प हैं:
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
विपरीत (विपरीत) कमांड के लिए पूछ सकते हैं ।
पहले मामले के लिए आवश्यक है कि आप एक स्कीमा स्थापित करें, बाद के लिए आवश्यक है कि आप पर्ल स्क्रिप्ट + निर्भरताएँ स्थापित करें।
information_schema.user_privileges
?
select * from information_schema.user_privileges;
संपादित करें:
जैसा कि श्लोमी नोआच ने बताया है:
यह डेटाबेस-विशिष्ट, तालिका-विशिष्ट, स्तंभ-विशिष्ट, नियमित-विशिष्ट विशेषाधिकार को सूचीबद्ध नहीं करता है। इसलिए, अनुदान mydb पर अनुदान का चयन करें। ऊपर प्रस्तुत आम_समेह समाधान आपको पूरी तस्वीर देने के लिए user_privileges और अन्य तालिकाओं से डेटा एकत्र करता है।
information_schema.user_privileges
केवल उपयोगकर्ता-स्तरीय विशेषाधिकारों को सूचीबद्ध करता है, जैसे कि SUPER
, RELOAD
इत्यादि SELECT
। यह डेटाबेस-विशिष्ट, तालिका-अलग, स्तंभ-विशिष्ट, नियमित-विशिष्ट विशेषाधिकार को सूचीबद्ध नहीं करता है । वहाँ सामने, अनुदान GRANT SELECT ON mydb.* TO myuser@localhost
करता नहीं पर दिखाने information_schema.user_privileges
। common_schema
से डेटा एकत्र करेगा ऊपर प्रस्तुत समाधान user_privileges
और अन्य तालिकाओं आप पूरी तस्वीर देने के लिए।
यह लिनक्स खोल टुकड़ा सभी 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 रूट उपयोगकर्ता बदल जाए तो उन पंक्तियों को हटा दें।
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/'
select * from mysql.user;
आप उनमें से प्रत्येक को सौंपी गई उपयोगकर्ता सूची और विशेषाधिकार दे सकते हैं, mysql.user
हालांकि इसके लिए तालिका की पहुंच आवश्यक है और root
उपयोगकर्ता के पास है।
mysql.db
। विशिष्ट तालिकाओं पर विशेषाधिकार हैं mysql.tables_priv
, और इसी तरह। तो यह इतना आसान नहीं है।
select * from mysql.user
को crackstation.net से फेंक दें और अनहैस्ड आउटपुट देखें।
एक लाइनर (बदलने -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
यदि आप त्रुटि के बिना निम्नलिखित चयन बयान चला सकते हैं :
/* 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 */
किसी भी प्रश्न या चिंताओं का उत्तर देने / सत्यापित करने में प्रसन्नता
यह आपको एक बेहतर दृश्य देगा ...
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)
कमांड SHOW GRANTS [FOR user]
आपके इच्छित किसी भी उपयोगकर्ता को दिखा सकती है। अधिक विस्तार के लिए यहां देखें ।
जैसा कि इस उत्तर में बताया गया है , आप सभी उपयोगकर्ताओं के डेटाबेस-विशिष्ट, तालिका-विशिष्ट, स्तंभ-विशिष्ट और नियमित-विशिष्ट विशेषाधिकारों को सूचीबद्ध करने के लिए निम्न सेट चला सकते हैं। ध्यान दें कि आपको इसे शेल से चलाने की आवश्यकता है, न कि 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
इस दृष्टिकोण का लाभ यह है कि आपको अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता नहीं है।
यदि आप अक्सर डेटाबेस का संचालन कर रहे हैं, तो आप संभवतः विशेषाधिकारों को रखना चाहेंगे। आप जल्दी से एक चेक चलाने के लिए एक संग्रहीत प्रक्रिया का उपयोग कर सकते हैं। यह उदाहरण 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') के साथ कॉल कर सकते हैं; उदाहरण के लिए।
ERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist