/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=6
,SVAL=saltsalt
我得到:
$6$盐盐$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/