在 bash 脚本中的 perl 命令中使用 bash 变量

在 bash 脚本中的 perl 命令中使用 bash 变量

/etc/shadow我正在尝试使用 bash 脚本生成文件中的哈希密码。系统会提示用户输入保存在变量中的密码PSWD。我已从文件中提取了哈希值和盐值/etc/shadow,并将它们分别保存在变量HVAL和中SVAL

现在,为了使用密码和盐值生成哈希密码,我需要使用下面给出的命令(参考):

$ perl -e 'print crypt("password","\$6\$salt\$") . "\n"'

在上面的命令中,我必须用变量替换“password” $PSWD,用变量替换“6”,$HVAL用变量替换“salt” $SVAL

我尝试导出上面的变量并在 perl 命令中替换它们,如下所示,但它完全搞砸了。

perl -e 'print crypt("$ENV{"PSWD"}","\$$ENV{"HVAL"}\$$ENV{"SVAL"}\$") . "\n"'

将会有哪些更正?

答案1

问题出在你的双引号上。在这里您不需要按原样引用这些哈希键简单标识符。从perldoc perldata

事实上,此类花括号中的简单标识符被强制为字符串,散列下标中也是如此。都不需要引用。我们之前的示例$days{'Feb'}可以写为,$days{Feb}并且将自动假定引号。但下标中任何更复杂的内容都将被解释为表达式。例如,这意味着$version{2.0}++相当于$version{2}++,而不是$version{'2.0'}++

所以:

perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")'

如果您在反引号内使用它,则需要将反斜杠加倍,如下所示:

var=`perl -le 'print crypt($ENV{PSWD},"\\$$ENV{HVAL}\\$$ENV{SVAL}\$")'`

最好是使用$(...)命令替换的形式:

var=$(perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")')

答案2

获得正确引用的顺序从原始命令开始:

perl -e 'print crypt("password","\$6\$salt\$") . "\n"'

让我们添加一些空间:

perl -e 'print crypt("  password  ","\$  6  \$  salt  \$") . "\n"'

让我们将变量更改为其等效项:

perl -e 'print crypt("  $ENV{PSWD}  ","\$  $ENV{HVAL}  \$  $ENV{SVAL}  \$") . "\n"'

等价物不应被引用,因为在引号中它们会失败:

perl -e 'print "$ENV{PSWD}" . "\n"'      # correct.
perl -e 'print "$ENV{"PSWD"}" . "\n"'    # fail.

最后,让我们删除上面插入的空格:

perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"'

然后,可以将命令分配给变量。

var="$(  perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"'  )"

使用导出值:PSWD=password, HVAL=6SVAL=saltsalt我得到:

$6$盐盐$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

相关内容