Como adicionar usuários a partir de dados em um arquivo de texto

Como adicionar usuários a partir de dados em um arquivo de texto

Tenho uma dúvida sobre como criar vários usuários no Linux, mas preciso de um programa para trabalhar nisso. Existe um arquivo txt de novos usuários, o conteúdo é o seguinte:

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

... (há 70 nomes de usuários no arquivo)

Gostaria de saber como escrever um script para adicionar esses usuários automaticamente.

Responder1

Digamos que seu arquivo tenha o nome apenas file. Este script fará o trabalho:

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"

Responder2

Este é um script mínimo para realizar o trabalho. Garante que nem o nome de usuário nem o uid já estejam em uso. Ele cria um grupo correspondente para cada usuário (com gid=uid) - não verifica se o gid ou nome do grupo já existe (deixado como exercício para o leitor - dica: use getent group).

Nota: o script abaixo não foi testado, mas já escrevi scripts muito parecidos um milhão de vezes antes (um pequeno exagero)... pode haver alguns pequenos bugs que precisam ser corrigidos.

#! /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"

Use pwgenou makepasswordqualquer programa semelhante se makepasswdnão estiver instalado. Ou escreva a sua própria que concatene 4+ palavras aleatórias com 5+ letras para obter uma senha fácil de lembrar com pelo menos 20 caracteres - coloque algumas palavras em maiúscula e insira números aleatórios de 1 a 3 dígitos e/ou um símbolo de pontuação entre cada palavra para tornar a senha uniforme mais tempo e aumentar o espaço de busca de força bruta. A geração aleatória de senhas é algo que foi reinventado muitas vezes.

Você pode imprimir os nomes de usuário e senhas (de "$tf") e cortá-los em tiras (deixe algumas linhas em branco entre cada um user:password) para entregá-los a cada usuário. Diga-lhes para alterarem a senha imediatamente e destruírem a tira de papel. As senhas estão configuradas para expirar "$yesterday"(requer GNU date), então os usuários devem ser solicitados a alterá-las na primeira vez que fizerem login em seu shell.

Responder3

Existe uma maneira mais fácil de adicionar ou atualizar usuários de um arquivo em modo lote: o newusers(8)comando, que é fornecido pelosombratroca de ferramenta. O conjunto de ferramentas deve estar disponível como um pacote pelo menos para Debian e derivados. Está disponível no Arch Linux, que estou usando.

Para obter informações sobre como usá-lo, consulteman newusers

informação relacionada