Sed更换令牌的问题

时间:2017-09-15 12:05:11

标签: php wordpress bash curl sed

我有一些bash用于"安装"服务器上的wordpress网站。

在其中,我通过SALTS=$(curl -L https://api.wordpress.org/secret-key/1.1/salt/);

进行卷曲请求以获取随机化的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

我用+,〜,/,&amp;,*替换了分隔符,但它们仍然会产生同样的错误。

3 个答案:

答案 0 :(得分:2)

如果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"

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

当你需要一个文字字符串时,不要使用sed,因为它只能理解带有反向引用的regexp和替换字符串,并且具有分隔符约束。只需使用带有字符串函数的工具,如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一样。

不要将所有大写变量名称用于非导出变量btw - 按惯例,以避免与导出和内置变量发生冲突。