mysql: Hiển thị GRANT cho tất cả người dùng


87

MySQL SHOW GRANTShiển thị các quyền của người dùng hiện tại.

Có cách nào để đăng nhập với quyền root và hiển thị quyền của tất cả người dùng không?

Câu trả lời:


45

Không có gì tích hợp. Bạn có hai lựa chọn mặc dù:

  • Sử dụng common_schema's sql_show_grants xem. Ví dụ: bạn có thể truy vấn:

    SELECT sql_grants FROM common_schema.sql_show_grants;

    Hoặc bạn có thể truy vấn người dùng cụ thể, ví dụ:

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

    Để cài đặt common_schema, hãy làm theo hướng dẫn ở đây .

    Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của công cụ này.

  • Sử dụng Percona Toolkit pt-show-grants, ví dụ:

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

Trong cả hai trường hợp, bạn có thể yêu cầu GRANTlệnh hoặc lệnh REVOKE(ngược lại).

Trường hợp đầu tiên yêu cầu bạn cài đặt một lược đồ, trường hợp sau yêu cầu bạn cài đặt các tập lệnh PERL + phụ thuộc.


11
Bạn có thể vui lòng mô tả chi tiết hơn về cách sử dụng chế độ xem sql_show_grant của common_schema không? Tôi gặp lỗiERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist
Martin Vegter

2
@MartinVegter, bạn đã cài đặt common_schema chưa? Tải về ở đây và cài đặt theo các hướng dẫn sau .
Shlomi Noach

1
@ShlomiNoach, Khi bạn nói rằng "không có gì tích hợp" ... Có lỗi information_schema.user_privilegesgì không?
Pacerier 7/07/2015

2
Xin lỗi, nhưng không có thứ gọi là 'common_schema'. Nó không tồn tại.
Brendan Byrd

2
liên kết sql_show_grant bị hỏng
Cyzanfar

81
select * from information_schema.user_privileges;

BIÊN TẬP:

Như Shlomi Noach đã đề cập:

Nó không liệt kê các đặc quyền cơ sở dữ liệu cụ thể, bảng cụ thể, cột cụ thể, đặc thù thường quy. Do đó, cấp GRANT CHỌN TRÊN mydb. * CHO myuser @ localhost không hiển thị trong information_schema.user_priv đặc quyền. Giải pháp common_schema được trình bày ở trên tổng hợp dữ liệu từ user_priv đặc quyền và các bảng khác để cung cấp cho bạn hình ảnh đầy đủ.


5
Xin lỗi, nó không phải là câu trả lời được chấp nhận. information_schema.user_privilegeschỉ liệt kê các đặc quyền cấp người dùng, chẳng hạn như SUPER, RELOADv.v. Nó cũng liệt kê các khoản trợ cấp DML toàn diện như thế nào SELECT. Nó không liệt kê các đặc quyền cơ sở dữ liệu, bảng riêng biệt, đặc trưng cho cột, đặc thù của thói quen. Có mũi, cấp GRANT SELECT ON mydb.* TO myuser@localhostnào không hiển thị trên information_schema.user_privileges. Các common_schemagiải pháp trình bày ở trên uẩn dữ liệu từ user_privilegesvà các bảng khác để cung cấp cho bạn những hình ảnh đầy đủ.
Shlomi Noach

11

Đoạn Linux shell này lặp lại trên tất cả người dùng MySQL và thực hiện SHOW GRANTS cho mỗi người:

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

Hoạt động tốt nhất nếu bạn có thể kết nối với MySQL mà không cần mật khẩu.

Đầu ra được định dạng để nó có thể chạy trong shell MySQL. Thận trọng: Đầu ra cũng chứa quyền và mật khẩu người dùng root MySQL! Xóa các dòng đó nếu bạn không muốn người dùng root MySQL thay đổi.


6
Bạn có thể muốn thêm một số chi tiết về những gì nó làm hoặc cách nó trả lời câu hỏi. Chỉ hiển thị một loạt mã không giúp ai hiểu lý do tại sao giải pháp của bạn hoạt động.
Max Vernon

Tôi có thể cung cấp mật khẩu ở đâu?
Mian Asbat Ahmad

Để cung cấp mật khẩu, người ta có thể sử dụng Tệp tùy chọn hoặc cờ --password của lệnh mysql.
mleu

Sẽ không thể cung cấp một mật khẩu gốc và chạy truy vấn để nhận được tất cả các khoản trợ cấp của người dùng?
Mian Asbat Ahmad

2
Bạn có thể truyền phát các yêu cầu để chỉ thực hiện một kết nối và sử dụng tệp thông tin xác thực sở hữu chế độ 400. Phiên bản của tôi: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

9

select * from mysql.user;

Có thể cung cấp cho bạn Danh sách người dùng và Đặc quyền được gán cho từng người trong số họ, yêu cầu quyền truy cập vào mysql.userbảng và rootngười dùng có nó.


4
Điều này chỉ cung cấp cho bạn các đặc quyền "cấp cao nhất" (cấp máy chủ). Đặc quyền được thiết lập trên các lược đồ cụ thể là trong mysql.db. Đặc quyền trên các bảng cụ thể là trong mysql.tables_priv, và như vậy. Vì vậy, nó không đơn giản như vậy.
Shlomi Noach

Đối với shenanigans bảng cầu vồng, ném băm mật khẩu của bạn select * from mysql.uservào crackstation.net và xem đầu ra chưa được xóa.
Pacerier 7/07/2015

8

Một lớp lót (thay đổi -urootđể -u$USER_NAMEsử dụng với người dùng khác) trong bash Unix (vì các backticks):

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

hoặc không có backticks và với mật khẩu nội tuyến (khoảng trắng phía trước lệnh sẽ loại trừ nó khỏi lịch sử Bash trong Ubuntu):

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

Trong 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

4

Nếu bạn có thể chạy các câu lệnh CHỌN sau đây mà không gặp lỗi:

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

sau đó hãy sử dụng đoạn mã sau (bên dưới), được viết bằng cú pháp .sql.

Tôi đã thiết kế truy vấn này trong nỗ lực xây dựng lại các câu lệnh GRANT cho tất cả các quyền hiện có (để bảo trì thường xuyên trong quá trình di chuyển cơ sở dữ liệu). Có một vài vấn đề cần xử lý, chẳng hạn như liên kết mật khẩu người dùng, nhưng vì chúng tôi thường xuyên cập nhật mật khẩu, điều đó không nằm trong phạm vi của dự án này.

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

Rất vui được trả lời / xác minh bất kỳ câu hỏi hoặc thắc mắc nào


Tôi biết điều này không nghiêm trọng hơn, nhưng ... kịch bản của bạn thật tuyệt vời! Bây giờ, tất cả những gì tôi phải làm là tự động hóa nó. Tôi sẽ làm nóng bash của mình
hanzo2001

2

Điều này sẽ cho bạn cái nhìn rõ hơn ...

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

Lệnh SHOW GRANTS [FOR user]có thể hiển thị bất kỳ người dùng nào bạn muốn. Xem ở đây để biết thêm chi tiết.


0

Như đã đề cập trong câu trả lời này , bạn có thể chạy bộ lệnh sau để liệt kê các đặc quyền cơ sở dữ liệu, bảng cụ thể, cột cụ thể và đặc thù thường quy của tất cả người dùng. Lưu ý rằng bạn cần chạy cái này từ shell chứ không phải dấu nhắc lệnh của 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

Ưu điểm của phương pháp này là bạn không cần cài đặt thêm phần mềm.


0

Nếu bạn đang quản trị cơ sở dữ liệu thường xuyên, bạn có thể muốn giữ các đặc quyền chặt chẽ. Bạn có thể sử dụng một thủ tục được lưu trữ để nhanh chóng chạy một kiểm tra. Ví dụ này hoạt động trong mariadb có thể cần một tinh chỉnh để hoạt động với phiên bản mysql tiêu chuẩn.

Sử dụng câu trả lời từ Mansur Ali với một chút tinh chỉnh sắp xếp lại các cột và thêm vào một số thứ tự để tổ chức đầu ra tốt hơn.

Sử dụng đăng nhập root:

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 ;

Thay vào đó, bạn có thể thay đổi quy trình để kiểm tra bảng mysql.user.

Sử dụng, sử dụng đăng nhập root:

USE mysql;
CALL ShowPrivs();

Tôi đã sử dụng bàn làm việc mysql trên Ubuntu để chạy phần thủ tục tạo câu trả lời này.

Như một bên và một chút ra khỏi chủ đề ở đây, nhưng, bạn cũng có thể có một quy trình để hiển thị các máy chủ hoặc người dùng không xác định. Một ví dụ cho các máy chủ không xác định:

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 ;

Lưu ý sử dụng: Cung cấp một chuỗi các máy chủ được phân tách bằng dấu phẩy để chỉ một bộ '' được sử dụng:

CALL ShowUnknownHosts('knownhost1,knownhost2');

Bạn cũng có thể tạo biến cột bằng cách bao gồm một tham số khác trong quy trình và gọi nó bằng ShowUn Unknownhosts (user, 'user1, user2'); ví dụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.