Проверьте, существует ли пользователь

Я хочу создать script, чтобы проверить, существует ли пользователь. Я использую следующую логику:

# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2

Итак, если пользователь существует, то у нас есть успех, иначе пользователь не существует. Я поставил выше команду в bash script, как показано ниже:

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

Теперь мой script всегда говорит, что пользователь существует независимо от того, что:

# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists

Почему вышеупомянутое условие всегда оценивается как TRUE и говорит, что пользователь существует?

Где я иду не так?

UPDATE:

После прочтения всех ответов я нашел проблему в своем script. Проблема заключалась в том, что я перенаправлял вывод getent. Поэтому я удалил все материалы перенаправления и сделал строку getent следующим образом:

getent passwd $user  > /dev/null

Теперь мой script работает нормально.

Ответ 1

вы также можете проверить пользователя командой id.

id -u name дает вам идентификатор этого пользователя. если пользователь не существует, вы получите значение возврата команды ($?) 1

Ответ 2

Почему бы вам просто не использовать

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

Он вернет 1 (поскольку пользователь имеет запись максимум 1), если пользователь существует, и 0, если это не так.

Ответ 3

Нет необходимости явно проверять код выхода. Попробуйте

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

Если это не работает, что-то не так с вашим getent, или у вас больше пользователей, чем вы думаете.

Ответ 4

Это то, что я закончил в Freeswitch запуска 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 "  [email protected]:~# adduser --home /usr/local/freeswitch/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $FS_USER"
    echo "  ..."
    echo "  [email protected]:~# chown freeswitch:daemon /usr/local/freeswitch/ -R"
    exit 1
fi

Ответ 5

Я предлагаю использовать команду id, поскольку она проверяет существование допустимого пользователя wrt passwd, что не обязательно означает то же самое:

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

Примечание: 0 - root uid.

Ответ 6

Я использовал его таким образом:

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

Ответ 8

Поздний ответ, но finger также показывает больше информации о пользователе

  sudo apt-get finger 
  finger "$username"

Ответ 9

На самом деле я не могу воспроизвести проблему. script, как написано в вопросе, отлично работает, за исключением случая, когда $1 пуст.

Однако проблема в script связана с перенаправлением stderr. Хотя существуют две формы &> и >&, в вашем случае вы хотите использовать >&. Вы уже перенаправили stdout, поэтому форма &> не работает. Вы можете легко проверить это следующим образом:

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

В текущем каталоге вы увидите файл с именем 1. Вместо этого вы хотите использовать 2>&1 или использовать это:

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

Это также перенаправляет stdout и stderr в /dev/null.

Предупреждение Перенаправление stderr в /dev/null может быть не такой хорошей идеей. Когда что-то пойдет не так, вы не поймете, почему.

Ответ 10

информация о пользователе хранится в /etc/passwd, поэтому вы можете использовать "grep 'usename'/etc/passwd", чтобы проверить, существует ли имя пользователя. в то же время вы можете использовать команду оболочки "id", она напечатает идентификатор пользователя и идентификатор группы, если пользователь не существует, он напечатает сообщение "нет такого пользователя".

Ответ 11

Войдите на сервер. grep "имя пользователя" /etc/passwd При этом будут отображаться сведения о пользователе, если они есть.

Ответ 12

Используя sed:

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

Ответ 13

В зависимости от реализации вашей оболочки (например, Busybox и взрослого) оператор [ может запустить процесс, изменив $?.

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

Ответ 14

Ниже приведен скрипт для проверки распределения ОС и создания пользователя, если он не существует, и ничего не делать, если пользователь существует.

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