我在一个开源项目中找到了这段代码。这里在参数中传递了一些非零的密码。我想知道以下代码实际上对我有什么作用
perl -pe "s|$PASSWORD|<PASSWORD>|g"
答案 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>