사용자가 유효한 ID를 입력할 때까지 기다리는 스크립트

사용자가 유효한 ID를 입력할 때까지 기다리는 스크립트

사용자가 유효한지, 현재 로그인되어 있는지 확인하는 스크립트를 작성하려고 합니다. 사용자가 유효한 ID를 입력할 때까지 기다리게 할 수 없습니다.


while read one
do

if id "$one" >/dev/null 2>1;

then
Matrix=$(who -u |grep -q "$one" || test && echo "logged on" || echo "not logged on")

fullname=$(grep "$one" /etc/passwd | cut -d ':' -f5 | sort -k 2 | tr ",,:" " " | awk '{print $2,$1}')

echo "$fullname is $Matrix"

else
echo "user doesnt exist"

fi
break
done
echo "maybe"

답변1

read유틸리티는기다리다데이터가 입력될 때까지

read username

사용자가 쉘에 저장되는 내용을 입력할 때까지 반환되지 않습니다 $username.

"대기"가 "유효한 사용자 이름이 입력될 때까지 반복"을 의미하는 경우 다음과 같이 할 수 있습니다.

while true; do
    read -p 'Enter username: ' username
    if id "$username" >/dev/null 2>&1; then
        printf 'Username "%s" is valid\n' "$username"
        break
    fi
    printf 'Username "%s" is not valid\n' "$username"
    echo 'Try again...'
done

이는 무한 루프에 빠지고 사용자가 유효한 사용자 이름을 입력한 경우에만 종료됩니다. 해당 유틸리티를 사용하여 유효성을 확인하세요 id. 코드도 해당 유틸리티를 사용하는 것으로 보입니다. 유틸리티가 오류 없이 종료되면 탈출 루프를 통과합니다 break.

이 루프 후에는 에 유효한 사용자 이름이 있음을 알 수 있습니다 $username.

사용자가 로그인했는지 테스트하려면 who이전과 같이 사용할 수 있습니다(여기에서는 약간 수정됨).

if who | grep -q "^$username\>"; then
    printf 'User "%s" is logged on\n' "$username"
else
    printf 'User "%s" is not logged on\n' "$username"
fi

사용자 이름은 출력의 첫 번째 열에서 찾을 수 있습니다 who. 따라서 사용자 이름을 줄의 시작 부분에 고정합니다 ^. 또한 사용자 이름 끝에 단어 경계가 일치하는지 확인합니다 \>(그래서 arthur실제로 검색할 때 사용자를 감지하지 못합니다 art).

대신 유틸리티를 who사용할 수 있습니다 users.

사용자의 전체 이름을 얻으려면 다음을 수행하십시오.

name=$( getent passwd "$username" | cut -d : -f 5 | cut -d , -f 1 )

getent유틸리티는 비밀번호 데이터베이스나 그 안의 항목 등을 얻는 데 사용됩니다. 여기서는 관심 있는 특정 사용자에 대한 비밀번호 데이터베이스 항목을 가져오는 데 이를 사용합니다. 그런 다음 GECOS 필드의 첫 번째 쉼표로 구분된 값에서 전체 이름을 구문 분석합니다.

이 유틸리티를 사용하여 유효한 사용자 이름을 테스트할 수 있으므로 getent(잘못된 사용자 이름을 사용하는 경우 0이 아닌 종료 상태를 반환하므로) 나중에 수행할 필요 없이 프로세스 중에 사용자의 전체 이름을 얻을 수 있습니다. 쿼리를 해보세요.

종합해보면:

#!/bin/bash

while true; do
    read -p 'Enter username: ' username
    if id "$username" >/dev/null 2>&1; then
        printf 'Username "%s" is valid\n' "$username"
        break
    fi
    printf 'Username "%s" is not valid\n' "$username"
    echo 'Try again...'
done

name=$( getent passwd "$username" | cut -d : -f 5 | cut -d , -f 1 )
printf 'Full name of "%s" is %s\n' "$username" "$name"

if who | grep -q "^$username"; then
    printf '%s is logged on\n' "$name"
else
    printf '%s is not logged on\n' "$name"
fi

답변2

잘못된 결과를 루프에 미리 설정하고, 루프 내에서 작업을 수행하고, 다음 반복 중에 실제 결과를 요청할 수 있습니다.

그것은 다음과 같습니다:

#!/bin/bash
ok=1
while [ $ok -gt 0 ]; do
    read one
    < your check of $one >
    ok=$?
done

관련 정보