如何用Bash脚本将curl输出替换wp-config.php中的密钥盐代码段?
修复替换wp-config.php密钥段的Bash脚本错误
需求与问题
要写个Bash脚本,把wp-config.php里从/**#@+到/**#@-*/的密钥配置块,替换成WordPress官方接口返回的新密钥(通过curl https://api.wordpress.org/secret-key/1.1/salt/获取)。
自己写的脚本执行时报错:
sed: -e expression #1, char 20: extra characters after command
错在哪
- 直接把带换行、单引号的
${SALT}变量塞sed命令里,sed解析不了这种复杂内容,直接报错 - sed命令的逻辑拼接有问题,变量引用没处理特殊字符
- 路径变量写错了,
${WP-ROOT}应该是${WP_ROOT}
正确的sed脚本
#!/bin/bash # 拉取最新密钥,-s参数关闭curl的进度输出 SALT=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/) WP_ROOT="/var/www/html/123123" CONFIG_FILE="${WP_ROOT}/wp-config.php" # 替换指定代码块,同时创建备份文件(.bak后缀) sed -i.bak -e "/\/\*\*#@+/,/\/\*\*#@-\*\//c\\${SALT//$'\\'/\\\\}" "$CONFIG_FILE"
脚本细节
-i.bak:直接修改原文件,同时生成wp-config.php.bak备份;不需要备份的话,改成-i即可/\/\*\*#@+/,/\/\*\*#@-\*\//:精准匹配要替换的代码块范围${SALT//$'\\'/\\\\}:把密钥内容里的反斜杠转义,避免sed解析出错- 用双引号包裹文件路径,防止路径带空格时出问题
更稳定的awk实现方案
如果sed还是搞不定特殊字符,用awk更稳妥:
#!/bin/bash SALT=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/) WP_ROOT="/var/www/html/123123" CONFIG_FILE="${WP_ROOT}/wp-config.php" awk -v salt="$SALT" ' /\/\*\*#@+/ { print; print salt; skip=1; next } skip && /\/\*\*#@-\*\// { skip=0; next } !skip ' "$CONFIG_FILE" > temp-config.php && mv temp-config.php "$CONFIG_FILE"
awk逻辑说明
- 碰到
/**#@+时,先打印该行,再打印新密钥,然后开启跳过模式 - 跳过模式下,直到碰到
/**#@-*/才关闭跳过,中间的旧密钥内容都不打印 - 关闭跳过模式后,正常输出文件其他内容
- 最后把结果写到临时文件,替换原配置文件
内容的提问来源于stack exchange,提问作者Petar Tahchiev
相关产品推荐
相关产品推荐

