首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是perl -pe "s|$PASSWORD|<PASSWORD>|g"?

什么是perl -pe "s|$PASSWORD|<PASSWORD>|g"?
EN

Stack Overflow用户
提问于 2019-05-09 19:04:57
回答 3查看 141关注 0票数 0

我在一个开源项目中找到了这段代码。这里的参数传递了一些非零的密码。我想知道下面的代码到底为我做了什么

代码语言:javascript
复制
perl -pe "s|$PASSWORD|<PASSWORD>|g"
EN

回答 3

Stack Overflow用户

发布于 2019-05-09 19:20:56

这是一个错误的版本

代码语言:javascript
复制
PASSWORD="$PASSWORD" perl -pe's/\Q$ENV{PASSWORD}/<PASSWORD>/g'

在这个经过修正的版本中,shell启动perl,将shell变量$PASSWORD作为环境变量PASSWORD传递给perl

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

代码语言:javascript
复制
$ 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

您提供的版本是相似的。

代码语言:javascript
复制
$ PASSWORD='foobar'

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

但是,如果原始密码包含|\$@+*?^、D19、D20、D21、D22、D23、D24和可能的其他字符,则您提供的版本中的code injection错误会以各种方式导致失败。

代码语言:javascript
复制
$ PASSWORD='foo|bar'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
syntax error at -e line 1, near "PASSWORD>"
Execution of -e aborted due to compilation errors.


$ PASSWORD='foo*bar'

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


$ PASSWORD='$x[exec("echo hacked")]'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
hacked
票数 8
EN

Stack Overflow用户

发布于 2019-05-10 11:08:53

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

代码语言:javascript
复制
LINE:
  while (<>) {
      s|xxx|<PASSWORD>|g
  } continue {
      print or die "-p destination: $!\n";
  }

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

要了解更多信息,请访问:https://perldoc.pl/perlrun#-p (或man perlrun)

"perlrun“文档还解释了"perl”命令的各个选项。

票数 3
EN

Stack Overflow用户

发布于 2019-05-09 19:17:27

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

你可以用这个最小的例子来尝试一下:

代码语言:javascript
复制
export PASSWORD=secret_password
echo "My password is: secret_password" | perl -pe "s|$PASSWORD|<PASSWORD>|g"

输出为:

代码语言:javascript
复制
My password is: <PASSWORD>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56057998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档