Cómo agregar usuarios a partir de datos en un archivo de texto

Cómo agregar usuarios a partir de datos en un archivo de texto

Tengo una pregunta sobre la creación de múltiples usuarios en Linux, pero necesito un programa para trabajar en ello. Hay un archivo de texto de nuevos usuarios, el contenido es el siguiente:

adams:5000:Adams, John Couch:/bin/bash
atiyah:5001:Atiyah, Michael:/bin/csh
babbage:5002:Babbage, Charles:/bin/csh
baker:5003:Baker, Alan:/bin/csh
barrow:5004:Barrow, Isaac:/bin/bash

... (hay 70 nombres de usuarios en el archivo)

Me gustaría saber cómo escribir un script para agregar esos usuarios automáticamente.

Respuesta1

Digamos que su archivo se llama simplemente file. Este script hará el trabajo:

USERNAME=$(cat file | cut -d: -f1)
echo "$USERNAME"

ID=$(cat file | cut -d: -f2)
echo "$ID"

USER_SHELL=$(cat file | cut -d, -f2 | cut -d: -f2)
echo "$USER_SHELL"

useradd -m -s "$USER_SHELL" -u "$ID" "$USERNAME"

Respuesta2

Este es un script mínimo para realizar el trabajo. Se asegura de que ni el nombre de usuario ni el uid ya estén en uso. Crea un grupo coincidente para cada usuario (con gid=uid); no verifica si el gid o el nombre del grupo ya existe (se deja como ejercicio para el lector; sugerencia: use getent group).

Nota: el siguiente script no ha sido probado, pero he escrito scripts muy parecidos a este un millón de veces antes (ligera exageración)... puede haber algunos errores menores que deban corregirse.

#! /bin/bash
# get newusers file from first arg on cmd line or default to 'newusers.txt'
nf="${1:-newusers.txt}"

# get existing usernames and uids.
names="^($(getent passwd | cut -d: -f1 | paste -sd'|'))$"
 uids="^($(getent passwd | cut -d: -f3 | paste -sd'|'))$"

yesterday=$(date -d yesterday +%Y-%m-%d)
# temp file for passwords
tf=$(mktemp) ; chmod 600 "$tf"

while IFS=: read u uid gecos shell; do
    gid="$uid" ; homedir="/home/$u"
  
    useradd  -e "$yesterday" -m -d "$homedir" -c "$gecos" \
             -u "$uid" -g "$gid" -s "$shell" "$u"

    groupadd -g "$gid" "$u"
  
    # generate a random password for each user..
    p=$(makepasswd)
    echo "$u:$p" >> "$tf"
done < <(awk -F: '$1 !~ names && $2 !~ uids' names="$names" uids="$uids" "$nf")

# uncomment to warn about users not created:
#echo Users not created because the username or uid already existed: >&2
#awk -F: '$1 ~ names || $2 ~ uids' names="$names" uids="$uids" "$nf" >&2    

# uncomment the cat to display the passwords in the terminal
echo ; echo "passwords are saved in $tf"
# cat "$tf"

# set passwords using `chpasswd:
chpasswd < "$tf"

Utilice pwgeno makepasswordcualquier programa similar si makepasswdno está instalado. O escriba una propia que concatene más de 4 palabras aleatorias de más de 5 letras para obtener una contraseña fácil de recordar de al menos 20 caracteres: escriba en mayúscula algunas palabras e inserte números aleatorios de 1 a 3 dígitos o un símbolo de puntuación entre cada palabra para que la contraseña sea uniforme. más tiempo y aumentar el espacio de búsqueda de fuerza bruta. La generación aleatoria de contraseñas es algo que se ha reinventado muchas veces.

Puedes imprimir los nombres de usuario y contraseñas (de "$tf") y cortarlos en tiras (deja algunas líneas en blanco entre cada una user:password) para entregárselas a cada usuario. Dígales que cambien su contraseña inmediatamente y destruyan la tira de papel. Las contraseñas están configuradas para caducar "$yesterday"(requiere GNU date), por lo que se debe solicitar a los usuarios que las cambien la primera vez que inician sesión en su shell.

Respuesta3

Existe una forma más sencilla de agregar o actualizar usuarios desde un archivo en modo por lotes: el newusers(8)comando, proporcionado por elsombracambio de herramienta. El conjunto de herramientas debería estar disponible como paquete al menos para Debian y derivados. Está disponible en Arch Linux, que estoy usando.

Para obtener información sobre cómo utilizarlo, consulteman newusers

información relacionada