Como posso extrair dados do usuário de um arquivo com o awk e criar um novo usuário com base nele?

1

Eu preciso de alguém que possa ajudar em um exercício. Eu só posso usar scripts de shell e awk para fazer isso:

Você tem um arquivo de texto chamado users.txt com esta informação dentro:

users.txt :

Peter: 7777: / home / store;

Quinn: 7777: / home / accounts;

David: 7777: / home / secondstore;

Daniel: 7777: / home / endereço;

O script deve criar um usuário usando a primeira palavra de cada linha, a segunda palavra de cada linha será usada como senha e a terceira como o diretório base.

Eu ficaria muito grato Se alguém puder me apontar na direção certa

    
por marcos ruiz 15.05.2014 / 18:30

3 respostas

3

awk -F: '{print $1}' users.txt fornecerá acesso ao campo de nome de usuário em awk -F: '{print $2}' users.txt - > campo de senha de awk -F: '{print $3}' users.txt - > campo de diretório inicial

você poderia fazer algo como:

user='awk -F: '{print $1}' users.txt';
path='awk -F: '{print $3}' users.txt';
useradd -d $path -m $user;
    
por user257256 15.05.2014 / 19:35
2

Os dois comandos no loop while precisam ser executados como root, portanto, adicione sudo s ou salve isso como um script bash e execute isso com sudo (provavelmente preferível).

awk -F ':| ' '{print $1, $2, $3}' users.txt |
while read user password homedir; do
    adduser --home "$homedir" "$user"
    echo "$password" | passwd "$user" --stdin
done

Como alternativa, você pode fazer mais em awk . Podemos imprimir todo o comando:

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) }' users.txt
adduser --home /home/almacen1 Jperez; echo 1234 | passwd Jperez
adduser --home /home/contabilidad1 Lgomez; echo 1234 | passwd Lgomez
adduser --home /home/almacen2 Pfernandez; echo 1234 | passwd Pfernandez
adduser --home /home/direccion1 Mramos; echo 1234 | passwd Mramos

E então é só canalizar tudo isso em um shell (durante a execução):

$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt
adduser: Only root may add a user or group to the system.
passwd: user 'Jperez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Lgomez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Pfernandez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Mramos' does not exist

Obviamente, você precisaria rodar o código acima com sudo (ou como root) para que ele seja executado (é por isso que está causando erros de vômito). Você poderia usar o comando awk system() , mas você teria que gastar mais tempo concatenando as strings. print() torna isso realmente simples, então eu fui com isso.

Apenas para esclarecimento, com isso quero dizer sudo awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt

    
por Oli 15.05.2014 / 22:36
1

Defina o separador de campo interno como: e, em seguida, simplesmente ignore o último caractere de; por qualquer método ... usando substring ou mastigando-o.

Esse código deve apontar você na direção certa.

Este é um exemplo aleatório do IFS var em uso

#!/bin/bash
IFS=$','
vals='/mnt,/var/lib/vmware/Virtual Machines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
for i in $vals; do echo $i; done
unset IFS

No seu caso, você configuraria o IFS =: e executaria esse tipo de código em todas as linhas.

Para questões como essas, eu recomendo usar um mecanismo de pesquisa ou postar em um site mais amigável à programação.

    
por Banned_User 15.05.2014 / 18:45