我正在学习 Linux bash 脚本编写,并在没有通知的情况下遇到错误。我想了解为什么我不能同时更改密码和使其过期?此外,没有任何错误或通知我做错了事情。让我们来看看:
# assuming root
USERNAME=foo
PASSWORD=bar
useradd -m $USERNAME
echo "$PASSWORD" | passwd -e --stdin $USERNAME
输出:
Expiring password for user turing.
passwd: Success
但是当我尝试su - foo
使用密码“bar”时,我无法登录。只有这个是正确的:
# assuming root
USERNAME=foo
PASSWORD=bar
useradd -m $USERNAME
echo "$PASSWORD" | passwd --stdin $USERNAME
passwd -e $USERNAME
你能解释一下为什么吗?
答案1
您必须运行两个单独的命令的原因,根据 passwd 的源代码:
https://pagure.io/passwd/blob/master/f/passwd.c
密码过期是否总是在 --stdin 标志之前进行检查,并且将导致 main 函数返回,这本质上意味着在这种情况下程序退出。
if (passwd_flags & PASSWD_EXPIRE) {
printf(_("Expiring password for user %s.\n"), username);
retval = pwdb_update_aging(username, -2, -2, -2, -2, 0);
printf("%s: %s\n", progname,
retval ==
0 ? _("Success") : _("Error"));
audit_log_acct_message(audit_fd, AUDIT_USER_MGMT,
NULL, "expired-password", NULL, pwd->pw_uid,
NULL, NULL, NULL, retval == 0);
return retval;
}
命令行选项的实际解析发生在这一点之前,因此顺序并不重要,在此版本的 passwd 中,过期标志将始终在 --stdin 标志之前考虑。
这意味着您始终必须将passwd -e <username>
andpasswd <username>
作为单独的命令运行,因为从逻辑上讲不可能在同一命令语法中同时执行过期和密码更改。