【问题标题】:Perl: Access server $ENV in substitutionPerl:访问服务器 $ENV 代替
【发布时间】:2022-01-12 21:03:21
【问题描述】:

我一直在寻找通过在 Apache 服务器的 httpd.conf 中使用 perl 替换来将字符串替换为服务器 $ENV[KEY] 的值的方法。到目前为止我的代码:

ExtFilterDefine htmlfilter mode=output intype=text/html cmd="/usr/bin/perl -pe 's|Mountainbike|qq(\") $ENV qq(\")|e'"

sn-p 不起作用。有人知道如何解决吗?我想这与引号有关

|qq(\") $ENV qq(\")|

我还尝试了另一种选择,将我的 perl 代码放入 *.pl 文件中,然后将以下内容放入我的 httpd.conf 文件中:

ExtFilterDefine htmlfilter mode=output intype=text/html cmd="/usr/bin/perl -pe 's|Mountainbike|perl env_check.pl|e'"

这按我的预期工作,完全没问题。但是在上面的第一个班轮示例中我该怎么做呢?

【问题讨论】:

  • "perl -pe 's|Mountainbike|qq(\") $ENV qq(\")|e" 你的意思是从@访问$ENV{KEY} Perl 中的 987654327@ 哈希?试试perl -pe 's|Mountainbike|qq(\") . $ENV{KEY} . qq(\")|e"
  • 是的,我的意思是 %ENV 哈希。很好的建议。谢谢它的工作原理:-)。关于它的另一个问题。是否可以在上面评论中的 sn-p 的一个衬里内制作if statement?仅当$ENV{KEY} = "blue" 时,我才想运行我的过滤器(将字符串 A 替换为字符串 B)。也许像这样:perl -pe 's|Mountainbike|blue|e if$==eof & $ENV{KEY} = "blue""。使用e if$==eof ,我只能在文件末尾添加替换。
  • perl -0777pe's/Mountainbike$/blue/ if $ENV{KEY} eq q{blue}' -0777 导致整个文件被视为一行。 $ 匹配行尾或行尾 LF 之前。
  • 不幸的是,if statement 不起作用。我的问题可能是什么?引用或缺少eperl -0777pe 's/Mountainbike$/E-Bike/e if $ENV{KEY} eq q{blue}'q{blue} 呢。这是对的还是你的意思是qq(\") . {blue} . qq(\")
  • 我发布的内容有效。使用printf 'Mountainbike\nMountainbike\n' | perl ... 非常容易证明。 /// e 是错误的。 E-Bike 不是有效的 Perl 代码。 s{...}{...}s{...}{ qq{...} }e 的缩写 /// qq(\") . {blue} . qq(\") 没有意义。 q{blue}'blue' 相同(我真的是 q'blue' 的缩写)。通过使用q{} 而不是''"",我避免了冲突。

标签: perl environment-variables


【解决方案1】:

访问环境变量的值是使用

$ENV{KEY}

整个替换看起来像这样:

s/Mountainbike/qq(") . $ENV{KEY} . qq(")/e

简化:

s/Mountainbike/qq("$ENV{KEY}")/e

简化:

s/Mountainbike/"$ENV{KEY}"/

一个捕获。引号告诉我你正在构建一段代码。如果环境变量的值包含" 或其他特殊字符怎么办?这受到code injection 错误的影响。假设使用 \ 转义所有特殊字符是安全的,您可以使用以下方法解决该问题:

s/Mountainbike/"\Q$ENV{KEY}\E"/

最后,你需要包含在指令中。

... cmd="s/Mountainbike/\"\\Q$ENV{KEY}\\E\"/"

【讨论】:

  • 感谢有关代码注入的建议。这是非常重要和有用的。你说的对。您能否也给我一些提示如何使用您的 sn-p 和上面的 if statement
  • 如果您有新问题,请随时发布新问题。请务必包含示例输入和您希望为该输入获得的输出。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 2020-09-22
  • 2016-01-06
  • 2019-12-12
  • 1970-01-01
  • 2015-07-28
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多