Intereting Posts
Фоновые процессы в скрипте ksh исчезают после их запуска Отсутствует или исчезает домашний каталог ldd сообщает мне, что мое приложение «не является динамическим исполняемым файлом», Являются ли большие файлы файлов LUKS плохими идеями? Изменили утерянные пароли учетных записей, отредактировав GRUB, но все еще не имея доступа к учетной записи (Linux Mint 18.3) Принудительное распределение PTY в ssh_config ifconfig показывает только lo Как я могу отредактировать редактируемый результат? Ошибка Kino: ПРЕДУПРЕЖДЕНИЕ: модуль ядра dv1394 не загружен или отсутствует чтение / запись / dev / raw1394 на Fedora 20, dvgrab works Как я могу найти список только в каталоге? Поиск файла для строки, окруженной двумя другими известными строками? Выражение фильтра tcpdump прерывается через adb Возможно, сервер Ubuntu 14.04 может спать? Ошибка Heredocument, которую я не могу понять («ограниченным по концу файла») Сеансы X11: когда сеанс начинается и заканчивается, выполняется ли `gdm` сеанс?

добавление списка пользователей в несколько групп

Я хочу написать сценарий оболочки, который добавит список пользователей, определенных в users.txt , к нескольким существующим группам.

Например, у меня есть пользователи a , b , c , d , e , f , g которые будут добавлены в группы по сценарию, и у меня есть группы p , q , r , s , t . Ниже представлен ожидаемый вывод файла /etc/groups :

 p:x:10029:a,c,d q:x:10030:b,c,f,g r:x:10031:a,b,c,e s:x:10032:c,g t:x:10033:a,b,c,d,e 

так как это сделать?

Лучший и самый простой подход – проанализировать файл с необходимой информацией, как это было предложено компанией @DannyG . В то время как я делал это сам, другим было бы жестко кодировать комбинации пользователей / групп в вашем скрипте. Например:

 #!/usr/bin/env bash ## Set up an indexed array where the user is the key ## and the groups the values. declare -A groups=( ["alice"]="groupA,groupB" ["bob"]="groupA,groupC" ["cathy"]="groupB,groupD" ) ## Now, go through each user (key) of the array, ## create the user and add them to the right groups. for user in "${!groups[@]}"; do useradd -U -G "${groups[$user]}" "$user" done 

ПРИМЕЧАНИЕ . Вышеупомянутая версия предполагает версию bash> = 4, поскольку в более ранних версиях ассоциативные массивы недоступны.

Поскольку никакого входного примера не приводится, я собираюсь взять на себя очень простой patern:

 Uesrs groups ap,r,tbp,q 

В этом случае у вас есть несколько вариантов, потому что usermod -G может использовать второй столбец изначально.

что-то вроде

 while read line do usermod -G "$(cut -f2 -d" ")" $(cut -f1 -d" ") done < users.txt 

Цикл while считывает каждую строку из user.txt и передает ее в usermod.
команда usermod -G group1,group2,group3 user изменяет группы пользователей на запрошенные группы.
cut просто разделяет поля на основе разделителя -d " " , поэтому первое поле используется как имя пользователя (имя пользователя), а второе поле для групп. Я хочу добавить группы к текущим (существующим) группам – добавьте -a, чтобы команда выглядела как usermod -a -G ...

Учитывая ваши комментарии, вы можете просто статически создавать сценарий с группами, написанными на нем. Этот сценарий ожидает, что на стандартном входе будет отображаться список пользователей, по одному пользователю в строке. Поэтому вызовите его с помощью ./script < users.txt например.

 #!/bin/bash groups="pqr" # the list of all groups you want your users in # the following function is a case statement # it takes as first argument a user, and as second argument a group # it returns 0 if the user must be added to the group and 1 otherwise must_belong_to() { case $2 in # first we explore all the groups p) case $1 in # and for each of them, we examine the users a | b ) # first selection: the users that must belong to the group true ;; *) # second selection: all the others false ;; esac q) # same here... ;; esac } # we loop on the input file, to process one entry # (ie one user) at a time while read user do # We add the user. You may want to give some options here # like home directory (-d), password (-p)... useradd $user # then we loop on the existing groups to see in which # one the user must be added for g in $groups do # if the user must be added to the group $g if must_belong_to $user $g then # we add it with the command gpasswd gpasswd -a $user $g fi done done 

Как объясняет @terdon, эта версия must_belong_to() может быстро расти. Вот еще одно решение с использованием ассоциативных массивов:

 #!/bin/bash declare -A groups # we declare all the groups and then, for each one, its members all_the_groups="ab" groups[a]="pqr" groups[b]="qrs" must_belong_to() { # we extract a list of all users for the group in parameter read -a all_the_users <<< "${groups["$2"]}" # we iterate over the users from the group for u in $all_the_users do # if the user belong to the group, # we return here [[ $u == $1 ]] && return 0 done # in case the user dosn't belong to the group, # we end up here return 1 }