Поиск и замена переменных специальными символами в нескольких файлах с помощью команды perl в bash-скрипте - PullRequest
0 голосов
/ 06 ноября 2018

Попытка поиска и замены переменных пароля специальными символами в нескольких файлах с помощью команды perl в скрипте bash. Пока у меня есть:

grep -rlF "${old_pass}" | xargs perl -p -e "s~\Q$old_pass~\E$new_pass~g"

и это работает в большинстве случаев, однако иногда это не удается. Например, с учетом old_pass=*DGB9Twq7WTwz@wR и new_pass=tDx6U&ShRv}E3Mdb приведенная выше команда приводит к tDx6U&ShRv}E3Mdb@wR вместо tDx6U&ShRv}E3Mdb.

Обратите внимание, что пароли создаются автоматически и могут состоять из прописных и строчных букв, цифр и всех специальных символов. Таким образом, рабочая версия должна быть в состоянии учитывать (избегать) все возможные версии паролей.

1 Ответ

0 голосов
/ 06 ноября 2018

Вы попытались и не смогли сгенерировать правильный код Perl. Но настоящая проблема в том, что вы пытались сгенерировать Perl-код из оболочки в первую очередь. Существует три основных способа передачи информации в Perl без использования STDIN или внешнего хранилища.

  • Аргументы

    perl -pe'BEGIN { ($o,$n)=splice(@ARGV,0,2) } s/\Q$o/$n/g' -- "$old_pass" "$new_pass"
    
  • Параметры командной строки

    В полной программе вы бы использовали Getopt :: Long , но perl -s здесь подойдет.

    perl -spe's/\Q$o/$n/g' -- -o="$old_pass" -n="$new_pass" --
    
  • Переменные среды

    O="$old_pass" N="$new_pass" perl -pe's/\Q$ENV{O}/$ENV{N}/g' --
    

    (В вашем случае вам придется установить переменные env для xargs вместо perl.)


Кстати, вы должны еще больше ограничить соответствие вашего шаблона регулярных выражений. В таком виде у вас могут быть ложные срабатывания. (Совпадение с неверным паролем пользователя. Совпадение части пароля. Совпадение с чем-то, что вообще не является паролем.)

...