J'ai un peu de bash que j'utilise pour "installer" un site wordpress sur un serveur.

Dans celui-ci, je fais une requête curl pour obtenir les SALT aléatoires via SALTS=$(curl -L https://api.wordpress.org/secret-key/1.1/salt/);

Et j'ai mis un "jeton" dans mon fichier wp-config.php ##WP_SALTS##

Il semble que ma déclaration sed ne soit pas correcte, car elle ne cesse de me renvoyer une erreur:

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

J'ai essayé:

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

Ainsi que:

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

L'erreur est toujours présente. Qu'est-ce que je fais mal?

Les réponses de la requête curl sont aléatoires à chaque fois, mais sont similaires à:

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');

MODIFIER Implémentation maintenant d'un moyen de générer aléatoirement les 64 sels de caractères avec ce qui suit:

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

J'ai remplacé le délimiteur par +, ~, /, &, * et ils génèrent tous toujours la même erreur.

0
Kevin 15 sept. 2017 à 15:05

2 réponses

Meilleure réponse

Si SALTS peut contenir n'importe quel caractère, cela peut être fait avec perl.

Passage par environnement:

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

Passage d'arguments:

perl -i.bak -pe 'BEGIN{$salts=shift}s/##WP_SALTS##/$salts/g' "$SALTS" "$WPCONFIG"
2
Nahuel Fouilleul 15 sept. 2017 à 12:30

Lorsque vous avez besoin d'une chaîne littérale, n'utilisez pas sed car il ne comprend que les expressions rationnelles et les chaînes de remplacement avec des références arrière et a des contraintes de délimitation. Utilisez simplement un outil avec des fonctions de chaîne comme 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"

Ce qui précède utilise GNU awk pour l'édition inplace avec -i inplace, tout comme votre sed GNU le faisait avec -i.

N'utilisez pas tous les noms de variables en majuscules pour les variables non exportées btw - c'est par convention et pour éviter les conflits avec les variables exportées et intégrées.

0
Ed Morton 15 sept. 2017 à 15:57