我正在编写一个脚本,可以自动为我安装 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
应该可以解决问题。