密码哈希不适用于单引号

Password hash not working with single quotes

我正在尝试使用 Perl 中的 crypt 哈希函数对密码进行哈希处理。到目前为止,在 Bash 脚本中我有:

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

然后我 modify/copy /etc/shadow 使用 sed:

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

该方法有效,但传递包含单引号的字符串时除外。如何处理包含 ' 单引号的密码? 运行 索拉里斯 10 OS.

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

#!/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 中的语法,因此在脚本中不容易硬传递,其他选项是通过参数或环境传递。

# 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"'

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

Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.