사용자가 유효한지, 현재 로그인되어 있는지 확인하는 스크립트를 작성하려고 합니다. 사용자가 유효한 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