我正在尝试将 MD5 密码传递给 chpasswd,但它似乎不起作用。
echo username:$(openssl passwd -1 -salt salt password)
然后我尝试将其传递给chpasswd
更改密码
echo 'username:$1$salt$aldkjflsfj' | /usr/sbin/chpasswd -e
然而,当我这样做时,密码更改似乎没有生效——/etc/shadow
已更新,但如果我尝试使用密码,它不起作用。
这确实有效:
echo username:password | /usr/sbin/chpasswd
passwd
也有效
更多信息:
$ S=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 5 | head -n 1)
$ echo username:$(openssl passwd -1 -salt "$S" password)
username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/
$ echo 'username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/' | chpasswd -e
$ grep username /etc/shadow
username:$1$nPkvS$eKljAIRsFLXOffXti.ZtO/:16722:0:99999:7:::
答案1
参数必须加引号,否则 shell 会验证特殊字符在这些参数中:
echo "username:"$(openssl passwd -1 -salt "$salt" "$password")
此处使用双引号,让 shell 计算变量。
现在,该echo
命令也必须被引用:
echo 'username:$1$salt$aldkjflsfj' | ...
此处使用单引号,因为 $ 符号是条目的一部分并且必须保留。
警告: 我不建议这样更改密码。这些命令以及明文密码可以在ps
和的列表中看到top
。openssl
针对这种情况有一种机制,可以从文件中读取密码。