Substuição de conteúdo - Shell Script
Olá pessoal,
Possuo um arquivo gigante, que em cada linha possui um registro que faz referência a um usuário. Este arquivo tem que ser modificado para se adequar aos padrões do novo servidor (método para migrar os usuários de uma plataforma webmin para o cpanel).
Bom, vejamos um exemplo (vou utilizar aqui 4 linhas apenas).
Arquivo de configuração do servidor antigo:
Código HTML:
zanella:x:571:610:ZANELLA CORRETORA DE SEGUROS LTDA:/home/mensagem/zanella:/sbin/nologin
ernesto:x:572:610:ERNESTO TARCISIO BAGGIO:/home/mensagem/ernesto:/sbin/nologin
felipe:x:578:610:felipe zibell:/home/mensagem/felipe:/sbin/nologin
debora:x:579:610ebora Nedel:/home/mensagem/debora:/sbin/nologin
Arquivo modificado e pronto para ser usado no servidor novo:
Código HTML:
felipe:x:578:610:felipe zibell:/dominios/stche/mail/stcheturbo.com.br/felipe:/dominios/stche
debora:x:579:610ebora Nedel:/dominios/stche/mail/stcheturbo.com.br/debora:/dominios/stche
nedel:x:581:610:Clovis Nedel:/dominios/stche/mail/stcheturbo.com.br/nedel:/dominios/stche
farias:x:611:610:Farias Dema:/dominios/stche/mail/stcheturbo.com.br/farias:/dominios/stche
Bom, possuo aproximadamente 8 mil linhas neste arquivo, com várias destas entradas. Como elas possuem um padrão, creio que seja então possível criar um script para automatizar este trabalho.
Se alguém puder me ajudar com um script útil, serei eternamente grato.
Re: Conversão de formatos - Shell Script
Citação:
Postado originalmente por
danielvasc
Olá pessoal,
Possuo um arquivo gigante, que em cada linha possui um registro que faz referência a um usuário. Este arquivo tem que ser modificado para se adequar aos padrões do novo servidor (método para migrar os usuários de uma plataforma webmin para o cpanel).
Bom, vejamos um exemplo (vou utilizar aqui 4 linhas apenas).
Arquivo de configuração do servidor antigo:
Código HTML:
zanella:x:571:610:ZANELLA CORRETORA DE SEGUROS LTDA:/home/mensagem/zanella:/sbin/nologin
ernesto:x:572:610:ERNESTO TARCISIO BAGGIO:/home/mensagem/ernesto:/sbin/nologin
felipe:x:578:610:felipe zibell:/home/mensagem/felipe:/sbin/nologin
debora:x:579:610ebora Nedel:/home/mensagem/debora:/sbin/nologin
Arquivo modificado e pronto para ser usado no servidor novo:
Código HTML:
felipe:x:578:610:felipe zibell:/dominios/stche/mail/stcheturbo.com.br/felipe:/dominios/stche
debora:x:579:610ebora Nedel:/dominios/stche/mail/stcheturbo.com.br/debora:/dominios/stche
nedel:x:581:610:Clovis Nedel:/dominios/stche/mail/stcheturbo.com.br/nedel:/dominios/stche
farias:x:611:610:Farias Dema:/dominios/stche/mail/stcheturbo.com.br/farias:/dominios/stche
Bom, possuo aproximadamente 8 mil linhas neste arquivo, com várias destas entradas. Como elas possuem um padrão, creio que seja então possível criar um script para automatizar este trabalho.
Se alguém puder me ajudar com um script útil, serei eternamente grato.
Daniel,
Seu arquivo de origem está deformado. Veja que em "610ebora", estão faltando caracteres. Talvez tenham sido tratados como emoticon pelo editor WYSIWYG do Under-Linux, comportamento que acontece quando o usuário não marca a opção "Desativar smilies do texto".
Supondo que seu arquivo de origem esteja íntegro, o script que você precisa está demonstrado abaixo, considerando o exemplo informado por você, considerando que "ul-origem.txt" é sua origem e "ul-destino.txt" é seu arquivo de destino.
Faça um teste e veja se está de acordo o script. Com base na fonte e modelo de saída fornecido por você, está OK :)
Código :
awk '{split($0, z, ":"); print z[1]":"z[2]":"z[3]":"z[4]":"z[5]":/dominios/stche/mail/stcheturbo.com.br/"z[1]":/dominios/stche"}' ul-origem.txt > ul-destino.txt
Re: Substuição de conteúdo - Shell Script
Perfeito, funcionou do jeito esperado!
Respondendo a sua dúvida, sim, foram os emoticons do fórum que ocasionaram aquelas falhas no texto que eu havia inserido.
Bom, meu problema não terminou por aqui. Veja se pode me ajudar mais um pouquinho.
Além deste arquivo "passwd", tenho o arquivo "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 "zanella". Depois, faz uma comparação: Se este usuário estiver no arquivo shadow, jogar essa linha do shadow em um novo arquivo. Dessa maneira, os dois arquivos iam conter o mesmo número de linhas, com os mesmos usuários.
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
danielvasc
Perfeito, funcionou do jeito esperado!
Que boa notícia :D
Citação:
Postado originalmente por
danielvasc
Respondendo a sua dúvida, sim, foram os emoticons do fórum que ocasionaram aquelas falhas no texto que eu havia inserido.
Ok :)
Citação:
Postado originalmente por
danielvasc
Bom, meu problema não terminou por aqui. Veja se pode me ajudar mais um pouquinho.
Além deste arquivo "passwd", tenho o arquivo "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 "zanella". Depois, faz uma comparação: Se este usuário estiver no arquivo shadow, jogar essa linha do shadow em um novo arquivo. Dessa maneira, os dois arquivos iam conter o mesmo número de linhas, com os mesmos usuários.
Daniel, veja se os comandos pwck e grpck não resolvem seu problema ;)
Re: Substuição de conteúdo - Shell Script
Não resolve. Preciso fazer aquela jogada lá que te disse antes :(
Re: Substuição de conteúdo - Shell Script
Simples,
Você vai Buscar pelos nomes que estão no passwd no shadow, você poderá fazer isto utilizando "laço"!
#!/bin/bash
for i in $(cat /etc/passwd | cut -d: -f1)
do
PeGREP=$(grep -o $i /etc/shadow)
if [ $i == $PeGREP ]
then
echo $PeGREP >> contem
else
echo $PeGREP >> ncontem
fi
done
OBS: não contém poderá apacecer nomes repetidos.
flw
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
caicarabruno
Simples,
Você vai Buscar pelos nomes que estão no passwd no shadow, você poderá fazer isto utilizando "laço"!
Código :
#!/bin/bash
for i in $(cat /etc/passwd | cut -d: -f1)
do
PeGREP=$(grep -o $i /etc/shadow)
if [ $i == $PeGREP ]
then
echo $PeGREP >> contem
else
echo $PeGREP >> ncontem
fi
done
OBS: não contém poderá apacecer nomes repetidos.
flw
Bacana o script, entretanto, só está considerando a (in)consistência de /etc/passwd em relação à /etc/shadow, e não de /etc/shadow em relação à /etc/passwd. Portanto, se houver mais entradas em /etc/shadow do que /etc/passwd, não serão detectadas. O seu script é válido, se for considerada somente a diferença de "A" para "B" e não de "B" para "A".
Para detectar diferenças mútuas, sugiro o script abaixo:
Código :
cd /tmp
cut -d : -f 1 /etc/passwd > 1.txt
cut -d : -f 1 /etc/shadow > 2.txt
diff 1.txt 2.txt
rm 1.txt 2.txt
Re: Substuição de conteúdo - Shell Script
Bom considerando este fato realmente. Mas basta criar uma regra no proprio script para fazer o inverso.
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
caicarabruno
Bom considerando este fato realmente. Mas basta criar uma regra no proprio script para fazer o inverso.
Nada que mais um "for" não resolva :D
Re: Substuição de conteúdo - Shell Script
Ainda não rolou :(
As informações ficaram ambíguas, tudo distinto. To na merda cara. Tentei usar os dois métodos de vocês, porém não foi eficaz.
Obrigado mesmo assim.
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
danielvasc
Ainda não rolou :(
As informações ficaram ambíguas, tudo distinto. To na merda cara. Tentei usar os dois métodos de vocês, porém não foi eficaz.
Obrigado mesmo assim.
Daniel, você errou em alguma coisa. Veja que, com base no que você solicitou, os scripts atendem perfeitamente, tanto aquele feito pelo colega caicarabruno, quanto o meu também.
Citação:
Postado originalmente por
danielvasc
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 "zanella". Depois, faz uma comparação: Se este usuário estiver no arquivo shadow, jogar essa linha do shadow em um novo arquivo. Dessa maneira, os dois arquivos iam conter o mesmo número de linhas, com os mesmos usuários.
Experimente o seguinte:
Código :
cd /tmp
cut -d : -f 1 /etc/passwd | sort -fbn > 1.txt
cut -d : -f 1 /etc/shadow | sort -fbn > 2.txt
diff 1.txt 2.txt
rm 1.txt 2.txt
Veja se dá certo. Aqui fiz simulações e funcionou.
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
trober
Daniel, você errou em alguma coisa. Veja que, com base no que você solicitou, os scripts atendem perfeitamente, tanto aquele feito pelo colega
caicarabruno, quanto o meu também.
Experimente o seguinte:
Código :
cd /tmp
cut -d : -f 1 /etc/passwd | sort -fbn > 1.txt
cut -d : -f 1 /etc/shadow | sort -fbn > 2.txt
diff 1.txt 2.txt
rm 1.txt 2.txt
Veja se dá certo. Aqui fiz simulações e funcionou.
Bom, utilizando o comando "diff" realmente funciona, porém, ele me retorna um novo arquivo todo desorganizado. Eu preciso que ele compare, se existir o usuário em shadow, pega essa linha do shadow que tem este user e joga em um novo arquivo. Mas isso não acontece. Ele pega e joga apenas algo como:
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
danielvasc
Bom, utilizando o comando "diff" realmente funciona
Sim, disso não se tem dúvida :)
Citação:
Postado originalmente por
danielvasc
porém, ele me retorna um novo arquivo todo desorganizado. Eu preciso que ele compare, se existir o usuário em shadow, pega essa linha do shadow que tem este user e joga em um novo arquivo. Mas isso não acontece. Ele pega e joga apenas algo como:
Esta saída de comando está mostrando a diferença, com a informação do número da linha, em relação ao arquivo de origem e de destino.
Para fazer o que você precisa, baseado neste adendo de solicitação, modifique então o script do caicarabruno, e troca /etc/shadow por /etc/passwd, e vive-versa. Dará certo para o que você precisa, pois será tratado de B para A, e não de A para B.
Re: Substuição de conteúdo - Shell Script
Citação:
Postado originalmente por
trober
Sim, disso não se tem dúvida :)
Esta saída de comando está mostrando a diferença, com a informação do número da linha, em relação ao arquivo de origem e de destino.
Para fazer o que você precisa, baseado neste adendo de solicitação, modifique então o script do caicarabruno, e troca /etc/shadow por /etc/passwd, e vive-versa. Dará certo para o que você precisa, pois será tratado de B para A, e não de A para B.
Não resolveu o meu problema.
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 "arquivofinal". Entende?
Re: Substuição de conteúdo - Shell Script
Rss, etsou quase mandando vc usar o google! - "OPA MANDEI".
Cara ao usar o CUT vc esta copiando do arquivo apenas aquilo que você incialemente disse que seria necessário.
Como você mesmo disse, é só grepar o arquivo resultado no /etc/shadow.
grep resultado.txt /etc/shadow | tee resultado-novo.txt
Será que isso resolve Trober ?
Re: Substuição de conteúdo - Shell Script
Obrigado a ajuda de vocês.
Resolvi o problema utilizando o seguinte código:
grep -f <(sed 's/^\([a-zA-Z][^:]*:\).*/^\1/' passwd) shadow > resultado.txt