mysql: Tüm kullanıcılar için GRANT'ları göster


87

MySQL's SHOW GRANTSmevcut 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:


45

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 GRANTkomutu veya REVOKE(tersini) komutunu sorabilirsiniz .

İlk durum bir şema yüklemenizi gerektirir, ikincisi PERL komut dosyaları + bağımlılıklar yüklemenizi gerektirir.


11
Common_schema'nın sql_show_grants görünümünü nasıl kullanacağınızı daha ayrıntılı olarak açıklayabilir misiniz? Bir hata alıyorumERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist
Martin Vegter 24:13

2
@ MartinVegter, common_schema yüklediniz mi? Buradan indirin ve bu talimatları izleyerek yükleyin .
Shlomi Noach

1
@ShlomiNoach, "Yerleşik hiçbir şey yok" derken ... Herhangi bir hata var information_schema.user_privilegesmı?
Pacerier

2
Üzgünüz, fakat 'common_schema' diye bir şey yoktur. Var değil.
Brendan Byrd

2
link sql_show_grants bozuk
Cyzanfar

81
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.


5
Üzgünüz, kabul edilen cevap olmamalıdır. information_schema.user_privilegesyalnızca SUPER, RELOADvb. 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@localhostgelmez değil gösterilebilir information_schema.user_privileges. common_schemaAgrega verilerine yukarıda sunulan çözüm user_privilegesve diğer tabloları tüm resim vermek üzere.
Shlomi Noach

11

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.


6
Bunun ne yaptığı veya soruyu nasıl yanıtladığı ile ilgili bazı ayrıntılar eklemek isteyebilirsiniz. Sadece bir demet kod görüntülemek, çözümünüzün neden işe yaradığını kimsenin anlamasına yardımcı olmaz.
Max Vernon

Parolayı nereden verebilirim?
Mian Asbat Ahmad,

Bir şifre sağlamak için, bir Seçenek Dosyası veya mysql komutunun --password bayrağı kullanılabilir.
mleu

Tüm kullanıcılara hibe alabilmek için bir root şifresi vermek ve sorguyu çalıştırmak mümkün olmaz mıydı?
Mian Asbat Ahmad,

2
Yalnızca bir bağlantı kurmak için istekleri aktarabilir ve bir mod 400 kök ait kimlik bilgisi dosyası kullanabilirsiniz. Benim versiyonum: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/'
BaseZen 16:18

9

select * from mysql.user;

Her birine atanan Kullanıcı listesi ve Ayrıcalıklar verebilir, mysql.useryine de tabloya erişim gerektirir ve rootkullanıcının bu listeye girmesi gerekir.


4
Bu, yalnızca "üst düzey" (sunucu düzeyi) ayrıcalıklarını verir. Belirli şemaları ayarlanmış Ayrıcalıklar içindedir mysql.db. Belirli tablolardaki ayrıcalıklar mysql.tables_privvb. İçindedir. Yani o kadar basit değil.
Shlomi Noach

Gökkuşağı masa shenanigans için adresinin şifresi sağlamalarının atmak select * from mysql.useriçine crackstation.net ve unhashed çıkışını görüyoruz.
Pacerier

8

Bir astar (değiştirmek -urootiç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

4

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


Bunun koşer olmadığını biliyorum, ama ... senaryonun harika! Şimdi tek yapmam gereken onu otomatikleştirmek. Benim bash ısınmak edeceğiz
hanzo2001

2

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)

1

Komut SHOW GRANTS [FOR user], istediğiniz herhangi bir kullanıcıyı gösterebilir. Daha fazla ayrıntı için buraya bakın .


0

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.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.