📄 mysql_setpermission
字号:
#!/usr/bin/perl## Emacs, this is -*- perl -*- mode? :-)#### Permission setter for MySQL#### mady by Luuk de Boer (luuk@wxs.nl) 1998.## it's made under GPL ...:-))################################################################################## History#### 1.0 first start of the program## 1.1 some changes from monty and after that## initial release in mysql 3.22.10 (nov 1998)## 1.2 begin screen now in a loop + quit is using 0 instead of 9## after ideas of Paul DuBois.## 1.2a Add Grant, References, Index and Alter privilege handling (Monty)## 1.3 Applied patch provided by Martin Mokrejs <mmokrejs@natur.cuni.cz>## (General code cleanup, use the GRANT statement instead of updating## the privilege tables directly, added option to revoke privileges)#### TODO## empty ... suggestions ... mail them to me ...$version="1.3";use DBI;use Getopt::Long;use strict;use vars qw($dbh $sth $hostname $opt_user $opt_password $opt_help $opt_host $opt_socket $opt_port $host $version);my $sqlhost = "";my $user = "";$dbh=$host=$opt_user= $opt_password= $opt_help= $opt_host= $opt_socket= "";$opt_port=0;read_my_cnf(); # Read options from ~/.my.cnfGetOptions("user=s","password=s","help","host=s","socket=s","port=i");usage() if ($opt_help); # the help functionif ($opt_host eq ''){ $sqlhost = "localhost";}else{ $sqlhost = $opt_host;}# ask for a password if no password is set alreadyif ($opt_password eq ''){ system "stty -echo"; print "Password for user $opt_user to connect to MySQL: "; $opt_password = <STDIN>; chomp($opt_password); system "stty echo"; print "\n";}# make the connection to MySQL$dbh= DBI->connect("DBI:mysql:mysql:host=$sqlhost:port=$opt_port:mysql_socket=$opt_socket",$opt_user,$opt_password, {PrintError => 0}) || die("Can't make a connection to the mysql server.\n The error: $DBI::errstr");# the start of the program&q1();exit(0); # the end...###### below all subroutines of the program######### the beginning of the program###sub q1 { # first question ... my ($answer,$end); while (! $end) { print "#"x70; print "\n"; print "## Welcome to the permission setter $version for MySQL.\n"; print "## made by Luuk de Boer\n"; print "#"x70; print "\n"; print "What would you like to do:\n"; print " 1. Set password for an existing user.\n"; print " 2. Create a database + user privilege for that database\n"; print " and host combination (user can only do SELECT)\n"; print " 3. Create/append user privilege for an existing database\n"; print " and host combination (user can only do SELECT)\n"; print " 4. Create/append broader user privileges for an existing\n"; print " database and host combination\n"; print " (user can do SELECT,INSERT,UPDATE,DELETE)\n"; print " 5. Create/append quite extended user privileges for an\n"; print " existing database and host combination (user can do\n"; print " SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,\n"; print " LOCK TABLES,CREATE TEMPORARY TABLES)\n"; print " 6. Create/append database administrative privileges for an\n"; print " existing database and host combination (user can do\n"; print " SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,\n"; print " CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS)\n"; print " 7. Create/append full privileges for an existing database\n"; print " and host combination (user has FULL privilege)\n"; print " 8. Remove all privileges for for an existing database and\n"; print " host combination.\n"; print " (user will have all permission fields set to N)\n"; print " 0. exit this program\n"; print "\nMake your choice [1,2,3,4,5,6,7,0]: "; while (<STDIN>) { $answer = $_; chomp($answer); if ($answer =~ /^[12345678]$/) { if ($answer == 1) { setpwd(); } elsif ($answer =~ /^[2345678]$/) { addall($answer); } else { print "Sorry, something went wrong. With such option number you should not get here.\n\n"; $end = 1; } } elsif ($answer == 0) { print "We hope we can help you next time \n\n"; $end = 1; } else { print "Your answer was $answer\n"; print "and that's wrong .... Try again\n"; } last; } }}#### set a password for a user###sub setpwd{ my ($user,$pass,$host) = ""; print "\n\nSetting a (new) password for a user.\n"; $user = user(); $pass = newpass($user); $host = hosts($user); print "#"x70; print "\n\n"; print "That was it ... here is an overview of what you gave to me:\n"; print "The username : $user\n";# print "The password : $pass\n"; print "The host : $host\n"; print "#"x70; print "\n\n"; print "Are you pretty sure you would like to implement this [yes/no]: "; my $no = <STDIN>; chomp($no); if ($no =~ /n/i) { print "Okay .. that was it then ... See ya\n\n"; return(0); } else { print "Okay ... let's go then ...\n\n"; } $user = $dbh->quote($user); $host = $dbh->quote($host); if ($pass eq '') { $pass = "''"; } else { $pass = "PASSWORD(". $dbh->quote($pass) . ")"; } my $sth = $dbh->prepare("update user set Password=$pass where User = $user and Host = $host") || die $dbh->errstr; $sth->execute || die $dbh->errstr; $sth->finish; print "The password is set for user $user.\n\n";}#### all things which will be added are done here###sub addall { my ($todo) = @_; my ($answer,$good,$db,$user,$pass,$host,$priv); if ($todo == 2) { $db = newdatabase(); } else { $db = database(); } $user = newuser(); $pass = newpass("$user"); $host = newhosts(); print "#"x70; print "\n\n"; print "That was it ... here is an overview of what you gave to me:\n"; print "The database name : $db\n"; print "The username : $user\n";# print "The password : $pass\n"; print "The host(s) : $host\n"; print "#"x70; print "\n\n"; print "Are you pretty sure you would like to implement this [yes/no]: "; my $no = <STDIN>; chomp($no); if ($no =~ /n/i) { print "Okay .. that was it then ... See ya\n\n"; return(0); } else { print "Okay ... let's go then ...\n\n"; } if ($todo == 2) { # create the database if ($db) { my $sth = $dbh->do("CREATE DATABASE $db") || $dbh->errstr; } else { print STDERR "What do you want? You wanted to create new database and add new user, right?\n"; die "But then specify databasename, please\n"; } } if ( ( !$todo ) or not ( $todo =~ m/^[2-8]$/ ) ) { print STDERR "Sorry, select option $todo isn't known inside the program .. See ya\n"; quit(); } my @hosts = split(/,/,$host); if (!$user) { die "username not specified: $user\n"; } if (!$db) { die "databasename is not specified nor *\n"; } foreach $host (@hosts) { # user privileges: SELECT if (($todo == 2) || ($todo == 3)) { $sth = $dbh->do("GRANT SELECT ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr; } elsif ($todo == 4) { # user privileges: SELECT,INSERT,UPDATE,DELETE $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr; } elsif ($todo == 5) { # user privileges: SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr; } elsif ($todo == 6) { # admin privileges: GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS $sth = $dbh->do("GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES,SHOW DATABASES,PROCESS ON $db.* TO $user@\"$host\" IDENTIFIED BY \'$pass\'") || die $dbh->errstr; } elsif ($todo == 7) { # all privileges $sth = $dbh->do("GRANT ALL ON $db.* TO \'$user\'\@\'$host\' IDENTIFIED BY \'$pass\'") || die $dbh->errstr; } elsif ($todo == 8) { # all privileges set to N $sth = $dbh->do("REVOKE ALL ON *.* FROM \'$user\'\@\'$host\'") || die $dbh->errstr; } } $dbh->do("FLUSH PRIVILEGES") || print STDERR "Can't flush privileges\n"; print "Everything is inserted and mysql privileges have been reloaded.\n\n";}#### ask for a new database name###sub newdatabase { my ($answer,$good,$db); print "\n\nWhich database would you like to add: "; while (<STDIN>) { $answer = $_; $good = 0; chomp($answer); if ($answer) { my $sth = $dbh->prepare("SHOW DATABASES") || die $dbh->errstr; $sth->execute || die $dbh->errstr; while (my @r = $sth->fetchrow_array) { if ($r[0] eq $answer) { print "\n\nSorry, this database name is already in use; try something else: "; $good = 1; } } } else { print "You must type something ...\nTry again: "; next; } last if ($good == 0); } $db = $answer; print "The new database $db will be created\n"; return($db);}#### select a database###sub database { my ($answer,$good,$db); print "\n\nWhich database from existing databases would you like to select: \n"; print "You can choose from: \n"; my $sth = $dbh->prepare("show databases") || die $dbh->errstr; $sth->execute || die $dbh->errstr; while (my @r = $sth->fetchrow_array) { print " - $r[0] \n"; } print "Which database will it be (case sensitive). Type * for any: \n"; while (<STDIN>) { $answer = $_; $good = 0; chomp($answer); if ($answer) { if ($answer eq "*") { print "OK, the user entry will NOT be limited to any database"; return("*"); } my $sth = $dbh->prepare("show databases") || die $dbh->errstr; $sth->execute || die $dbh->errstr; while (my @r = $sth->fetchrow_array) { if ($r[0] eq $answer) { $good = 1; $db = $r[0]; last;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -