Linux bash スクリプトを学習していますが、予告なくエラーが発生しました。なぜパスワードを変更して同時に期限切れになれないのか疑問に思います。また、私が何か間違っているというエラーや通知もありません。みましょう:
# assuming root
USERNAME=foo
PASSWORD=bar
useradd -m $USERNAME
echo "$PASSWORD" | passwd -e --stdin $USERNAME
出力:
Expiring password for user turing.
passwd: Success
ただし、パスワード「bar」を使用しようとするとsu - foo
ログインできません。これだけが正しいです:
# assuming root
USERNAME=foo
PASSWORD=bar
useradd -m $USERNAME
echo "$PASSWORD" | passwd --stdin $USERNAME
passwd -e $USERNAME
理由を説明できますか?
ベストアンサー1
passwdのソースコードによると、2つの別々のコマンドを実行する理由は次のとおりです。
https://pagure.io/passwd/blob/master/f/passwd.c
パスワードの有効期限は常に --stdin フラグの前に確認され、基本機能が返されます。これは本質的にこの場合プログラムが終了することを意味します。
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>
コマンドを実行する必要があることを意味します。passwd <username>