Script para comparar

1. Script para comparar

Daniel Vasconcelos
danielvasc

(usa Debian)

Enviado em 07/03/2014 - 09:43h

Conteúdo do arquivo passwd:

andredilnfelb:x:9600:610:ANDRE DILNFELB:/home/mensagem/andredilnfelb:/dominios/stche
edersteglich:x:9593:610:EDER STEGLICH:/home/mensagem/edersteglich:/dominios/stche

Conteúdo do arquivo shadow:

andredilnfelb:$1$Nim3ZoIZ$.PBfmHAG30CRKQ7/GlKeE/:15973:0:99999:7:::
edersteglich:$1$k6SSQPjU$8xfnwof/jfj94dWgkf9ehI/:16062:0:99999:7:::


Possuo dois arquivos, "passwd" e "shadow". Dentro deste arquivo não há nada a ser substuído, mas eu preciso fazer o seguinte:

- Checar se o usuário contido no passwd está contido no shadow. Pois preciso deixar o shadow com os mesmos usuários contidos no "passwd".

Seria basicamente assim (vou esboçar a ideia):

No arquivo passwd, lê a primeira palavra da primeira linha (no caso, o nome de usuário). Seguindo o meu exemplo, seria o usuário "andredilnfelb". Depois, faz uma comparação: Se este usuário estiver no arquivo shadow, jogar essa linha do shadow em um novo arquivo. Dessa maneira, vou gerar um segundo arquivo "shadow" contendo os mesmos usuários que no arquivo "passwd".



  


2. Re: Script para comparar

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/03/2014 - 10:21h

O grep faz o que você quer se você o invocar com a opção "-f".


3. Re: Script para comparar

Daniel Vasconcelos
danielvasc

(usa Debian)

Enviado em 07/03/2014 - 11:16h

paulo1205 escreveu:

O grep faz o que você quer se você o invocar com a opção "-f".



Bom, eu tentei da seguinte maneira:

#!/bin/bash
cut -d : -f 1 /etc/passwd > passwd-novo
cut -d : -f 1 /etc/shadow > shadow-novo

grep -f passwd-novo shadow-novo > resultado.txt

################################################

Bom, ele foi útil. Porém, agora eu tenho um arquivo chamado "resultado.txt" contendo os usuários que eu preciso, mas, o resto do conteúdo da linha não tenho dentro deste arquivo. Como eu consigo fazer para ele "grepar" cada uma das linhas do /etc/shadow? Por exemplo, dentro deste arquivo resultado.txt tenho milhares de linhas assim:

joao
maria
pedro
felipe
renato

Então, eu queria "grepar" joao em /etc/shadow e jogar o resultado em "shadow-final". Entende?



4. Re: Script para comparar

Alexandre
afteixeira

(usa openSUSE)

Enviado em 07/03/2014 - 13:11h

Para fazer o que vc pediu, pode usar isso:

for uid in $(awk -F: '{print $1}' /etc/passwd); do grep $uid /etc/shadow; done

Mas dessa forma, vc consegue somente os usuários que estão nos 2 arquivos. É isso que vc precisa? Ou saber se um usuário está em um arquivo, mas não em outro?


5. Re: Script para comparar

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/03/2014 - 13:19h

Por que, então, você usou o cut no /etc/shadow?

Não esqueça de tratar o caso em que os nomes de usuários podem ser substrings um do outro. Do jeito como você fez, a existência de "ana" no arquivo passwd seria suficiente para importar do shadow não só a "ana", mas também a "juliana", a "janaina" e o "anacleto".

Eis como eu faria.

sudo bash -c 'grep -f <(sed "s/^\([a-zA-Z][^:]*:\).*/^\1/" /etc/passwd) /etc/shadow' 


Se você já estiver logado como root, o comando se reduz.

grep -f <(sed 's/^\([a-zA-Z][^:]*:\).*/^\1/' /etc/passwd) /etc/shadow 


Por partes: a construção "<(...)" do bash é uma forma de executar um comando redirecionando sua saída para um named pipe, que é passado como arquivo de leitura do parâmetro "-f" do grep. O comando que é executado dentro do "<(...)" é tal que extrai os nomes de usuários do passwd (exigindo que comecem com uma letra) e os imprime numa forma "^nome:", para que o grep não pegue nem "juliana" nem a "janaina" nem "anacleto" em função da existência da "ana".


6. Re: Script para comparar

Daniel Vasconcelos
danielvasc

(usa Debian)

Enviado em 07/03/2014 - 15:06h

Funcionou usando grep -f <(sed 's/^\([a-zA-Z][^:]*:\).*/^\1/' passwd) shadow > pronto.txt

Valeu!!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts