我确定之前已经问到这个问题,如果有,我很抱歉,但我找不到它。
我正在尝试用dovecot SHA512-CRYPT密码替换下面的'mypassword'但是美元符号搞砸了,我无法弄清楚如何逃脱它。
从doveadm pw -s SHA512-CRYPT -p ${rootemailpw}
生成的密码类似于以下内容,您可以看到其中包含几个美元符号:
{SHA512-CRYPT}$6$sujue1sr0abLZisA$Dq1qtz422woyR/A4wDaJ9JYByKHis27FO.mO5EfUCDuI/PRSawxgCRGA3Oq/LE4Nbr32nCr4731BCPIotmRNR0
这是我正在使用的脚本:
rootemailpw=$(</dev/urandom tr -dc A-Za-z0-9 | head -c12)
rootpw=$(doveadm pw -s SHA512-CRYPT -p ${rootemailpw})
cat <<'EOF' > tmp
USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','mypassword');
EOF
sed -i "s/mypassword/${rootpw}/" tmp
那么如何在s/mypassword/${rootpw}/
答案 0 :(得分:3)
SHA哈希值可能包含斜杠字符(/
),这是通常的sed分隔符。 sed
支持大多数分隔符,因此一种方法是使用不同的分隔符,例如管道符(|
):
pw=$(doveadm pw -s SHA512-CRYPT -p somepassword)
echo password | sed "s|password|$pw|"
输出:
{SHA512-CRYPT}$6$qtXJPWaMbX3l8zMW$mXWuax8NG9Wa1AkFdcClA5vw2T3407uBdImKNNbcBd/CUkS5NafjZnQ5ow.IubyLujU5ohS8PWogdNoPiF4d//
答案 1 :(得分:0)
使用./tmp中的以下内容:
USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','mypassword');
执行rootpw='1234$asdf' ; cat tmp | sed "s/mypassword/${rootpw}/"
会将 mypassword 替换为 $ {rootpw} 的内容,如下所示:
USE `postfix`;
INSERT INTO `users` (`username`,`password`) VALUES ('root@localhost','1234$asdf');
有:
rootpw='1234$asdf'
设置环境变量cat tmp | sed "s/mypassword/${rootpw}/"
将 mypassword 替换为“1234 $ asdf”在变量上使用单引号。
这会回答你的问题吗?