মাইএসকিউএলস SHOW GRANTS
বর্তমান ব্যবহারকারীর অনুমতিগুলি দেখায়।
রুট হিসাবে লগ ইন এবং সমস্ত ব্যবহারকারীর অনুমতি দেখানোর উপায় আছে?
মাইএসকিউএলস SHOW GRANTS
বর্তমান ব্যবহারকারীর অনুমতিগুলি দেখায়।
রুট হিসাবে লগ ইন এবং সমস্ত ব্যবহারকারীর অনুমতি দেখানোর উপায় আছে?
উত্তর:
কিছুই অন্তর্নির্মিত। আপনার কাছে দুটি বিকল্প রয়েছে:
common_schema
এর স্ক্যাল_শো_গ্রান্ট ভিউ ব্যবহার করুন । উদাহরণস্বরূপ, আপনি জিজ্ঞাসা করতে পারেন:
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;
সম্পাদনা করুন:
শ্লোমি নোয়াচ উল্লেখ করেছেন:
এটি ডাটাবেস-নির্দিষ্ট, টেবিল-নির্দিষ্ট, কলাম-নির্দিষ্ট, রুটিন-সুনির্দিষ্ট সুবিধাগুলি তালিকাভুক্ত করে না। অতএব, অনুদানটি মাইডবিতে অনুদান নির্বাচন করুন * উপরে উপস্থাপিত সাধারণ_সীমা সমাধানটি আপনাকে সম্পূর্ণ চিত্র দেওয়ার জন্য ব্যবহারকারী_প্রেমিজ এবং অন্যান্য টেবিলের ডেটা একত্রিত করে।
information_schema.user_privileges
কেবলমাত্র ব্যবহারকারী-স্তরের সুবিধাগুলি, যেমন SUPER
, RELOAD
ইত্যাদি তালিকাভুক্ত করে It এটি সর্বমোট ডিএমএল অনুদানের মতোও তালিকাবদ্ধ করে SELECT
। এটি ডাটাবেস-নির্দিষ্ট, টেবিল-সেপসিফিক, কলাম-নির্দিষ্ট, রুটিন-নির্দিষ্ট সুবিধাগুলি তালিকাভুক্ত করে না । সেখানে সম্মুখ, অনুদান GRANT SELECT ON mydb.* TO myuser@localhost
নেই না দেখাবেন information_schema.user_privileges
। common_schema
থেকে দলা তথ্য উপরে উপস্থাপন সমাধান user_privileges
এবং অন্যান্য টেবিল আপনি সম্পূর্ণ ছবি দিতে।
এই লিনাক্স শেল খণ্ডটি সমস্ত মাইএসকিউএল ব্যবহারকারীদের উপরে লুপ করে এবং প্রত্যেকের জন্য একটি শোগুলি অনুদান দেয় :
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 --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
জন্য , আপনার পাসওয়ার্ডের হ্যাশগুলি ক্র্যাকস্টেশন.নেটের মধ্যে ফেলে দিন এবং অপরিবর্তিত আউটপুটটি দেখুন।
এক মাছ ধরার নৌকা (পরিবর্তন -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;
তারপরে। এসকিউএল সিনট্যাক্সে লিখিত নিম্নলিখিত কোড (নীচে) ব্যবহার করতে নির্দ্বিধায় অনুভব করুন।
সমস্ত বিদ্যমান অনুমতিগুলির জন্য (ডাটাবেস স্থানান্তরের সময় ঘন ঘন রক্ষণাবেক্ষণের জন্য) গ্রান্ট স্টেটমেন্টগুলি পুনঃনির্মাণের প্রয়াসে আমি এই কোয়েরিটি ডিজাইন করেছি। হ্যান্ডল্ড হওয়ার মতো কয়েকটি সমস্যা রয়েছে যেমন ব্যবহারকারী-পাসওয়ার্ড-সংযোগ, তবে আমরা ঘন ঘন পাসওয়ার্ড আপডেট করি কারণ এটি এই প্রকল্পের আওতায় ছিল না।
/* 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 -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
এই পদ্ধতির সুবিধা হ'ল আপনাকে অতিরিক্ত সফ্টওয়্যার ইনস্টল করার দরকার নেই।
আপনি যদি প্রায়শই ডেটাবেস পরিচালনা করেন তবে আপনি সম্ভবত কঠোর সুযোগ সুবিধা রাখতে চান। আপনি চেক চালানোর জন্য একটি সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন। এই উদাহরণটি মারিয়্যাডবিতে কাজ করে স্ট্যান্ডার্ড মাইএসকিএল সংস্করণ দিয়ে কাজ করার জন্য একটি টুইঙ্কের প্রয়োজন হতে পারে।
মনসুর আলীর কাছ থেকে উত্তরটি ব্যবহার করে কলামগুলি পুনরায় সাজানো এবং কিছুটা আউটপুটকে আরও সুসংহত করার সাথে যোগ করা।
একটি মূল লগইন ব্যবহার:
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();
আমি এই উত্তরের তৈরি প্রক্রিয়া অংশটি চালাতে উবুন্টুতে মাইএসকিএল ওয়ার্কবেঞ্চ ব্যবহার করেছি।
এখানে একপাশে এবং বিষয়টির বাইরে কিছুটা হলেও, আপনার অজানা হোস্ট বা ব্যবহারকারীদের দেখানোর পদ্ধতিও থাকতে পারে। অজানা হোস্টগুলির জন্য একটি উদাহরণ:
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');
পদ্ধতিতে অন্য একটি প্যারামিটার অন্তর্ভুক্ত করে আপনি কলামটি পরিবর্তনশীল করতে এবং শো-অজ্ঞাতহোস্টগুলি (ব্যবহারকারী, 'ব্যবহারকারী 1, ব্যবহারকারী 2') দিয়ে কল করতে পারেন; উদাহরণ স্বরূপ.
ERROR 1146 (42S02): Table 'common_schema.sql_show_grants' doesn't exist