12

On Centos 6.5 (and probably any) linux, I can create a group:

sudo groupadd mygroup

and add several users to it:

sudo usermod -a -G mygroup userA
sudo usermod -a -G mygroup userB
sudo usermod -a -G mygroup userC

The number of users in my particular case is 20. How can I use a one-liner like:

sudo usermod -a -G mygroup userA userB userC

Even using for loop would be fine, but I'm not a bash specialist, so wondering.

migrated from stackoverflow.com Dec 9 '15 at 22:01

This question came from our site for professional and enthusiast programmers.

12

If gpasswd is available (should be on most distributions except e.g. Solaris) you can provide a comma separated list of users followed by the group name:

gpasswd -M userA,userB,userC mygroup
  • 1
    This one should be the answer. – ivanleoncz Aug 14 '17 at 19:14
  • 3
    Keep in mind that this solution overwrites the existing group members list. This is a different thing than "adding" users like usermod -aG mygroup does. – Michael Oct 4 '18 at 17:33
9
for user in userA userB userC; do sudo usermod -a -G mygroup "$user"; done
2

This is a rudimental script with positional parameters, save the code below in a file called fill_group.sh and make it executable with chmod +x fill_group.sh.

Then add it to a PATH directory (/usr/local/bin) or execute it in the same dir where it's located with ./fill_group.sh <group_name> <user1> ... <userN>.

#!/bin/sh
#
# Name: fill_group.sh
# 
# Usage: 
# fill_group.sh <group_name> <user1> <user2> ... <userN>
#
# Description:
# add users to specific group passed as first parameter. 
# If the group doesn't exists add it to the system.
set -eu

# Exit if there is not at least 2 args (group,user1)
if [ $# -lt 2  ]; then exit 5; fi

group="${1}"; shift # extract group from arguments
if ! egrep --quiet "^${group}:" /etc/group; then
  sudo groupadd "${group}"
fi

for user in "${@}"; do
    sudo usermod -a -G "${group}" "${user}"
done
  • 2
    Another way to validate the group: if ! getent group "$group" >/dev/null – glenn jackman Dec 8 '15 at 16:44
  • @glennjackman: thank you, i missed getent command till now (in my system there is also a nice autocomplete feature for all the databases inspected). – Giuseppe Ricupero Dec 8 '15 at 16:57
  • Too complicated, I would wish to execute it from the command line. – Hordon Freeman Dec 8 '15 at 18:00
  • @HordonFreeman: the script when saved is executed as a oneliner: fill_group.sh <group> <user1> ... <userN>. If you want really a oneliner: for user in "userA userB userC"; do sudo usermod -a -G "groupName" "${user}"; done or if you have a the user list one per line in a file called users.list: group=mygroup && while read user; do sudo usermod -a -G "${group}" "${user}"; done < users.list – Giuseppe Ricupero Dec 8 '15 at 18:12
1

On Fedora, Red Hat, CentOS and other downstream distributions, the newusers utility enables you to very easily add a batch of new users to a system without having to write s Bash script.

May also be available on Debian and Ubuntu.

0

Regarding Tombart's and Masterfool's answers. For old distos (SLES 11 SP1), the shadow tools are slightly different. The manuals give no version number, but are dated 2009-2010.

The -M option in gpasswd doesn't exist, (but needed gpasswd for something else). So need to go for the loop option by Masterfool. But here -a does not exist, instead -A behaves as -a & -G.

I'm doing this to rollout access to load's of systems and my complete "create group and populate" so far looks like:

/usr/sbin/groupadd -g GID### mygroup
gpasswd -r mygroup
for user in userA userB userC; do sudo usermod -A mygroup "$user"; done

So, create group with set GID, unpassword/activate the new group, add some users.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy