perl -pe“ s | $ PASSWORD | <密码> | g”是什么?

时间:2019-05-09 11:04:57

标签: perl

我在一个开源项目中找到了这段代码。这里在参数中传递了一些非零的密码。我想知道以下代码实际上对我有什么作用

perl -pe "s|$PASSWORD|<PASSWORD>|g"

3 个答案:

答案 0 :(得分:9)

这是越野车的版本

PASSWORD="$PASSWORD" perl -pe's/\Q$ENV{PASSWORD}/<PASSWORD>/g'

在此经过更正的版本中,shell启动perl,并将shell变量$PASSWORD作为环境变量perl传递到PASSWORD

perl将遍历指定文件的每一行(如果没有提供路径作为参数,则遍历STDIN)。在每个实例中,它将用PASSWORD替换环境变量<PASSWORD>的值的每个实例。这些可能已修改的行将它们输出到STDOUT。

$ PASSWORD=bar

$ cat file
foo
bar
foobarfoobarfoo
foo

$ PASSWORD="$PASSWORD" perl -pe's|\Q$ENV{PASSWORD}|<PASSWORD>|g' file
foo
<PASSWORD>
foo<PASSWORD>foo<PASSWORD>foo
foo

您提供的版本与此类似。

$ PASSWORD='foobar'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
fobar <PASSWORD>

但是,如果原始密码包含|\$,{{1},则您显示的版本中的code injection错误会导致它以各种方式失败。 }},@+*?^()[]{以及其他可能的字符。

}

答案 1 :(得分:3)

-p选项创建一个while循环,包含-e的内容。对于这个特定的问题,假设PASSWORD=xxx,这是生成的代码:

LINE:
  while (<>) {
      s|xxx|<PASSWORD>|g
  } continue {
      print or die "-p destination: $!\n";
  }

正如其他人指出的那样,$PASSWORD可能被shell替换为env var“ PASSWORD”的值,而不是perl代码中的变量。我将“ xxx”放在这里只是为了演示这一点。

有关详细信息,请访问:https://perldoc.pl/perlrun#-p(或man perlrun

“ perlrun”文档还介绍了“ perl”命令的各个选项。

答案 2 :(得分:1)

它处理STDIN上的所有行,并用PASSWORD占位符替换<PASSWORD>环境变量的值。

您可以通过以下最小示例进行尝试:

export PASSWORD=secret_password
echo "My password is: secret_password" | perl -pe "s|$PASSWORD|<PASSWORD>|g"

输出为:

My password is: <PASSWORD>