Aqui está um one-liner awk:
sudo awk -F',' '{ command="useradd -p $( mkpasswd "" ) ";print command; system(command) }' userlist.txt
Ou para facilitar a leitura, aqui está o formato:
sudo awk -F',' '{
command="useradd -p $(mkpasswd " ")" ;
print command;
system(command)
}' userlist.txt
Explicação :
A função system
do awk permite executar comandos do shell enquanto o awk está processando entradas do arquivo de texto. Criamos uma variável "comando" que é apenas o texto do comando que queremos executar. Usando vírgula como separador de campo -F','
, pegamos os campos # 2 e # 1 e os colocamos para corresponder à sintaxe do comando useradd. Uma vez que o texto do comando é montado, o sistema (comando) executa useradd -p $(mkpasswd password) username
, para cada linha do texto. print command
part é opcional, meramente para depuração e verificação de que todos os nomes de usuários foram processados
Adição:
O oneliner pode ser transformado em um script awk da seguinte forma:
#!/usr/bin/awk -f
BEGIN {FS=",";}
{
command="useradd -p $(mkpasswd "") " ;
print command;
system( command )
}
Agora, verifique se o script tem permissões executáveis com sudo chmod +x script-name.awk
e execute-o com qualquer arquivo de entrada, como sudo ./awkscript.sh userlist.txt
, se estiver em seu diretório de trabalho atual, ou chame esse script em qualquer lugar, colocando-o em um dos $PATH
diretórios
Possível ,
na senha
Para levar em conta a possibilidade de ter vírgula na senha, sugiro que você use a função sub()
. A subfunção altera a primeira instância de um caractere ou palavra em cada linha. Em outras palavras, se tivermos uma entrada como testuser,foo,bar
, onde foo,bar
for senha e alterarmos a primeira entrada para o espaço, podemos usar o awk normalmente, sem avisá-lo para usar -F','
flag. O awk irá traduzir cada entrada para testuser foo,bar
, e tratará testuser como $ 1 e foo, como $ 2. Para colocar isso no código:
sudo awk '{ sub(","," ");command="useradd -p $( mkpasswd "" ) ";print command; system(command) }' userlist.txt