2017-07-03 104 views
-1

我想在Perl中使用crypt哈希函数来哈希密码。在bash脚本到目前为止我有:密码哈希不能用单引号

password='Pa$$word' 
hashedPassword="$(perl -e "print crypt('$password', 'salt'), \"\n"")" 

我然后使用SED修改/复制/ etc/shadow文件:

sed -e '/^user1:/s_:[^:]*:_:'"$hashedPassword"':_' /etc/shadow > /tmp/shadow 

方法的工作原理,将含有单引号的字符串时除外。我如何处理包含“单引号”的密码?运行Solaris 10操作系统。

+0

你是怎么调用'sed'的?这个命令中的单引号不应该是特殊的。例如:'hashedPassword =“start'end”&& echo'/^user1:/ s _:[^:] *:_:'“$ hashedPassword”':_''打印'/^user1:/ s _:[^ :] *:_:start'end:_',看起来不错。 – l0b0

回答

1

你的问题是在bash中。尝试设置一个包含单引号的shell变量(通过将它包含在单引号中)将不起作用。根据手册页:

用单引号括起来的字符会保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面加了反斜线。

1

提供密码作为参数传递给你一个班轮,而不是直接在代码中插吧:

#!/usr/bin/env bash 

password='Pa$$word' 
hashedPassword=$(perl -e 'print crypt($ARGV[0], "salt"), "\n"' $password) 

echo "p='$password', h='$hashedPassword'" 

输出:

p='Pa$$word', h='saFQXTeqbkiIQ' 
+0

今年我能说服你来伦敦Perl研讨会吗?给我发一封邮件,我们可以聊天。 :) – simbabque

+0

@simbabque哇!伦敦?!让我考虑一下。我非常喜欢那个城市:-) – PerlDuck

+0

你去了那里:http://act.yapc.eu/lpw2017/伦敦人传统上在星期六,而且是免费的。不幸的是,与其他人相比,这次旅行更昂贵。你确实想念汉堡和阿姆斯特丹的Perl大会。我觉得那个和你很接近,不是吗? – simbabque

0

由于密码包含$$是语法在Perl中,在脚本中传递并不容易,其他选项是通过参数或环境传递。

# by argument 
perl -e '($password, $salt)[email protected];print crypt($password, $salt), "\n"' "$password" "$salt" 

# by environment variable 
password=$password salt=$salt perl -e 'print crypt($ENV{password}, $ENV{salt}), "\n"'