1

由于恶意攻击,下面的行已打印在我的所有 php 项目页面中。现在想想我如何使用 shell 脚本找到和删除这些行

function_exists('date_default_timezone') ?
  date_default_timezone_set('America/Los_Angeles') : 
    ($_REQUEST['c_id']));

我尝试使用下面的脚本,但出现错误。我的意思是说我无法将上面的行与 sed 推荐匹配。请帮助我更正此脚本..

#!/bin/sh
search='^function_exists\(\'date_default_timezone\'\)\ \?\ date_default_timezone_set\(\'America/Los_Angeles\'\)\ \:\  \(\$_REQUEST\[\'c_id\'\]\)\)\;'

for file in `find /root/test1 -name "*.php"`; do grep "$search" $file &> /dev/null if [ $? -ne 0 ]; then echo "Search string not found in $file!" else sed -i '/$search/d' $file
4

3 回答 3

1

尝试 sed 与 : 分隔符而不是 / 因为在您的模式中 America/La 与 /ir 冲突添加反斜杠,因此它的 America/la

于 2013-05-17T07:33:23.563 回答
1

您没有正确转义正则表达式。尝试以下操作:

while IFS= read -r -d '' file; do
    if grep -qF "function_exists('date_default_timezone') ? date_default_timezone_set('America/Los_Angeles') : (\$_REQUEST['c_id']));" "$file"
    then
        sed -i "s|function_exists('date_default_timezone') ? date_default_timezone_set('America/Los_Angeles') : (\$_REQUEST\['c_id'\]));|FOO|g" "$file"
    fi
done < <(find /root/test1 -type f -name "*.php" -print0)
于 2013-05-17T07:43:40.313 回答
0

这可能对你有用(GNU sed)

pattern1='function_exists('\''date_default_timezone'\'''
pattern2='.*date_default_timezone_set('\''America\/Los_Angeles'\'') :'
pattern3='.*($_REQUEST\['\''c_id'\''\]));'
sed '/^'"$pattern1"'/{N;N;/^'"$pattern1$pattern2$pattern3"'/d}' file
于 2013-05-17T13:04:11.443 回答