Пытаюсь создать сценарий с помощью 'useradd', не могу понять примеры

Похоже, вы смешиваете SLES 11 с openSUSE 13.2 RPM. "systemd" недоступен в SLES 11, поэтому попытка установить RPM, который имеет обязательную зависимость от systemd, завершится неудачей.

UPDATE:

Предлагаемый способ решения этой проблемы заключается в получении/использовании лицензии на SLES 11. После регистрации вашей системы с этой лицензией вы сможете автоматически настроить онлайн-репозитории обновлений, которые поддерживаются SUSE. Эти репозитории содержат версию Postgresql, которая должна идеально подойти.

Есть также репозиторий в открытой службе Build Service (для SLES 11 SP3), но он больше не поддерживается, я думаю. По крайней мере, сборка сломана.

0
27.03.2019, 08:56
1 ответ

Утилита idпри использовании с ее опцией -uвыводит UID текущего пользователя. Если этот UID равен нулю, то пользователь является пользователем root. Добавлять новых пользователей должен только пользователь root.

Таким образом, сценарий проверяет значение UID пользователя, запустившего сценарий, на ноль и выполняет привилегированные действия (, не показанные в сценарии в вопросе ), только если пользователь является пользователем root.

Возможно, лучший способ справиться с этим в скрипте, если для всего скрипта требуется root, — это проверить, не равен ли UID -нулю в начале, и выйти с ошибкой, если он:

if [ "$(id -u)" -ne 0 ]; then
    echo 'You are not root.  Try again with sudo.' >&2
    exit 1
fi

Что касается $?, это специальная переменная оболочки, которая всегда содержит статус выхода последней выполненной команды. Очень редко нужно использовать это напрямую, так как ifболее чем способен работать напрямую сgrep:

if grep -q "^$username" /etc/passwd; then
    printf 'User "%s" already exists\n' "$username" >&2
    exit 1
fi

Здесь ifбудет использовать статус выхода grep.Мы используем grepс -q, чтобы он не производил никаких выходных данных и не анализировал весь файл после любого первого совпадения. Он просто возвращает статус выхода, который будет использовать if. Нам также не нужно egrep, так как регулярное выражение не является расширенным регулярным выражением(egrepидентичноgrep -E).

Также обратите внимание, что диагностические сообщения следует записывать в стандартный поток ошибок. Вы можете сделать это, перенаправив свои сообщения с помощью >&2. Кроме того,printfпредпочтительнее echoпри выводе переменных данных .

Если вы работаете в системе, где используется служба каталогов, такая как NIS или LDAP, поиск существующего пользователя в /etc/passwdможет оказаться бесполезным, поскольку фактические пользователи могут храниться в отдельной базе данных.

В таких системах может быть лучше использоватьgetent passwd "$username"(это будет работать и в системах, отличных от -NIS/LDAP ). Это вернет запись базы данных паролей для конкретного пользователя или завершит работу с не -нулевым статусом выхода, что означает, что мы могли бы использовать этот в нашем тесте:

if getent passwd "$username" >/dev/null; then
    printf 'User "%s" already exists\n' "$username" >&2
    exit 1
fi

Обратите внимание, что useraddнельзя добавлять пользователей в базы данных NIS или LDAP...

Хотя, строго говоря, ничего из вышеперечисленного не требуется, так как useraddне должен делать ничего полезного, если текущий пользователь не root или если добавляемый пользователь уже существует.

0
28.01.2020, 03:53

Теги

Похожие вопросы