사용자가 존재하는지 확인
사용자 존재 여부를 확인하는 스크립트를 만들고 싶습니다. 아래 논리를 사용하고 있습니다.
# 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
스크립트 사용자 존재 여부 확인
#! /bin/bash
USER_NAME=bakul
cat /etc/passwd | grep ${USER_NAME} >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "User Exists"
else
echo "User Not Found"
fi
답변이 늦었지만 finger
사용자에 대한 추가 정보도 표시합니다
sudo apt-get finger
finger "$username"
Actually I cannot reproduce the problem. The script as written in the question works fine, except for the case where $1 is empty.
However, there is a problem in the script related to redirection of stderr
. Although the two forms &>
and >&
exist, in your case you want to use >&
. You already redirected stdout
, that's why the form &>
does not work. You can easily verify it this way:
getent /etc/passwd username >/dev/null 2&>1
ls
You will see a file named 1
in the current directory. You want to use 2>&1
instead, or use this:
getent /etc/passwd username &>/dev/null
This also redirects stdout
and stderr
to /dev/null
.
Warning Redirecting stderr
to /dev/null
might not be such a good idea. When things go wrong, you will have no clue why.
user infomation is stored in /etc/passwd, so you can use "grep 'usename' /etc/passwd" to check if the username exist. meanwhile you can use "id" shell command, it will print the user id and group id, if the user does not exist, it will print "no such user" message.
Login to the server. grep "username" /etc/passwd This will display the user details if present.
Using sed:
username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
echo "User [$username] already exists"
else
echo "User [$username] doesn't exist"
fi
Depending on your shell implementation (e.g. Busybox vs. grown-up) the [
operator might start a process, changing $?
.
Try
getent passwd $1 > /dev/null 2&>1
RES=$?
if [ $RES -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
참고URL : https://stackoverflow.com/questions/14810684/check-whether-a-user-exists
'IT story' 카테고리의 다른 글
알파인 기반 도커 이미지와 함께 bash를 사용하는 방법은 무엇입니까? (0) | 2020.06.23 |
---|---|
VB.NET의 여러 줄 문자열 (0) | 2020.06.23 |
WPF가 현재 디자인 모드에서 실행 중인지 확인하는 방법이 있습니까? (0) | 2020.06.23 |
Guzzlehttp-Guzzle 6에서 응답 본문을 얻는 방법은 무엇입니까? (0) | 2020.06.23 |
루비에서 해시 배열을 정렬하는 방법 (0) | 2020.06.23 |