Как заставить пакетный файл добавлять пользователей в группы?

Мне нужна помощь с проектом GCSE, я застрял на последнем вопросе. Он запрашивает bash-скрипт для создания пользователей, а затем назначает их группам. Я уже заставил скрипт добавлять новых пользователей, но я не уверен, как добавить их в группы в скрипте bash (скрипт bash сделан с nano).

Любая помощь / примеры?

Мой текущий сценарий:

#!/bin/bash
# Script to add a user to Linux system
if [ $(id -u) -eq 0 ]; then
    read -p "Enter username : " username
    read -p "Enter password : " password
    egrep "^$username" /etc/passwd >/dev/null
    if [ $? -eq 0 ]; then
        echo "$username exists!"
        exit 1
    else
        pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
        useradd -m -p $pass $username
        [ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
    fi
else
    echo "Only root may add a user to the system"
    exit 2
fi

(выглядит примерно так)

2
задан 15 May 2015 в 02:35

1 ответ

Можно использовать этот измененный сценарий:

#!/bin/bash
# Script to add a user to Linux system

if [ "$(id -u)" -eq 0 ]; then
    read -p "Enter username : " username
    read -p "Enter password : " password
    IFS=' ' read -a grps -p "Enter group names : "

    if grep "^${username}:" /etc/passwd &>/dev/null; then
        echo "$username exists!"
        exit 1
    else
        pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)

        if useradd -m -p "$pass" "$username" &>/dev/null; then
            echo "User has been added to system!"

            for grp in "${grps[@]}"; do
                usermod -a -G "$grp" "$username" && echo "User is added to group $grp" \
                || echo "Failed to add user to group $grp"
            done

        else
            echo "Failed to add a user!"
        fi
     fi

else
    echo "Only root may add a user to the system"
    exit 2
fi

Обратите внимание, что необходимо всегда заключать переменные в кавычки.

Здесь я добавил главным образом две вещи:

  • IFS=' ' read -a grps -p "Enter group names : " попросит базироваться для предоставления разделенных названий группы пространства, к которым недавно созданный пользователь будет членом

  • Затем это короткое for цикл по значениям массива grps:

    for grp in "${grps[@]}"; do
         usermod -a -G "$grp" "$username" && echo "User is added to group $grp" \
         || echo "Failed to add user to group $grp"
    done
    

Учитывая группы уже существуют. Если не можно использовать groupadd создать группу и затем добавить пользователя к той группе.

Здесь мы использовали usermod чтобы добавить пользователя к существующей группе, эти группы будут дополнительными группами для пользователя.

Проверить man usermod для деталей.

Обратите внимание, что Вы не должны использовать egrep, это удерживается от использования в пользу grep -E. На самом деле в этом случае Вам не нужно grep -E.

Ваш grep шаблон перестанет работать в определенных случаях, например, если у Вас есть пользователь foobar и Вы добавляете, что новый пользователь назвал foo. Для преодоления этого соответствуйте имени пользователя, сопровождаемому a : (учитывая никакое имя пользователя имеет :) :

grep "^${username}:" /etc/passwd &>/dev/null

Также отправьте STDERR в /dev/null также.

Это может быть упрощено как:

if grep "^${username}:" /etc/passwd &>/dev/null; then
        echo "$username exists!"
        exit 1
else ......

Также следующее if оператор с useradd может следовать за этим.

** Также некоторые другие улучшения могут быть сделаны к Вашему текущему сценарию, который не поместился бы в этот контекст.

4
ответ дан 15 May 2015 в 02:35

Другие вопросы по тегам:

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