su 인증 실패 경고를 억제하는 방법은 무엇입니까?

su 인증 실패 경고를 억제하는 방법은 무엇입니까?

' ' 계정을 생성 diag하고 만료( )되도록 설정했습니다 usermod --expiredate 1. 그런 다음 로그인하기 위해 실행하려는 스크립트가 있으므로 스크립트에서 다음을 사용합니다.

su -s /bin/bash - diag

출력은 다음과 같습니다.

Your account has expired; please contact your system administrator
su: Authentication failure
(Ignored)
diag@computer:~$

그러면 예상대로 계정을 사용할 수 있습니다.

만료된 계정에 대한 경고인 처음 세 줄을 표시하지 않으려고 합니다. 2> /dev/null명령 끝에 추가하려고 시도했지만 이로 인해 bash의 모든 출력이 억제되었습니다. 명령을 입력하고 결과를 볼 수 있는 빈 응답만 받았지만 bash 프롬프트는 표시되지 않습니다. 추가하려고 시도했지만 > /dev/null아무것도 작동하지 않았습니다.

그래서 나는 분명히 su그것의 모든 출력을 파이핑하고 있다고 추론했습니다 stderr. su처음 세 줄만 표시하지 않고 계정이 만료되지 않은 것처럼 정상적으로 작동하려면 어떻게 해야 합니까 ?

답변1

내가 아는 한, 사용자 계정 만료 및 잠금은 기능적으로 동일합니다. 로그인 시도는 실패하고 SSH 시도는 실패합니다. 적어도 내가 아는 한 그들은 동일합니다.

따라서 내 스크립트에서는 이제 사용자가 만료되었는지 감지하고 그렇다면 사용자를 잠그고 만료를 "사용 안 함"으로 설정합니다.

다음과 같습니다.

# Takes 1 parameter, the username to check
# Returns 0 if the user is expired, or 1 if it is not expired.
function userExpired()
{
    # These day values are just numbers, the number of days since the epoch.
    local expireDay=`grep $1 /etc/shadow | cut -d: -f8`

    # If diag has no expiration date, it will be empty.
    if [[ "$expireDay" -eq "" ]] ; then
        return 1
    fi

    local today=`perl -e 'print int(time/(60*60*24))'`
    local daysUntilExpire=`echo $expireDay - $today | bc`

    [[ $daysUntilExpire -lt 0 ]]
}

# Check if the diag user is expired and if so, lock and unexpire it.
userExpired diag && {
    usermod --lock --expiredate -1 diag
}

다음 코드를 기반으로 userExpired 함수를 작성했습니다.이 포럼 게시물(내 코딩 스타일과 더 나은 변수 이름 지정에 맞게 수정되었습니다.)

답변2

stderr를 stdout으로 리디렉션

su -s /bin/bash - diag 2>&1 >/dev/null

아직 시도하지는 않았지만 효과가 있을 것으로 예상됩니다(집에 도착하면 곧 업데이트될 예정입니다).

discard=$(su -s /bin/bash - diag)

관련 정보