Я нашел много близких вопросов, но не совсем подходящих для моего варианта использования, поэтому пришлось открыть новый.
Предположим, система имеет пароль, состоящий из строчных и прописных букв, цифр и специальных символов (az, AZ, 0-9, #) в нескольких файлах конфигурации (один и тот же пароль используется веб-приложением на главной домен, его субдомены и все соответствующие базы данных). Пример такого файла с паролем:
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'database_name',
'username' => 'datbase_user',
'password' => 'yv[48k2)KMGx{g1b',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'collation' => 'utf8mb4_general_ci',
'charset' => 'utf8mb4',
'prefix' => '',
),
),
);
Я пытаюсь написать bash-код, который принимает автоматически сгенерированный новый пароль (с тем же алгоритмом - все строчные и прописные буквы, цифры и специальные символы), находит все вхождения старого пароля в домашнем каталоге соответствующего родителя. домен и его поддоменов и заменяет новым паролем. Следующая однострочная работает нормально:
grep -rlF "$old_pass" /path/to/directory | xargs sed -i "s/$old_pass/$new_pass/g"
для паролей, состоящих только из букв и цифр (например, qVYYgB5bRxUYpHg
). Однако, хотя часть grep
работает нормально, часть sed
дает сбой, как только система добавляет специальные символы в сгенерированный пароль (например, aN#zDU>lve15Uwqn
), давая:
sed -i "s/$old_pass/$new_pass/g" password.php
sed: -e expression #1, char 37: unterminated `s' command
Каков наилучший способ заменить все вхождения существующего пароля, который состоит из всех букв, цифр и специальных символов, хранящихся в разных переменных в нескольких файлах?