사용자 존재 여부를 확인하는 스크립트를 만들고 싶습니다. 아래 논리를 사용하고 있습니다.
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
따라서 사용자가 존재하면 성공한 것입니다. 그렇지 않으면 사용자가 존재하지 않습니다. 아래 명령을 bash 스크립트에 넣었습니다.
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
이제 내 스크립트는 항상 사용자가 무엇이든 관계없이 존재한다고 말합니다.
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
위의 조건이 항상 참으로 평가되고 사용자가 존재한다고 말하는 이유는 무엇입니까?
내가 어디로 잘못 가고 있니?
최신 정보:
모든 답변을 읽은 후 스크립트에서 문제를 발견했습니다. 문제는 getent
출력 을 리디렉션하는 방식이었습니다 . 그래서 모든 리디렉션 항목을 제거하고 getent
다음과 같이 라인을 만들었습니다 .
getent passwd $user > /dev/null
이제 내 스크립트가 제대로 작동합니다.
답변
id
명령으로 사용자를 확인할 수도 있습니다 .
id -u name
해당 사용자의 ID를 제공합니다. 사용자가 존재하지 않으면 명령 반환 값 ( $?
)이 나타납니다.1
답변
왜 간단하게 사용하지 않습니까
grep -c '^username:' /etc/passwd
사용자가 있으면 1을 입력합니다 (최대 1 개의 항목이 있으므로). 그렇지 않으면 0을 반환합니다.
답변
종료 코드를 명시 적으로 확인할 필요가 없습니다. 시험
if getent passwd $1 > /dev/null 2>&1; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
그래도 문제가 해결되지 않으면에 문제가 getent
있거나 생각보다 많은 사용자가 정의되어 있습니다.
답변
이것은 내가 Freeswitch
bash 시작 스크립트 에서 한 일입니다 .
# Check if user exists
if ! id -u $FS_USER > /dev/null 2>&1; then
echo "The user does not exist; execute below commands to crate and try again:"
echo " root@sh1:~# adduser --home /usr/local/freeswitch/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $FS_USER"
echo " ..."
echo " root@sh1:~# chown freeswitch:daemon /usr/local/freeswitch/ -R"
exit 1
fi
답변
유효한 사용자 존재를 테스트하기 때문에 id 명령을 사용하는 것이 좋습니다 wrt passwd 파일 항목은 필요하지 않습니다.
if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then
echo FOUND
fi
참고 : 0은 루트 uid입니다.
답변
나는 그런 식으로 그것을 사용하고 있었다 :
if [ $(getent passwd $user) ] ; then
echo user $user exists
else
echo user $user doesn\'t exists
fi
답변
가장 간단한 해결책은 다음과 같습니다.
if id -u user >/dev/null 2>&1; then
echo user exists
else
echo user missing
fi
이 >/dev/null 2>&1
단축 될 수있다 &>/dev/null
배쉬에서.