我一直在努力解决grep问题,试图在我的服务器上反转服务器范围内的黑客攻击,但grep似乎无法在作为shell运行时搜索jpg文件,但是grep命令它在ssh中的自己的工作文件。
会返回结果: grep -l -R“nastycode”/ var / www / vhosts
但是当作为shell脚本运行时,它再也找不到jpgs了。
for file in $(grep -l -R "nastycode" /var/www/vhosts)
do
sed -e "s/"nastycode"/"nicecode"/ig" $file > /tmp/tempfile.tmp
mv /tmp/tempfile.tmp $file
echo "Modified: " $file
done
问:这可能与'for file in'部分有关吗?
问:在我们的搜索模式“nastycode”中,我们可以搜索具有正则表达式字符的内容但是将它们视为正常($,|?etc)吗?
提前感谢。
尼古拉斯
答案 0 :(得分:0)
grep
就可以选择忽略特殊字符(-F
)。遗憾的是,sed
没有这样的选择。如果其中包含特殊字符,则必须对其进行转义。如果其中包含大量/
,则可以通过更改分隔符 - s|old|new|
或s@old@new@
或您的代码不包含的其他字符来避免转义它们。关于结构的其余部分,我有几点意见。首先,你永远不应该使用那个for file in command
结构,它会破坏白色空间;使用**
(您可能需要首先使用shopt -s globstar
启用它)或find
。接下来,GNU sed
有一个内联选项-i
。您也可以为其指定备份后缀(例如-i.bak
)。由于sed
仅在找到模式时才会更改,因此无论如何都没有理由使用grep
来限制文件。
将所有这些放在一起,(一旦你的正则表达式被转义 - 如果你需要它我们也可以提供帮助)你可以使用这些:
# Globstar
for file in /var/www/vhosts/**; do
sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' $file
done
# find
find /var/www/vhosts -type f -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} \;
# If you really want the echo notification
find /var/www/vhosts -type f -exec grep -qiF ') || stristr($ua' {} \; -exec sed -i.bak 's/) || stristr(\$ua/) \&\&false || stristr($ua/ig' {} + -printf "Modified %p\n"