BASH: /etc/shadow 사용자 비밀번호가 잠겨 있는지 확인하세요.

BASH: /etc/shadow 사용자 비밀번호가 잠겨 있는지 확인하세요.

목적:사용자의 비밀번호가 잠겨 있는지 확인하십시오 /etc/shadow. 즉, /etc/shadow의 두 번째 필드(사용자의 해시된 비밀번호 포함)에 있는 첫 번째 문자가 느낌표('!')인지 확인하십시오.

원하는 출력:$disabled"True" 또는 "False"를 포함하는 이름의 변수

사용자 이름은 $uname변수에 있으며 다음과 같이 했습니다.

disabled=`cat /etc/shadow |grep $uname |awk -F\: '{print$2}'`
# I now have the password and need one more pipe into the check for the character
# which is where I'm stuck. I would like to do like (in PHP syntax):
| VARIABLE=="!"?"True":"False"`

이것은 루트 권한으로 Cron에 의해 실행되어 필요한 모든 정보에 액세스할 수 있는 스크립트의 조각입니다.

답변1

shadow파일을 수동으로 구문 분석 하지 마세요

가능한 모든 시나리오를 고려하지 못하면 이러한 파일을 구문 분석하기가 어렵습니다(예: 비활성화된 비밀번호는 종종 단일로 인코딩됩니다 *. 다른 솔루션이 이를 처리할 수 있습니까?).

또한 인증은 shadowNIS나 LDAP를 통해 이루어지지 않을 수도 있습니다. 이 모든 것을 처리하는 몇 가지 표준 도구가 있습니다. 이 경우 passwd:

-S, --상태 계정 상태 정보를 표시합니다. 상태 정보는 7개의 필드로 구성됩니다. 첫 번째 필드는 사용자의 로그인 이름입니다. 두 번째 필드는 사용자 계정에 잠긴 비밀번호(L)가 있는지, 비밀번호가 없는지(NP), 사용 가능한 비밀번호가 있는지(P)를 나타냅니다. 세 번째 필드에는 마지막 비밀번호 변경 날짜가 표시됩니다. 다음 4개 필드는 비밀번호의 최소 기간, 최대 기간, 경고 기간 및 비활성 기간입니다. 이 연령은 일 단위로 표시됩니다.

그래서 passwd -S | cut -d ' ' -f 2필요한 것을 생산할 것입니다. 간단한 if/then은 이를 원하는 변수로 변환합니다.

if [ "$(passwd -S "$USER" | cut -d ' ' -f 2)" = "P" ]
then
    disabled="False"
else
    disabled="True"
fi

사용자 비밀번호를 잠그는 경우에도 마찬가지입니다. 이는 수동으로 편집하는 것보다 usermod( 옵션)을 통해 수행하는 것이 가장 좋습니다 .--lockshadow

답변2

모든 작업을 수행하려면 awk를 사용하면 어떨까요?

awk -F: '/<username>/ {if(substr($2,1,1) == "!"){print "True"} else {print "False"}}' /etc/shadow

답변3

U=$user LC_ALL=C awk -F: < /etc/shadow '
  $1 "" == ENVIRON["U"] {
    user_found = 1
    if ($2 ~ /^!/) {
      print "True"
      exit 0
    } else {
      print "False"
      exit 1
    }
  }
  END {
    if (!user_found) {
      print "False"
      print "User "ENVIRON["U"]" not found" > "/dev/stderr"
      exit 2
    }
  }'

$1 "" == ENVIRON["U"]첫 번째 필드를 어휘와 ENVIRON["U"]비교합니다 . 그렇지 않은 경우 필드가 숫자처럼 보이면(예: 일치 또는 일치 발생) 숫자 비교를 수행하게 될 수 있습니다 "".infINFInfinity

그렇지 않은 경우 LC_ALL=C일부 awk구현에서는 strcoll()어휘 ==비교를 사용하기 때문에 동일하게 정렬된 사용자 이름에 대해 잘못된 항목을 검사하게 될 수 있습니다.

답변4

passwd 필드가 문자열인 경우 사용자가 잠겨 있지만 보안상의 이유로 루트만 읽을 수 있으므로 *LK*확인할 수 없습니다 ./etc/shadow

권한이 문제가 되지 않으면 다음을 시도해 보십시오.

while IFS=: read USER PW REST; do 
    if [ "$USER" = "$uname" ]; then 
            if [ "$PW" = "*LK*" ]; then 
                    echo "$uname" Locked 
            fi 
    fi 
done < /etc/shadow 

편집: IFS=: 이동하여 코드를 더 간단하게 만들었습니다.

관련 정보