MySQL's SHOW GRANTS
mevcut kullanıcının izinlerini gösterir.
Kök olarak giriş yapıp tüm kullanıcıların izinlerini göstermenin bir yolu var mı?
MySQL's SHOW GRANTS
mevcut kullanıcının izinlerini gösterir.
Kök olarak giriş yapıp tüm kullanıcıların izinlerini göstermenin bir yolu var mı?
Yanıtlar:
Hiçbir şey yerleşik değil. Yine de iki seçeneğiniz var:
common_schema
'In sql_show_grants görünümünü kullanın . Örneğin, sorgulayabilirsiniz:
SELECT sql_grants FROM common_schema.sql_show_grants;
Veya belirli kullanıcıları sorgulayabilirsiniz, örneğin:
SELECT sql_grants FROM common_schema.sql_show_grants WHERE user='app';
Yüklemek için common_schema
, talimatları takip buraya .
Yasal Uyarı: Bu aracın yazarıyım.
pt-show-grants
Örneğin, Percona Araç Takımı'nı kullanın :
pt-show-grants --host localhost --user root --ask-pass
Her iki durumda da GRANT
komutu veya REVOKE
(tersini) komutunu sorabilirsiniz .
İlk durum bir şema yüklemenizi gerektirir, ikincisi PERL komut dosyaları + bağımlılıklar yüklemenizi gerektirir.
information_schema.user_privileges
mı?
select * from information_schema.user_privileges;
DÜZENLE:
Shlomi Noach tarafından belirtildiği gibi:
Veritabanına özgü, tabloya özgü, sütuna özgü, rutin belirli ayrıcalıkları listelemez. Bu nedenle, GRANT SELECT ON mydb. * TO myuser @ localhost, information_schema.user_privileges içinde gösterilmez. Yukarıda sunulan common_schema çözümü size tam resmi vermek için user_privileges ve diğer tablolardaki verileri toplar.
information_schema.user_privileges
yalnızca SUPER
, RELOAD
vb. gibi kullanıcı düzeyinde ayrıcalıkları listeler. Ayrıca, çok yönlü DML hibelerini de listeler SELECT
. O mu değil veritabanına özel, masa Sürümüne Özel, kolon özgü rutin özgü ayrıcalıkları sıralar. Orada fore, hibe GRANT SELECT ON mydb.* TO myuser@localhost
gelmez değil gösterilebilir information_schema.user_privileges
. common_schema
Agrega verilerine yukarıda sunulan çözüm user_privileges
ve diğer tabloları tüm resim vermek üzere.
Bu Linux kabuk parçası tüm MySQL kullanıcıları üzerinde dolaşıyor ve her biri için bir GÖSTERGE GRUBU yapıyor:
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'e şifre olmadan bağlanabiliyorsanız, en iyi şekilde çalışır.
Çıktı biçimlendirilmiştir, böylece MySQL kabuğunda çalıştırılabilir. Dikkat: Çıktı ayrıca MySQL kök kullanıcı izinlerini ve şifresini de içerir! MySQL root kullanıcısının değişmesini istemiyorsanız bu satırları kaldırın.
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;
Her birine atanan Kullanıcı listesi ve Ayrıcalıklar verebilir, mysql.user
yine de tabloya erişim gerektirir ve root
kullanıcının bu listeye girmesi gerekir.
mysql.db
. Belirli tablolardaki ayrıcalıklar mysql.tables_priv
vb. İçindedir. Yani o kadar basit değil.
select * from mysql.user
içine crackstation.net ve unhashed çıkışını görüyoruz.
Bir astar (değiştirmek -uroot
için -u$USER_NAME
(çünkü ters tırnakların) Unix bash diğer kullanıcı ile kullanım için):
mysql -uroot -p -sNe"`mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;"`"
ya da geri tepme olmadan ve şifre satır içi (komutun önündeki boşluk, Ubuntu'daki Bash tarihinin dışında tutulur):
mysql -uroot -p"$PASSWORD" -sNe"$(mysql -uroot -p"$PASSWORD" -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;")"
Windows'ta:
mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;" > grants.sql
mysql -uroot -p < grants.sql
del grants.sql
Aşağıdaki SELECT ifadelerini hatasız çalıştırabilirseniz :
/* 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;
daha sonra, aşağıdaki kodu (aşağıda), .sql sözdizimi ile yazılmış olarak kullanmaktan çekinmeyin.
Bu sorguyu, mevcut tüm izinler için (veritabanı geçişi sırasında sık sık bakım yapılması için) GRANT ifadelerini yeniden oluşturma girişiminde tasarladım. Kullanıcı-şifre bağlama gibi ele alınması gereken birkaç sorun vardır, ancak bu proje kapsamında olmayan şifreleri sık sık güncellediğimiz için.
/* 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 */
Herhangi bir soru veya endişenizi cevaplamak / doğrulamaktan mutlu
Bu size daha iyi bir görünüm verecektir ...
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)
Komut SHOW GRANTS [FOR user]
, istediğiniz herhangi bir kullanıcıyı gösterebilir. Daha fazla ayrıntı için buraya bakın .
Bu cevapta belirtildiği gibi , tüm kullanıcıların veritabanına özgü, tabloya özgü, sütuna özgü ve rutin belirli ayrıcalıklarını listelemek için aşağıdaki komutları çalıştırabilirsiniz. Bunu MySQL komut isteminden değil kabuktan çalıştırmanız gerektiğini unutmayın.
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
Bu yaklaşımın avantajı, ek bir yazılım yüklemenize gerek olmamasıdır.
Veritabanlarını sık sık yönetiyorsanız, sıkı ayrıcalıklara sahip olmak isteyebilirsiniz. Hızlı bir şekilde kontrol etmek için saklı bir prosedür kullanabilirsiniz. Mariadb'de çalışan bu örnek, standart mysql versiyonuyla çalışmak için ince ayarlara ihtiyaç duyabilir.
Mansur Ali'nin cevabını, sütunları yeniden düzenlemek için biraz ince ayar yaparak ve çıktısını daha iyi organize etmek için bazı sıralamalar ekleyerek kullanın.
Bir kök girişini kullanarak:
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 ;
Bunun yerine mysql.user tablosunu kontrol etmek için prosedürü değiştirebilirsiniz.
Kök girişi kullanarak kullanım:
USE mysql;
CALL ShowPrivs();
Ubuntu'daki mysql tezgahını, bu cevabın yaratma prosedürünü çalıştırmak için kullandım.
Burada bir kenara ve biraz konu dışı olmakla birlikte, bilinmeyen ana bilgisayarları veya kullanıcıları gösterme prosedürünüz de olabilir. Bilinmeyen ana bilgisayarlara bir örnek:
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 ;
Kullanım notu: Virgülle ayrılmış bir ana bilgisayar dizisi verin, böylece yalnızca bir '' dizisi kullanılır:
CALL ShowUnknownHosts('knownhost1,knownhost2');
Sütun değişkenini yordama başka bir parametre ekleyerek ve ShowUnknownHosts (user, 'user1, user2') ile çağırarak da yapabilirsiniz; Örneğin.
ERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist