以编程方式更改密码


12

在当前版本的Raspian中,我知道可以从命令行更改当前登录用户的密码,如下所示:

sudo passwd

然后会提示用户两次输入新密码。这将产生如下输出:

Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

我想知道是否有可能以编程方式更改密码,例如从Shell脚本更改密码。

我正在尝试制作一个配置脚本以部署在我的Raspberry Pis上,并且我不想手动为其输入新密码。


1
要更改当前用户的密码,您无需添加前缀sudo。如果使用sudo,则可以为任何用户强制使用新密码,而无需知道该用户的当前密码。
roaima

expect(1)也可以提供帮助。
SailorCire

以编程方式更改密码时,请务必考虑安全隐患。
乔什·哈布达斯

Answers:


19

您正在寻找chpasswd命令。您将执行以下操作:

echo 'pi:newpassword' | chpasswd # change user pi password to newpassword

请注意,至少在默认PAM配置下,它需要以root身份运行。但是大概以root身份运行对于系统部署脚本来说不是问题。

另外,您可以通过向其输入多行输入来一次处理多个用户。


9

另一种选择是yes在脚本中使用命令。

yes newpassword | passwd youruser

这将发送newpassword到的passwd命令youruser

应该提到的是,通过脚本设置/修改用户密码可能会带来安全风险,应尽可能避免使用。

编辑:

此答案需要root访问。抱歉,以前没有提到这一点。这是执行需要根访问权限的管理任务时使用的一种方法。


你有尝试过吗?
roaima

是。我已经使用这种方法多年了。我在发布答案之前进行了测试,现在又进行了测试。
蒂莫西·马丁

即使假设是passwdstdin终端而不是从终端(键盘)读取数据,当passwd首先提示输入用户的旧密码,然后提示输入新密码时,这又如何工作?
roaima

@roaima可能是Timothy以root身份运行它(这将解释为什么他youruser最终需要这样做)。它可能在某处工作……
derobert

1
@roaima passwdLinux的影子实用程序中的命令接受重定向的输入(例如,不同于OpenSSH ssh)。但是,使用yes它并不是一个好主意:它将密码暴露给在错误时间查看进程列表的窥探者。使用echo不会有这个缺陷,因为它是内置的shell。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.