LINUX.ORG.RU

Проверка наличия пользователя через getent

 , , ,


1

1

Пытаюсь создать пользователей следующим скриптом:

#!/bin/bash

set -xe
echo "> Создание пользователей"
users="user vasya petya operator1 operator2 operator3 operator4"

for userName in $users
do
    echo "Проверка наличия пользователя $userName"

    getent passwd $userName > /dev/null
    if [[ $? -ne 0 ]] ; then
		echo "Создается пользователь $userName"

		# Опция --disabled-login запрещает вход пользователя до тех пор
		# пока не будет задан пароль пользователю
		adduser --disabled-login --gecos "Пользователь-$userName" $userName
    else
		echo "Пользователь уже существует"
    fi
done

В результате, скрипт молча затыкается на пользователе vasya, никаких ошибок не выдает, просто завершает свою работу:
+ echo '> Создание пользователей'
> Создание пользователей
+ users='user vasya petya operator1 operator2 operator3 operator4'
+ for userName in $users
+ echo 'Проверка наличия пользователя user'
Проверка наличия пользователя user
+ getent passwd user
+ [[ 0 -ne 0 ]]
+ echo 'Пользователь уже существует'
Пользователь уже существует
+ for userName in $users
+ echo 'Проверка наличия пользователя vasya'
Проверка наличия пользователя vasya
+ getent passwd vasya


Хоть бы написал «Создается пользователь ...» или «Пользователь уже существует», но этого не происходит.

Что нужно сделать в скрипте, чтобы он заработал как задумано?

★★★★★

Ответ на: комментарий от xtouqh

Мне -e обязательно нужно, чтобы выходить при ошибках.

Хочешь сказать, что getent генерит ошибку если пользователя не существует?

А как тогда правильно проверить существование пользователя?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Хочешь сказать, что getent генерит ошибку если пользователя не существует?

Конечно, ты ведь поэтому и проверяешь значение $?.

-e контекстно-зависимо, из этого и стоит исходить, для примера:

#!/bin/sh

set -xe

getent passwd vasya || echo no1

getent passwd vasya
if [ $? != 0 ]; then
        echo no2
fi
xtouqh
()
Ответ на: комментарий от xtouqh

У меня получилось что-то вроде:

#!/bin/sh

set -e

users="xtouqh vasya petya"

for user in $users; do
        getent passwd $user >/dev/null && echo $user already exists && continue

        echo adding $user
done

Здесь exit code для getent явно обрабатывается в пайплайне, поэтому -e не применяется.

xtouqh
()
Ответ на: комментарий от Xintrea

попробуй завернуть getent в субшел, как-то так: $(getent ...)

anonymous
()

Кстати, судя по ману, тебе надо проверять exit code на 2, а не на 0

zolden ★★★★★
()
set -e

if ! getent passwd $userName > /dev/null ; then
...
fi
surefire ★★★
()

для отладки говноскрипта - для начала убери > /dev/null из getent

для создания пользователей пачкой - man newusers

ananas ★★★★★
()
Последнее исправление: ananas (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.