+ Responder ao Tópico



  1. #1

    Padrão 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.

  2. #2

    Padrão Re: Conversão de formatos - Shell Script

    Citação Postado originalmente por danielvasc Ver Post
    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

  3. #3

    Padrão 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.

  4. #4

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por danielvasc Ver Post
    Perfeito, funcionou do jeito esperado!
    Que boa notícia

    Citação Postado originalmente por danielvasc Ver Post
    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 Ver Post
    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

  5. #5

    Padrão Re: Substuição de conteúdo - Shell Script

    Não resolve. Preciso fazer aquela jogada lá que te disse antes :(

  6. #6

    Padrão 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

  7. #7

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por caicarabruno Ver Post
    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

  8. #8

    Padrão 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.

  9. #9

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por caicarabruno Ver Post
    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

  10. #10

    Padrão 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.

  11. #11

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por danielvasc Ver Post
    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 Ver Post
    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.

  12. #12

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por trober Ver Post
    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:

    Código :
    1a2> ernesto

  13. #13

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por danielvasc Ver Post
    Bom, utilizando o comando "diff" realmente funciona
    Sim, disso não se tem dúvida

    Citação Postado originalmente por danielvasc Ver Post
    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:

    Código :
    1a2> ernesto
    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.

  14. #14

    Padrão Re: Substuição de conteúdo - Shell Script

    Citação Postado originalmente por trober Ver Post
    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?

  15. #15

    Padrão 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 ?

  16. #16

    Padrão 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