2014-03-28 59 views
3

我需要使用Perl脚本更改几个mysql密码。在更改数据库条目时以下方法可行,但当我为mysql用户更改修改时,会将它重置为空密码。在它的末尾“刷新特权”也很好,但我还没有找到该方法。如何使用Perl更改mysql密码

#!/usr/bin/perl 

use DBI; 
use strict; 

my $newpass = "newpass"; 
my $driver = "mysql"; 
my $database = "mysql"; 
my $dsn = "DBI:$driver:database=$database"; 
my $dbh = DBI->connect($dsn, 'root', 'mysql') or die $DBI::errstr; 
my $sth = $dbh->prepare("update user set password='$newpass' where User='admin'"); 
$sth->execute() or die $DBI::errstr; 
$sth->finish(); 
$dbh->{AutoCommit} = 0; 
$dbh->commit or die $DBI::errstr; 
+0

您正在使用哪个版本的MySQL? – titanofold

回答

3

你错过一对夫妇的步骤。 使用PASSWORD()命令并使用'admin'而不是'root',并添加flush priv。 我为您重写了脚本,在这里:

#!/usr/bin/perl 

use DBI; 
use strict; 

my $newpass = "newpass"; 
my $driver = "mysql"; 
my $database = "mysql"; 
my $dsn = "DBI:$driver:database=$database"; 
my $dbh = DBI->connect($dsn, 'root', 'mysql') or die $DBI::errstr; 
$dbh->{AutoCommit} = 0; 
my $sth = $dbh->prepare("update user set password=PASSWORD('$newpass') where User='root'"); 
$sth->execute() or die $DBI::errstr; 
$dbh->do('FLUSH PRIVILEGES') or die $DBI::errstr; 
$sth->finish(); 
$dbh->commit or die $DBI::errstr; 
0

你想使用SET PASSWORD语法:

SET PASSWORD FOR 'username'@'localhost' = PASSWORD('cleartext password'); 
1

更改此:

my $sth = $dbh->prepare("update user set password='$newpass' where User='admin'"); 

进入这个:

my $sth = $dbh->prepare("update mysql.user set Password=Password('$newpass') 
         where User='admin' and Host='localhost'"); 
+0

这样做。不过,我仍然必须运行“冲洗权限”才能使更改生效。 –

+0

你能解释为什么你添加了主机规范吗? – msouth

+0

@msouth,我添加了主机规范,因为在某些情况下,有多个同名的帐户(例如:admin @ localhost,[email protected],admin @ remoteip等) – Hackerman