修改linux密码同时过期

修改linux密码同时过期

我正在学习 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>作为单独的命令运行,因为从逻辑上讲不可能在同一命令语法中同时执行过期和密码更改。

相关内容