我试图在Perl中使用crypt hash函数来散列密码。到目前为止,我在Bash脚本中有:
password='Pa$$word'
hashedPassword="$(perl -e "print crypt('$password', 'salt'), \"\n"")"
然后使用sed:
修改/复制/ etc / shadowsed -e '/^user1:/s_:[^:]*:_:'"$hashedPassword"':_' /etc/shadow > /tmp/shadow
该方法有效,但传递包含单引号的字符串时除外。如何处理包含'的密码?单引号?运行Solaris 10 OS。
答案 0 :(得分: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'
答案 1 :(得分:1)
你的问题是在bash。尝试通过将单个引号括起来来设置包含单引号的shell变量将不起作用。根据手册页:
用单引号括起字符可保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
答案 2 :(得分:0)
由于密码包含$
而$
在perl中是语法,因此在脚本中传递不是很容易,其他选项是通过参数或环境传递。
# by argument
perl -e '($password, $salt)=@ARGV;print crypt($password, $salt), "\n"' "$password" "$salt"
# by environment variable
password=$password salt=$salt perl -e 'print crypt($ENV{password}, $ENV{salt}), "\n"'