Maneira correta de adicionar uma conta de usuário via script bash

15

Aqui está o código de script que estou usando agora:

getent group $MYGROUP
if [ $? -ne 0 ] ; then
    sudo su -c "groupadd $MYGROUP"
fi
sudo su -c "useradd mynewuser -p mypassword -m -g $PRIMARYGRP -G $MYGROUP"

Essa abordagem funciona bem no openSuse. Mas há vários problemas com a conta de usuário que ele cria no Ubuntu, então estou procurando ajuda aqui.

  • o prompt do terminal não está definido ( echo $PS1não retorna nada)
  • as teclas de seta e tecla tab não funcionam corretamente no terminal
  • a senha parece não funcionar (embora ainda não esteja claro exatamente qual é esse problema)
  • os direitos / etc / sudoers definidos para esse novo usuário não são respeitados

Se, em vez disso, eu criar o usuário manualmente com adduser(em vez de useradd), não tenho esses problemas no Ubuntu. Mas não posso usar adduserno openSuse (afaik). Portanto, preciso de um script ou método não exclusivo do Debian para adicionar contas de usuário por meio do meu script bash que funcione no Ubuntu (e não pare de trabalhar em outras distros).

Finalmente, eu gostaria de entender as diferenças entre addusere useradd. Por exemplo, quero saber qual diretório do esqueleto é usado, adduserpois esse pode ser o motivo pelo qual useraddnão está funcionando conforme o esperado (porque aceitei o padrão).

obrigado

MountainX-for-Monica
fonte
1
Quanto à diferença: na página de manual useradd ( man useradd): useradd é um utilitário de baixo nível para adicionar usuários. No Debian, os administradores geralmente devem usar o adduser (8).
guntbert
Além disso, sudo su -c "cmd arg1 arg2"é equivalente a sudo cmd arg1 arg2.
enzotib
@enzotib thanks. É bom saber que esses são equivalentes no Ubuntu porque não estão no openSuse. Portanto, continuarei usando sudo su -c "cmd arg1 arg2"para que funcione em qualquer lugar em que eu precise.
MountainX-for-Monica
adduseré um script perl com mais de 1000 linhas, portanto, para as diferenças, você pode dar uma olhada no script.
enzotib
@enzotib Sim, eu tenho lido, addusermas não sei perl. Portanto, essa não é uma boa abordagem para mim.
MountainX-for-Monica

Respostas:

14

Minha solução foi fornecida aqui: /unix/82923/proper-way-to-add-a-user-account-via-bash-script por Ulrich Schwarz e Joseph R .. A principal coisa que tive que fazer foi adicionar -s /bin/bashao meu useraddcomando existente e remover o -p passwordque espera uma senha criptografada.

sudo su -c "useradd mynewuser -s /bin/bash -m -g $PRIMARYGRP -G $MYGROUP"

Então faça o seguinte:

sudo chpasswd << 'END'
mynewuser:password
END
MountainX-for-Monica
fonte
6
echo mynewuser:password | sudo chpasswdfunciona também
Felix Rabe #
10

Isso vai funcionar.

sudo adduser myuser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
echo "myuser:password" | sudo chpasswd
Ankur Devani
fonte
Esta é uma solução mais fácil do que a resposta aceita.
29419 Steven
2

meu script que cria automaticamente uma conta de serviço com login por chave ssh e sem senha

#add service group/user
addgroup service-runner
useradd devops-service --create-home --shell /bin/bash --groups service-runner
#gpasswd -a devops-service sudo #allowing sudo requires password, and not a good idea for a service account.
mkdir /home/devops-service/.ssh
chmod 700 /home/devops-service/.ssh
cat devops-service@v2-20150312.pub >> /home/devops-service/.ssh/authorized_keys
chown devops-service:devops-service /home/devops-service -R
JasonS
fonte
fyi, depois de usar meu script, vejo que "sudo" é praticamente inútil na conta de serviço, pois nenhuma senha significa que ele não pode usar o sudo. Você pode configurá-lo para permitir sudo sem senha via visudo, mas não sei como automatizar isso em um script. Além disso, provavelmente uma conta de serviço com sudo sem senha não é uma boa ideia (segurança).
jasons
0

Suponho que você possa simplesmente usar uma condição em seu script, algo como

if grep -q 'Ubuntu\|Debian' /etc/issue; then
    adduser .....
else
    useradd .....
fi

(não é possível verificar se o arquivo /etc/issueestá presente no OpenSUSE, caso contrário, você pode colocar a condição na existência desse arquivo).

enzotib
fonte
Por que não simplesmente testar a existência de addusercom if command -v adduser >/dev/null; thenou dos gostos? Essa é a única coisa que importa e não as distribuições subjacentes. Além disso, existem outras distribuições além do Debian / Ubuntu e OpenSUSE.
David Foerster