목적:사용자의 비밀번호가 잠겨 있는지 확인하십시오 /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
파일을 수동으로 구문 분석 하지 마세요
가능한 모든 시나리오를 고려하지 못하면 이러한 파일을 구문 분석하기가 어렵습니다(예: 비활성화된 비밀번호는 종종 단일로 인코딩됩니다 *
. 다른 솔루션이 이를 처리할 수 있습니까?).
또한 인증은 shadow
NIS나 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
( 옵션)을 통해 수행하는 것이 가장 좋습니다 .--lock
shadow
답변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"]
비교합니다 . 그렇지 않은 경우 필드가 숫자처럼 보이면(예: 일치 또는 일치 발생) 숫자 비교를 수행하게 될 수 있습니다 ""
.inf
INF
Infinity
그렇지 않은 경우 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=: 이동하여 코드를 더 간단하게 만들었습니다.