사용자가 존재하는지 확인


165

사용자 존재 여부를 확인하는 스크립트를 만들고 싶습니다. 아래 논리를 사용하고 있습니다.

# 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

이제 내 스크립트가 제대로 작동합니다.


나는 당신이 사용할 때 명령 $?의 리턴 코드를 얻는다고 생각합니다 test. 아래 답변을 참조하십시오.
user000001

즉,인가 정확한 실행중인 코드? 호출 getent과 명령문 사이에 "echo"디버그 명령문이 if없습니까? 즉 원인이 $?의 종료 상태 확인 echo을하지 전화를 getent.
chepner

4
그래, 당신은 2>&1대신 의미 하는 것 같아요 2&>1.
팀 Ludwinski

코드는 비어 있지 않은 입력에서 작동하지만 $1설정하지 않으면 if 문이 true를 반환합니다. 내 테스트에서 해결책은 $1큰 따옴표 로 묶는 것 getent passwd "$1" > /dev/null 2&>1입니다.
Vince

답변을 표시하십시오
Efren

답변:


292

id명령으로 사용자를 확인할 수도 있습니다 .

id -u name해당 사용자의 ID를 제공합니다. 사용자가 존재하지 않으면 명령 반환 값 ( $?)이 나타납니다.1


3
그것이 내가 사용하는 것입니다. superuser.com/questions/336275/find-out-if-user-name-exists
guettli

24
좋은 대답-잘 작동하는 사소한 조정 ... user_exists = $ (id -u user> / dev / null 2> & 1; echo $?) user_exists = 0 "user"가 있으면 1, 그렇지 않으면 1
Pancho

5
@Pancho 변수 이름이 user_doesnt_exist 여야한다고 생각합니다
Will Sheppard

1
@ WillSheppard : bash의 일반적인 수준의 부울 처리는 내 의견으로는 명확하지 않으며 일반적으로 코드에서 암시 적 부울 추론을 피합니다. 다음은 흥미로운 독서를 만들고 흥미롭게도 bash 목적으로 0 = true 및 <not 0> = false를 선호하며 실제로는 아니지만 부울 관점에서 사용한 변수 이름과 정렬합니다. stackoverflow.com/a/5431932 / 3051627 . stackoverflow.com/questions/2933843/… .
판초

2
@Pancho의 의견 덕분에 void에 오류를 보내고을 수행하면 validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }됩니다. 즉, 사용자가 존재하면 1을 반환하고 존재하지 않으면 0을 반환합니다.
lu1s

32

왜 간단하게 사용하지 않습니까

grep -c '^username:' /etc/passwd

사용자가 있으면 1을 입력합니다 (최대 1 개의 항목이 있으므로). 그렇지 않으면 0을 반환합니다.


19
서버가 다른 시스템을 사용하여 NIS 또는 LDAP와 같은 사용을 관리하는 경우에는 작동하지 않습니다. 이 경우 다음을 사용할 수 있습니다getent passwd | grep -c '^username:'
Toby Jackson

1
사용자 이름이 있으면 "test1"이라고 말하고 "test"라는 새 사용자 이름을 만들려고하면 1이 반환됩니다.
Marin Nedea

2
@MarinNedea :사용자 이름 뒤 의 콜론 은 필드 구분 기호와 일치하여 하위 문자열 일치를 방지하므로 설명하는 효과가 발생하지 않습니다.
Stéphane Gourichon

30

종료 코드를 명시 적으로 확인할 필요가 없습니다. 시험

if getent passwd $1 > /dev/null 2>&1; then
    echo "yes the user exists"
else
    echo "No, the user does not exist"
fi

그래도 문제가 해결되지 않으면에 문제가 getent있거나 생각보다 많은 사용자가 정의되어 있습니다.


23

이것은 내가 Freeswitchbash 시작 스크립트 에서 한 일입니다 .

# 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

14

유효한 사용자 존재를 테스트하기 때문에 id 명령을 사용하는 것이 좋습니다 wrt passwd 파일 항목은 필요하지 않습니다.

if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then 
echo FOUND
fi

참고 : 0은 루트 uid입니다.


12

나는 그런 식으로 그것을 사용하고 있었다 :

if [ $(getent passwd $user) ] ; then
        echo user $user exists
else
        echo user $user doesn\'t exists
fi

9

가장 간단한 해결책은 다음과 같습니다.

if id -u user >/dev/null 2>&1; then
    echo user exists
else
    echo user missing
fi

>/dev/null 2>&1단축 될 수있다 &>/dev/null배쉬에서.


네 감사합니다!
Zane Hitchcox

7

Linux 사용자 유무를 확인하는 스크립트

스크립트 사용자 존재 여부 확인

#! /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

2
왜 사용 cat합니까? grep $USER_NAME /etc/passwd >/dev/null 2>&1
Alexx Roche

네 Alexx Roche, 고양이를 사용할 필요가 없습니다. 초보자를위한 개념을 더 잘 시각화하기 위해 사용합니다.
Bakul Gupta

6

답변이 늦었지만 finger사용자에 대한 추가 정보도 표시합니다

  sudo apt-get finger 
  finger "$username"

OP는 데비안을 사용하지 않을 수 있습니다.
Narendra-choudhary

3

실제로 나는 문제를 재현 할 수 없습니다. 질문에 쓰여진 스크립트는 $ 1이 비어있는 경우를 제외하고는 잘 작동합니다.

그러나의 리디렉션과 관련된 스크립트에 문제가 stderr있습니다. 두 가지 형태 만 &>>&존재, 귀하의 경우에는 사용하려는 >&. 이미 리디렉션되었으므로 stdout양식 &>이 작동하지 않습니다. 이 방법으로 쉽게 확인할 수 있습니다.

getent /etc/passwd username >/dev/null 2&>1
ls

1현재 디렉토리에 이름이 지정된 파일이 표시됩니다 . 당신은 사용하고자하는 2>&1대신에, 또는 이것을 사용 :

getent /etc/passwd username &>/dev/null

이것은 또한 리디렉션 stdoutstderr/dev/null.

경고 리디렉션 stderr하는 /dev/null것은 좋은 생각이 아닙니다. 일이 잘못되면 이유를 알 수 없습니다.


3

사용자 정보는 / etc / passwd에 저장되므로 "grep 'usename'/ etc / passwd"를 사용하여 사용자 이름이 있는지 확인할 수 있습니다. "id"쉘 명령을 사용할 수있는 반면, 사용자 ID와 그룹 ID를 인쇄합니다. 사용자가 없으면 "no such user"메시지를 인쇄합니다.


2

서버에 로그인하십시오. grep "username"/ etc / passwd 존재하는 경우 사용자 정보를 표시합니다.


3
"username"이 포함 된 모든 사용자 이름과도 일치합니다. 예 : "some_username" 당신이하고 싶을 것if grep -q "^username:" /etc/passwd; then ...
maedox

2

sed 사용하기 :

username="alice"
if [ `sed -n "/^$username/p" /etc/passwd` ]
then
    echo "User [$username] already exists"
else
    echo "User [$username] doesn't exist"
fi

1

셸 구현 (예 : Busybox vs. 어른)에 따라 [운영자는을 변경하여 프로세스를 시작할 수 있습니다 $?.

시험

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

변경 $?하면 같은 결과가 나옵니다. 이것은 bash 버전입니다.GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
slayedbylucifer

시도if test "$RES" == "0"; then ...
Eugen Rieck

1
$?[실행 하기 전에 확장 되므로 문제가되지 않습니다.
chepner

1
명령 결과를 테스트하는 대신 명령을 직접 테스트 할 수 있습니다. if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
GMartinez

1

다음은 OS 배포를 확인하고 존재하지 않는 경우 사용자를 생성하고 사용자가 존재하는 경우 아무것도 수행하지 않는 스크립트입니다.

#!/bin/bash

# Detecting OS Ditribution
if [ -f /etc/os-release ]; then
    . /etc/os-release
    OS=$NAME
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
elif [ -f /etc/lsb-release ]; then
    . /etc/lsb-release
    OS=$DISTRIB_ID
else
    OS=$(uname -s)
fi

 echo "$OS"

 user=$(cat /etc/passwd | egrep -e ansible | awk -F ":" '{ print $1}')

 #Adding User based on The OS Distribution
 if [[ $OS = *"Red Hat"* ]] || [[ $OS = *"Amazon Linux"* ]] || [[ $OS = *"CentOS"*  
]] && [[ "$user" != "ansible" ]];then
 sudo useradd ansible

elif [ "$OS" =  Ubuntu ] && [ "$user" != "ansible" ]; then
sudo adduser --disabled-password --gecos "" ansible
else
  echo "$user is already exist on $OS"
 exit
fi

0

some_user존재하지 않는 경우 시스템 사용자 작성

if [[ $(getent passwd some_user) = "" ]]; then
    sudo adduser --no-create-home --force-badname --disabled-login --disabled-password --system some_user
fi

0

나는이 멋진 한 줄 솔루션을 좋아한다

getent passwd username > /dev/null 2&>1 && echo yes || echo no

그리고 스크립트에서 :

#!/bin/bash

if [ "$1" != "" ]; then
        getent passwd $1 > /dev/null 2&>1 && (echo yes; exit 0) || (echo no; exit 2)
else
        echo "missing username"
        exit -1
fi

사용하다:

[mrfish@yoda ~]$ ./u_exists.sh root
yes
[mrfish@yoda ~]$ echo $?
0

[mrfish@yoda ~]$ ./u_exists.sh
missing username
[mrfish@yoda ~]$ echo $?
255

[mrfish@yoda ~]$ ./u_exists.sh aaa
no
[mrfish@indegy ~]$ echo $?
2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.