Ответ 1
вы также можете проверить пользователя командой id
.
id -u name
дает вам идентификатор этого пользователя.
если пользователь не существует, вы получите значение возврата команды ($?
) 1
Я хочу создать 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 работает нормально.
вы также можете проверить пользователя командой id
.
id -u name
дает вам идентификатор этого пользователя.
если пользователь не существует, вы получите значение возврата команды ($?
) 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
запуска 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
Я предлагаю использовать команду id, поскольку она проверяет существование допустимого пользователя wrt passwd, что не обязательно означает то же самое:
if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then
echo FOUND
fi
Примечание: 0 - root 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"
На самом деле я не могу воспроизвести проблему. 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
может быть не такой хорошей идеей. Когда что-то пойдет не так, вы не поймете, почему.
информация о пользователе хранится в /etc/passwd, поэтому вы можете использовать "grep 'usename'/etc/passwd", чтобы проверить, существует ли имя пользователя. в то же время вы можете использовать команду оболочки "id", она напечатает идентификатор пользователя и идентификатор группы, если пользователь не существует, он напечатает сообщение "нет такого пользователя".
Войдите на сервер. grep "имя пользователя" /etc/passwd При этом будут отображаться сведения о пользователе, если они есть.
Используя sed:
username="alice"
if [ 'sed -n "/^$username/p" /etc/passwd' ]
then
echo "User [$username] already exists"
else
echo "User [$username] doesn't exist"
fi
В зависимости от реализации вашей оболочки (например, 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
Ниже приведен скрипт для проверки распределения ОС и создания пользователя, если он не существует, и ничего не делать, если пользователь существует.
#!/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