1

我确定以前有人问过这个问题,如果有,我很抱歉,但我找不到。

我试图用 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}/

4

2 回答 2

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//
于 2013-03-07T21:43:06.517 回答
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');

为了:

  1. rootpw='1234$asdf'设置环境变量
  2. cat tmp | sed "s/mypassword/${rootpw}/"用“1234$asdf”替换mypassword

在变量上使用单引号。

这是否回答你的问题?

于 2013-03-07T21:19:47.387 回答