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의 소스 코드에 따르면 두 개의 개별 명령을 실행해야 하는 이유는 다음과 같습니다.
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>