Você pode usar este script modificado:
#!/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
Note que você deve sempre citar as variáveis.
Aqui eu adicionei principalmente duas coisas:
-
IFS=' ' read -a grps -p "Enter group names : "
solicitará que o root forneça nomes de grupos separados por espaços dos quais o usuário recém-criado será membro de -
Em seguida, este curto
for
executa um loop sobre os valores da matrizgrps
: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
Dado que os grupos já existem. Caso contrário, você pode usar groupadd
para criar o grupo e, em seguida, adicionar o usuário a esse grupo.
Aqui usamos usermod
para adicionar o usuário a um grupo existente, esses grupos serão complementares para o usuário.
Verifique man usermod
para detalhes.
Observe que você não deve usar egrep
, ele está obsoleto em favor de grep -E
. Na verdade, neste caso, você não precisa de grep -E
.
Seu padrão grep
falhará em alguns casos. se você tiver um usuário foobar
e estiver adicionando um novo usuário chamado foo
. Para superar isso, corresponda o nome de usuário seguido por um :
(dado que nenhum nome de usuário possui :
):
grep "^${username}:" /etc/passwd &>/dev/null
Envie também STDERR para /dev/null
.
Isso pode ser simplificado como:
if grep "^${username}:" /etc/passwd &>/dev/null; then
echo "$username exists!"
exit 1
else ......
Além disso, a próxima instrução if
com useradd
pode seguir isso.
** Outras melhorias também podem ser feitas no seu script atual, que não se encaixam nesse contexto.