【问题标题】:Issue with Sed Replacing a TokenSed 替换令牌的问题
【发布时间】:2017-09-15 12:05:10
【问题描述】:

我有一些 bash 用于在服务器上“安装”一个 wordpress 站点。

在其中,我通过 SALTS=$(curl -L https://api.wordpress.org/secret-key/1.1/salt/); 发出 curl 请求以获取随机 SALT

我在我的 wp-config.php 文件 ##WP_SALTS## 中放了一个“令牌”

我的sed 声明似乎不正确,因为它不断向我抛出错误:

sed: -e expression #1, char 99: unknown option to `s'

我试过了:

sed -i "s+##WP_SALTS##+$SALTS+g" $WPCONFIG

还有:

sed -i "s/##WP_SALTS##/$SALTS/g" $WPCONFIG

仍然出现错误。我做错了什么?

curl 请求的响应每次都是随机的,但类似于:

define('AUTH_KEY', ':a>?5od_kaveFKaIB8px|!vgF-W/6/AQX04=&>Tu.-q3ehGOh59=SX+qc9sWk|gG'); define('SECURE_AUTH_KEY', ':tw+w! Sn2n~Rt0ReVA6#eWqsUXW5elHo@V~ oiRhTH4k]kg{<k`:An`]z==K@wZ'); define('LOGGED_IN_KEY', 'mD,JT*4pa3}zfGEpXFR}9jlzF,iD ;:]|>yu]T}&8Uy~(-5ml/AEBTG4|7QYCB|j'); define('NONCE_KEY', '@{Q`.7T a)S?0DTutE}D5Is(UlwnG4NuoQiFHas&i@qz%-HTd7-8[v50Nx<]akuT'); define('AUTH_SALT', 'es*7hCVnh/+c-cecgmZ?%QZ_KN^kaA[jD]N}{A8sK|~MH@Vl|(6-|{3EIGMhksy['); define('SECURE_AUTH_SALT', '}AF@:i!hy#C5,Q_5c4yhycm~i|fc53@+|h7r5H9y(/&4VBeX&sOrKC-6+AqeZ|L>'); define('LOGGED_IN_SALT', '4,}H+&[@qN#^!B+?3a+Mh0+?pURhP|v.CV/]4F-6G!TncU*Pd=GMSRPf?58j5Sv0'); define('NONCE_SALT', 'Dlo,7F[:EaWQT57-P0Q+x</nUf4UD&LH=-0wS6l._2Fx!-jR0KBJ-U_1*{sXo?>Q');

编辑 现在实现一种随机生成 64 个字符盐的方法,如下所示:

RSTR=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-64} | head -n 1);
SALTS="define('AUTH_KEY', '$RSTR');
define('SECURE_AUTH_KEY', '$RSTR');
define('LOGGED_IN_KEY', '$RSTR');
define('NONCE_KEY', '$RSTR');
define('AUTH_SALT', '$RSTR');
define('SECURE_AUTH_SALT', '$RSTR');
define('LOGGED_IN_SALT', '$RSTR');
define('NONCE_SALT', '$RSTR');";
sed -i "s/##WP_SALTS##/$SALTS/g" $WPCONFIG

我已经用 +、~、/、&、* 替换了分隔符,它们仍然会产生同样的错误。

【问题讨论】:

  • $SALTS 中的值是多少?提供样本值

标签: php wordpress bash curl sed


【解决方案1】:

如果 SALTS 可能包含任何字符,则可以使用 perl 来完成。

通过环境:

SALTS="$SALTS" perl -i.bak -pe 's/##WP_SALTS##/$ENV{SALTS}/g' "$WPCONFIG"

通过参数传递:

perl -i.bak -pe 'BEGIN{$salts=shift}s/##WP_SALTS##/$salts/g' "$SALTS" "$WPCONFIG"

【讨论】:

  • SALT 变量设置后也可以直接导出。
  • 确实,第一个也可以是export SALTS; perl -i.bak -pe ...
  • 之所以有效,是因为 $salt 是一个 perl 变量,并且被解释器替换,而在 bash + sed 中,被替换为 bash 并且 sed 无法正确解释,例如变量中的分隔符或换行符
【解决方案2】:

$SALTS 可能包含用作分隔符的字符(+/)。如果您的文件不包含~,您可以尝试:

sed -i "s~##WP_SALTS##~$SALTS~g" $WPCONFIG

但是您可以使用任何可打印的字符作为分隔符。

使用 GNU sed,您还可以选择不可打印的(参见 "sed rare-delimiter (other than & | / ?…)"

【讨论】:

  • 它肯定可能包含奇怪的字符......事实上......我认为〜是一个...... uggg。 sed 会接受任何字符作为分隔符吗?
  • 任何可打印的(和 GNU sed 不可打印的)字符。查看我的编辑。
  • 我最终可能会生成自己的,而不是依赖 wp api。
  • 注意:我也尝试了您链接到的问题中的解决方案......同样的错误
  • 对于这种情况,Perl 似乎是更好的选择。
【解决方案3】:

当您需要文字字符串时,不要使用 sed,因为它只理解正则表达式和带有反向引用的替换字符串,并且具有分隔符约束。只需使用带有字符串函数的工具,如 awk:

SALTS="$SALTS" awk -i inplace '
BEGIN { old="##WP_SALTS##""; lgth=length(old); new=ENVIRON["SALTS"] }
s=index($0,old) { $0=substr($0,1,s-1) new substr($0,s+lgth) }
{ print }
' "$WPCONFIG"

上面使用 GNU awk 使用 -i inplace 进行就地编辑,就像您的 GNU sed 使用 -i 一样。

顺便说一句,不要将所有大写的变量名用于非导出变量 - 这是按照惯例,以避免与导出变量和内置变量发生冲突。

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 2017-09-25
    • 2023-02-15
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多