Использование переменных bash в команде perl в сценарии bash

Я пытаюсь создать хешированный пароль, как в /etc/shadow , используя скрипт bash. Пользователю будет предложено PSWD пароль, который сохраняется в переменной PSWD . Я извлек значение Hash и salt из файла /etc/shadow и сохранил их в переменных SVAL и SVAL соответственно.

Теперь, чтобы создать хешированный пароль с использованием пароля и значения Соли, мне нужно использовать команду, приведенную ниже ( Ссылка ):

$ perl -e 'print crypt("password","\$6\$salt\$") . "\n"'

В приведенной выше команде я должен заменить «пароль» переменной $PSWD «6» с помощью $HVAL и «salt» с переменной $SVAL .

Я попытался экспортировать вышепеременные переменные и заменить их в команде perl, как показано ниже, но это было полностью испорчено.

perl -e 'print crypt("$ENV{"PSWD"}","\$$ENV{"HVAL"}\$$ENV{"SVAL"}\$") . "\n"'

Какие будут поправки?

Проблема заключается в ваших двойных кавычках. Здесь вам не нужно указывать эти хэш-ключи, поскольку они являются простыми идентификаторами . От perldoc perldata :

Фактически, простой идентификатор внутри таких завитушек вынужден быть строкой, а также внутри хэш-индекса. Не нужно указывать. Наш предыдущий пример: $days{'Feb'} можно записать как $days{Feb} и кавычки будут считаться автоматически. Но что-то более сложное в индексе будет интерпретироваться как выражение. Это означает, например, что $version{2.0}++ эквивалентно $version{2}++ , а не $version{'2.0'}++ .

Так:

 perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")' 

Если вы используете его внутри backticks, вам нужно удвоить обратную косую черту, как в:

 var=`perl -le 'print crypt($ENV{PSWD},"\\$$ENV{HVAL}\\$$ENV{SVAL}\$")'` 

Лучше всего использовать вместо $(...) форму замены команд:

 var=$(perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")') 

Последовательность для правильной цитаты начинается с исходной команды:

 perl -e 'print crypt("password","\$6\$salt\$") . "\n"' 

Давайте добавим некоторое пространство:

 perl -e 'print crypt(" password ","\$ 6 \$ salt \$") . "\n"' 

Давайте изменим vars на их эквиваленты:

 perl -e 'print crypt(" $ENV{PSWD} ","\$ $ENV{HVAL} \$ $ENV{SVAL} \$") . "\n"' 

Эквиваленты не должны указываться, как в случае кавычек, которые они терпят неудачу:

 perl -e 'print "$ENV{PSWD}" . "\n"' # correct. perl -e 'print "$ENV{"PSWD"}" . "\n"' # fail. 

И, наконец, давайте удалим введенные выше пространства:

 perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"' 

то команда может быть назначена переменной.

 var="$( perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"' )" 

С экспортируемыми значениями: PSWD=password , HVAL=6 , SVAL=saltsalt Я получаю:

$ 6 $ saltsalt $ qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2 / jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh /