Forma correcta de agregar una cuenta de usuario a través de script bash

15

Aquí está el código del script que estoy usando ahora:

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"

Este enfoque funciona bien en openSuse. Pero hay varios problemas con la cuenta de usuario que crea en Ubuntu, así que estoy buscando ayuda aquí.

  • el indicador de terminal no está configurado ( echo $PS1no devuelve nada)
  • las teclas de flecha y la tecla tab no funcionan correctamente en el terminal
  • la contraseña no parece funcionar (aunque todavía no estoy claro exactamente cuál es este problema)
  • no se respetan los derechos / etc / sudoers establecidos para este nuevo usuario

Si, en cambio, creo manualmente el usuario con adduser(en lugar de useradd) no tengo estos problemas en Ubuntu. Pero no puedo usar adduseren openSuse (afaik). Por lo tanto, necesito un script o método no exclusivo de Debian para agregar cuentas de usuario a través de mi script bash que funciona en Ubuntu (y no deja de funcionar en otras distribuciones).

Finalmente, me gustaría entender las diferencias entre addusery useradd. Por ejemplo, quiero saber qué directorio de esqueleto utiliza, adduserya que esa podría ser la razón por la useraddque no funciona como se esperaba (porque acabo de aceptar el valor predeterminado).

Gracias

MountainX-for-Monica
fuente
1
En cuanto a la diferencia: desde la página de manual de useradd ( man useradd): useradd es una utilidad de bajo nivel para agregar usuarios. En Debian, los administradores generalmente deberían usar adduser (8) en su lugar.
guntbert
Además, sudo su -c "cmd arg1 arg2"es equivalente a sudo cmd arg1 arg2.
enzotib
@enzotib gracias. Es bueno saber que son equivalentes en Ubuntu porque no están en openSuse. Por lo tanto, seguiré usando sudo su -c "cmd arg1 arg2"para que funcione en todos los lugares donde lo necesito.
MountainX-for-Monica
adduseres un script perl de más de 1000 líneas de largo, por lo que para las diferencias, puede echar un vistazo al script.
enzotib
@enzotib Sí, he estado leyendo adduserpero no sé Perl. Entonces ese no es un buen enfoque para mí.
MountainX-for-Monica

Respuestas:

14

Se proporcionó mi solución aquí: /unix/82923/proper-way-to-add-a-user-account-via-bash-script por Ulrich Schwarz y Joseph R. . Lo principal que tuve que hacer fue agregar -s /bin/basha mi useraddcomando existente y eliminar lo -p passwordque espera una contraseña cifrada.

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

Entonces haz esto:

sudo chpasswd << 'END'
mynewuser:password
END
MountainX-for-Monica
fuente
66
echo mynewuser:password | sudo chpasswdtambién funciona
Felix Rabe
10

Esto funcionará

sudo adduser myuser --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
echo "myuser:password" | sudo chpasswd
Ankur Devani
fuente
Esta es una solución más fácil que la respuesta aceptada.
Steven
2

mi script que construye automáticamente una cuenta de servicio con inicio de sesión con clave ssh y sin contraseña

#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
fuente
para su información, después de usar mi script, veo que "sudo" es prácticamente inútil con la cuenta de servicio, ya que sin contraseña significa que no puede usar sudo. Puede configurarlo para permitir sudo sin contraseña a través de visudo, pero no sé cómo automatizar eso en un script. Además, probablemente una cuenta de servicio con sudo sin contraseña no es una buena idea (de seguridad).
JasonS
0

Supongo que simplemente puedes usar una condición en tu script, algo como

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

(no se puede verificar si el archivo /etc/issueestá presente en OpenSUSE, de lo contrario, puede poner la condición a la existencia de dicho archivo).

enzotib
fuente
¿Por qué no simplemente probar la existencia de adduserwith if command -v adduser >/dev/null; theno me gusta? Eso es lo único que importa y no las distribuciones subyacentes. Además, hay otras distribuciones además de Debian / Ubuntu y OpenSUSE.
David Foerster