如何在 sed 与 apg 结合时防止其中断?

如何在 sed 与 apg 结合时防止其中断?

我正在编写一个脚本,可以自动为我安装 WordPress,以使我的生活更轻松,因为我必须不断部署 WordPress 安装。

然而,我试图让它永远不需要与我互动,而这会让我无法入睡。

为了生成数据库和其他内容的密码,我使用 apg,然后使用 sed 用正确的密码替换字符串。它看起来像这样:

DOMAIN="$2"
DB_NAME_USER="$(echo $DOMAIN | sed -e 's/\.//g')"
DB_PASSWORD="$(apg -a 1 -n 1 -m 64 -d -c cl_seed -E \_\"\'\`\/\\\=)"

sed -i "s/database_name_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/username_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

替换数据库和用户名没问题,但替换密码时,十有八九会出错,我最终得到了如下的结果:

定义('DB_PASSWORD','Ymb{X-dT~l5Agg9q561A^?n密码在这里D;$U,s>mu*:f7|BK4?oM#OH>cHgsI9GndW@~SkBQ');

强调这个问题。它不是删除“password_here”部分并将其替换为实际密码,而是将字符串融合在密码中间。

我认为它可能是由 apg 生成的字符,与 sed 混淆了,但我从使用 -E 生成的密码中删除了不少字符,但仍然经常遇到这种情况。

其他替换也会出现同样的情况,总是涉及 apg 和 sed。替换诸如请在此输入密码时常会导致同样的问题。

有没有办法解决这个问题,还是我必须继续尝试查找导致问题的字符,然后将它们添加到 apg 的排除列表中?或者也许告诉 sed 替换整行而不是仅替换我想要的字符串?

提前致谢!

答案1

您需要转义输入中的\/&字符,否则 sed 会对其采取行动。例如

DB_PASSWORD=$(echo "$DB_PASSWORD" | sed -e 's/[\/&]/\\&/g')
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

应该可以解决问题。

相关内容