MySQL SHOW GRANTS
hiể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?
MySQL SHOW GRANTS
hiể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:
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 GRANT
lệ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.
information_schema.user_privileges
gì không?
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 đủ.
information_schema.user_privileges
chỉ liệt kê các đặc quyền cấp người dùng, chẳng hạn như SUPER
, RELOAD
v.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@localhost
nào không hiển thị trên information_schema.user_privileges
. Các common_schema
giải pháp trình bày ở trên uẩn dữ liệu từ user_privileges
và các bảng khác để cung cấp cho bạn những hình ảnh đầy đủ.
Đ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.
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;
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.user
bảng và root
người dùng có nó.
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.
select * from mysql.user
vào crackstation.net và xem đầu ra chưa được xóa.
Một lớp lót (thay đổi -uroot
để -u$USER_NAME
sử 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
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
Đ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)
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.
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.
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ụ.
ERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist