【问题标题】:Combine 'if' and 'if not' in perl在 perl 中结合 'if' 和 'if not'
【发布时间】:2022-01-21 11:46:58
【问题描述】:

我的httpd.conf 中有以下过滤器:

ExtFilterDefine jsonfilter mode=output intype=application/json cmd="/usr/bin/perl -pe 's|^|qq(\,\") . valid . qq(\"\: ) . qq(\") . time() . \\x0D . qq(\") . qq(\\n)|e if ($==eof) &&  unless (-f q{/tmp/md5_filter.tmp})'"

但是我使用&& 操作符的方式是无效的。如果我请求文件,我不会收到任何输出。过滤器仅应在md5_filter.tmp 文件不存在且s 命令应仅在end of file (eof) 处添加时间戳时运行。有人知道我的代码有什么问题吗?

【问题讨论】:

  • 谢谢。 valid 只是一个简单的字符串,用于输出请求的 json 文件。

标签: perl


【解决方案1】:

你的代码有很多奇怪的地方。

/usr/bin/perl -pe 's|^|qq(\,\") . valid . qq(\"\: ) . qq(\") . time() . \\x0D . qq(\") . qq(\\n)|e if ($==eof) &&  unless (-f q{/tmp/md5_filter.tmp})'
  • perl -pe 实际上并没有更改文件。不确定这是否是您的意图。如果您确实想更改文件,则需要添加-i 开关。请注意,这会在您每次运行时更改您的文件。
  • s| 您已将替换运算符的分隔符从 / 更改为 |。这通常在您需要在模式中使用斜杠 / 并且您希望避免转义它 \/ 时完成。但是,您的图案中没有斜线,因此无需进行此更改。
  • ^ 这表示字符串的开始。您的替换将从字符串的开头添加。由于您想添加到文件的末尾,我不确定您的想法。
  • qq(\,\") . valid . qq(\"\: ) . qq(\") . time() . \\x0D . qq(\") . qq(\\n) 您似乎认为连接运算符 . 做了一些特别的事情。这句话可以写成qq(,\"valid\": \") . time() . qq(\x0D\"\n)大概。引用和转义有点难以弄清楚。 (无需转义,:
  • if ($==eof) 是一种难以言喻的怪异。它表示$= = eof,它将eof() 测试的返回值分配给predefined $= variable(当前页面长度)。我很确定你不是那个意思,只是想检查一下if (eof)
  • if ($==eof) && unless (-f q{/tmp/md5_filter.tmp}) -- 这实际上是两个独立的语句,您不能连续两次使用 post-fix if。你也不需要。您可以将它们链接成一个,如下所示:if ( (eof) && (not -f q{...}) )

如果我们结合所有这些更正,我们会得到什么?好吧,我们明白了:

/usr/bin/perl -pe' s/^/qq(,\"valid\": \") . time() . qq(\x0D\"\n)/e if ( (eof) && (not -f q{/tmp/md5_filter.tmp}) )'

但是....你对这个声明做了什么?对于文件中的每一行,您正在检查它是否是文件的结尾。如果是,则检查文件是否存在,然后从该行的开头添加一个新字符串到最后一行。

认为你想要做的是等到文件的最后一行,然后打印它之后的一行。您无需替换即可打印,只需打印即可。所以我们删除替换并用打印替换它。由于我们要在最后一行之后打印,所以我们使用END 块在最后执行代码。

/usr/bin/perl -pe 'END { unless (-f q{/tmp/md5_filter.tmp}) { print qq(\,\"valid\"\: \") . time() . qq(\x0D\"\n) }'

如果文件的最后一行不以换行符结尾,则打印的字符串可能需要以换行符qq(\n... 开头。如果出于某种原因,您实际上打算将字符串写在行首,事情就会变得更加复杂。那么你可能最好使用第一个命令。

【讨论】:

  • 哇。我没想到所有细节都会有这么好的答案。非常感谢。我的意图不是用-i 更改请求的文件。只是更改 wpscan 等黑客工具的 md5 校验和的输出。使用if $==of 我只是想匹配文件的结尾,而不仅仅是一行的结尾。我的目标是在文件末尾添加时间戳。我还尝试使用-0777pe 而不是-pe 将整个文件视为一个字符串/行。但是它遇到了json文件的错误。
  • @cr4nk 不客气。对于这个问题,可能有比使用 Perl 更好的解决方案。考虑询问有关您的主要问题的问题。这听起来有点像 XY 问题。
  • 其实我不是程序员。我仍然在自己学习所有这些东西。我正在检查你的代码。知道我没有输出。也许有些问号不适合我的目的。我不知道。我通过请求 json 文件在浏览器中收到此错误:SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
  • 您在代码末尾错过了} :-)。它现在适用于 css 文件。对于 json 文件,我收到以下错误:SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 224 column 2 of the JSON data。我猜是因为字符串是在最后一个括号之后添加的,所以它不再是有效的 json 格式。我不能这样使用你的代码。对于 json 文件,我需要用,"valid": "1639939750x0D"} 替换最后关闭的}。我怎样才能用你的代码归档它?我需要s 替换吗?
  • @cr4nk 是的,要插入,您需要替换。可能您可以将原始替换中的^ 替换为}\s*$。如果最后一个 } 后面没有任何内容,除了可选的空格。
猜你喜欢
  • 2016-02-04
  • 2020-03-29
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2014-05-24
  • 2013-04-27
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多