IT story

사용자가 존재하는지 확인

hot-time 2020. 6. 23. 07:22
반응형

사용자가 존재하는지 확인


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

# 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있거나 생각보다 많은 사용자가 정의되어 있습니다.


이것은 내가 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

유효한 사용자 존재를 테스트하기 때문에 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

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

답변이 늦었지만 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

반응형