
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 pwgen
ou makepassword
qualquer programa semelhante se makepasswd
nã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