目标:使用 shell 脚本自动创建用户帐户。
脚本:
#!/bin/bash
USERNAME="catty"
PASSWORD="$USERNAME@123"
useradd -m $USERNAME -p $PASSWORD
我如何在终端中运行脚本:sudo sh Scripts/test.sh
会发生什么:用户帐户已成功创建
问题:当我在运行脚本后尝试登录并输入正确的密码(在这种情况下为“catty@123”)时,无法进行身份验证。
所以我用 cat
检查了 /etc/shadow
。我注意到我的密码如预期的那样是散列形式,但是 catty 的不是。然后,我手动更改了她的密码,然后再次检查了文件,它被散列并允许我成功登录。
为什么会发生这种情况,解决方案是什么?
回答1
从 man 8 useradd
-
-p, --password PASSWORD The encrypted password, as returned by crypt(3). The default is to disable the password.
这意味着 useradd
期望提供给 -p
的参数是密码的散列形式,并将其添加到 /etc/shadow
而不更改它。
这就是密码未散列存储在 /etc/shadow
文件中的原因。这也是您无法登录的原因,因为 login
程序在将您输入的密码与 /etc/shadow
中的条目匹配之前对其进行哈希处理,并且 kitty@123
的哈希版本与 kitty@123
不匹配。
解决办法是什么?
AFAIK 没有现成的 CLI 程序可以使用 crypt(3)
加密字符串。
附言我现在不在类似 UNIX 的机器上,所以我无法对此进行测试,但您可以尝试将密码通过管道传送到 passwd
并查看是否有效。
echo "$PASSWORD" | passwd