Encontre um arquivo que contenha uma string e apague-o no Ubuntu

3

Meu CMS está cheio de scripts de SPAM e eles estão quase em todas as pastas. Eu descobri que posso encontrar esses scripts usando o comando find / grep:

sudo find . -type f \( -name '*.php' -or -name '*.node' \) -exec grep -i "eval(base64_decode" {} +

Bem, alguns dos arquivos contêm apenas o script de spam e estão entre 300 - 302 Bytes.

Mas alguns outros arquivos, que são usados pelo CMS, também estão infectados. Eles não devem ser excluídos completamente, apenas tudo, desde o primeiro caractere até o primeiro fechamento do php ("? >").

Primeiro eu usei o comando "delete" e escrevi isto:

sudo find . -type f \( -name '*.php' -or -name '*.node' \) -exec grep -i "eval(base64_decode" {} + -delete

Mas isso foi um grande erro porque eu excluí todos os meus arquivos importantes. Antes de apagar mais arquivos, eu só queria perguntar como fazer isso?

Algo como: obter todos os arquivos encontrados no código acima e verificar se estão entre 300 - 302 bytes, se sim - > delete isso. Se não - > Exclua a primeira seção do PHP. Mas importante !!! Não apagando o resto! O arquivo é como:

<?php ?> ... <?php ?> ... <?php ?>"

apenas o primeiro bloco do PHP está infectado.

Por favor, você pode me ajudar? Existem centenas de arquivos e eu não quero fazer isso sozinho.

Muito obrigado em avançado!

    
por user1130108 13.10.2014 / 13:34

1 resposta

2

Você pode tentar o seguinte comando que chamará um comando perl find / replace para cada arquivo que corresponda ao padrão "eval(base64_decode" :

sudo find . -type f \( -name '*.php' -or -name '*.node' \) -exec grep -li "eval(base64_decode" {} \; 2>/dev/null | xargs perl -i -p0e 's/<\?php.*?\?>//s'

A parte perl removerá apenas o primeiro bloco <?php ?> nos arquivos retornados pelo comando find .

    
por Sylvain Pineau 13.10.2014 / 14:14