Localizando arquivos que contêm várias cadeias de caracteres

1

Estou tentando encontrar scripts que contenham códigos mal-intencionados comuns. Preciso corresponder várias cadeias em cada arquivo. O que estou usando está funcionando, mas não tenho certeza porque obtenho o seguinte na saída:

# egrep -rli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset'
grep: ./wp-content/themes/twentyfourteen/js/menu61.php
./wp-content/themes/twentyfourteen/themes.php
./wp-content/themes/twentytwelve/file68.php
./wp-content/themes/twentythirteen/inc/page.php
./wp-content/themes/twentythirteen/inc/template.php
./wp-content/upgrade/include.php
./wp-content/plugins/wp-slimstat/browscap/diff8.php
./wp-content/plugins/quick-contact-form/gallery56.php
./wp-content/plugins/addthis/css/include.php
./wp-content/plugins/addthis/includes/include.php
./wp-content/plugins/tpc-memory-usage/images/code77.php
./wp-content/plugins/gotmls/images/index.php
./wp-content/plugins/tinymce-advanced/langs/object56.php
./wp-content/plugins/wp-security-audit-log/dirs70.php
./wp-content/plugins/wp-security-audit-log/css/list76.php
./wp-content/plugins/wp-security-audit-log/proxy.php
./wp-content/plugins/image-widget/lang/alias.php
./wp-content/plugins/my-page-order/template.php
./wp-content/uploads/2015/01/footer87.php
./wp-content/menu.php
./wp-includes/js/thickbox/db.php
./wp-includes/js/jquery/ui/footer39.php
./wp-includes/js/imgareaselect/general.php
./wp-includes/css/page25.php
./wp-includes/Text/Diff/Engine/dump.php
: No such file or directory

A saída é boa e é o que eu quero, mas por que ela aparece na linha 1:

grep: ./wp-content/themes/twentyfourteen/js/menu61.php

e a última linha sempre mostra:

: No such file or directory

e, por último, inseri-lo em um arquivo não funciona.

# egrep -rli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset' >> asd
    
por JCats 07.04.2015 / 14:36

2 respostas

1

O que você está vendo não é um resultado, é uma mensagem de erro. O formato do erro do grep quando solicitado a pesquisar por um arquivo inexistente é grep: file name: No such file or directory . Por exemplo:

$ grep foo bar
grep: bar: No such file or directory

É por isso que você obtém grep: no início e No such file or directory no final. É também por isso que você não pode redirecionar a saída para um arquivo, ele está sendo impresso para o erro padrão, não para a saída padrão e você está redirecionando o último. Você pode salvar a saída usando 2>> em vez de >> . Isso, no entanto, não é o que você quer, pois são erros.

Seu problema é que você está usando -0 com xargs , o que indica esperar dados separados por nulo. Como seus dados estão realmente separados por novas linhas (cada arquivo está em uma única linha), xargs diz grep para procurar por um arquivo com esse nome (o conjunto inteiro de múltiplas linhas). O que você quer fazer é:

 grep -Erli --include='*.php' 'return base64_decode' . | xargs grep -l 'isset'

Ou, se os seus nomes de arquivo puderem conter novas linhas e você tiver uma versão de grep que o suporte, use o -Z flag do grep para produzir saída separada por nulo:

grep -ZErli --include='*.php' 'return base64_decode' . | xargs -0 grep -l 'isset'

Observe também que uso grep -E em vez de egrep . Os egrep e fgrep estão obsoletos em favor de grep -E e grep -F , respectivamente.

    
por 07.04.2015 / 15:05
2

Tente executar xargs sem o parâmetro -0 . Esse parâmetro informa xargs para esperar nul-separated argumentos, o que não é o caso aqui.

    
por 07.04.2015 / 14:38

Tags