我怎样才能改变一个MySQL的用户密码,而不需要在控制台上直接input呢?

我已经看到了在MySQL中设置密码的各种方法,例如:

GRANT USAGE ON db.* to 'dave'@'localhost' IDENTIFIED BY 'supersecretpassword'); SET PASSWORD [FOR 'dave'@'localhost'] = PASSWORD('reallysecretpassword'); UPDATE mysql.user SET PASSWORD=PASSWORD('confidentialpassword') WHERE user='dave' AND host='localhost'; 

但是他们似乎涉及在SQL命令中清晰地input密码,这引起了一些疑虑,比如是否在我的SQL命令历史logging中,或者是否有人在我的肩上,或者是否可以窥视我的terminal回滚。

有没有反正我可以让MySQL提示我input密码而不将它回显到屏幕上(和Unix用passwd )?

正如Federico Sierra在评论中指出的那样,您可以使用mysqladminpassword命令来更改您可以login的任何用户的密码。

以前密码必须在命令行中提供,但是从5.7开始,如果密码被省略,它会提示input密码。

从mysqladmin文档 :

password new_password

设置一个新的密码。 这将密码更改为您使用mysqladmin连接到服务器的帐户的新密码。 因此,下次您使用同一个帐户调用mysqladmin (或任何其他客户端程序)时,您将需要指定新的密码。

[…]

在MySQL 5.7中, password命令后可以省略新密码。 在这种情况下, mysqladmin会提示input密码值,这样可以避免在命令行上指定密码。 只有在密码是mysqladmin命令行上的最后一个命令时,才应该忽略密码值。 否则,下一个参数被作为密码。

所以,如果你知道用户的密码,并且在你允许login的主机上,那么你可以通过以下方式更改他们的密码:

 mysqladmin -u <user_name> [-p] password 

例如

 $ mysqladmin -u dave -p password Enter password: New password: Confirm new password: 

当然,如果您拥有合适的权限,您可以更改用户的初始密码和主机以使您能够login。但是,这有其自身的风险,因此并不理想。

注意:我在这里回答我自己的问题,但是我不打算将其标记为已接受,因为我不满意这是更改用户密码的一种通常安全的方法。

一个包装脚本在某些语言(我会使用PHP和通过cli运行,因为它会从我已经有的东西快速复制/粘贴),执行,然后删除,或至less再次编辑更改所有密码“changeme “或类似的。

密码散列algorithm相当简单,可以用其他编程语言复制。

根据https://www.pythian.com/blog/hashing-algorithm-in-mysql-password/ ,在MySQL 4.1及更高版本中, PASSWORD函数将密码string的(二进制)SHA1取两次,然后返回作为以星号开头的hexstring。

例如,在SQL中:

 > SELECT PASSWORD('test'), SHA1(UNHEX(SHA1('test'))); +-------------------------------------------+------------------------------------------+ | PASSWORD('test') | SHA1(UNHEX(SHA1('test'))) | +-------------------------------------------+------------------------------------------+ | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | 94bdcebe19083ce2a1f959fd02f964c7af4cfc29 | +-------------------------------------------+------------------------------------------+ 

在控制台上使用MySQL代码会影响目的,但是这里有一个相当简单的Python脚本,它会提示input密码,并从中生成与MySQL兼容的密码string。

 import hashlib, getpass def mysql_password(p): return '*' + hashlib.sha1( hashlib.sha1(p).digest() ).hexdigest().upper() password = getpass.getpass() print(mysql_password(password)) 

这可以直接分配给MySQL中的用户:

 SET PASSWORD FOR 'dave'@'localhost' = '*94BDCE...'; 

所以它只是在控制台/ MySQL历史上所见过的密码散列。 (只有通过mysql.user表访问的人才能看到)。