【问题标题】:Password hash not working with single quotes密码哈希不适用于单引号
【发布时间】:2017-07-03 13:03:06
【问题描述】:

我正在尝试使用 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 操作系统。

【问题讨论】:

  • 你怎么打电话给sed?单引号在此命令中不应该是特殊的。例如:hashedPassword="start'end" && echo '/^user1:/s_:[^:]*:_:'"$hashedPassword"':_' 打印出/^user1:/s_:[^:]*:_:start'end:_,看起来不错。

标签: bash perl hash solaris


【解决方案1】:

您的问题出在 bash 中。尝试通过将其括在单引号中来设置包含单引号的 shell 变量是行不通的。根据手册页:

用单引号括起来的字符会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

【讨论】:

    【解决方案2】:

    将密码作为参数提供给您的单行代码,而不是直接在代码中插入:

    #!/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'
    

    【讨论】:

    • 我能说服你参加今年的伦敦 Perl 研讨会吗?给我发邮件,我们可以聊天。 :)
    • @simbabque 哇!伦敦?!让我考虑一下。我爱上了那个城市:-)
    • 你去吧:act.yapc.eu/lpw2017 伦敦的传统上是星期六,而且是免费的。不幸的是,与其他人相比,这次旅行更贵。你确实错过了汉堡和阿姆斯特丹的 Perl 会议。我认为那个人离你很近,不是吗?
    【解决方案3】:

    由于密码包含$$在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"'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2020-05-10
      相关资源
      最近更新 更多