1

これは以前に聞いたことがあると思います。聞いたことがある場合は申し訳ありませんが、見つかりません。

次の「mypassword」を鳩小屋のSHA512-CRYPTパスワードに置き換えようとしていますが、ドル記号が台無しになっていて、エスケープする方法がわかりません。

から生成されたパスワード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ほとんどの区切り文字をサポートしているため、その回避策の1つは、別の区切り文字を使用することです。たとえば、パイプ文字(|):

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}/"mypasswordを「1234$asdf」に置き換えます

変数には一重引用符を使用してください。

それはあなたの質問に答えますか?

于 2013-03-07T21:19:47.387 に答える