Bash 스크립트의 Perl 명령에서 Bash 변수 사용

Bash 스크립트의 Perl 명령에서 Bash 변수 사용

/etc/shadowbash 스크립트를 사용하여 파일에 해시된 비밀번호를 생성하려고 합니다. 사용자에게 변수에 저장된 비밀번호를 묻는 메시지가 표시됩니다 PSWD. 파일에서 해시값과 솔트값을 추출하여 각각 변수 와 /etc/shadow에 저장했습니다 .HVALSVAL

이제 비밀번호와 솔트를 사용하여 해시된 비밀번호를 생성하려면 아래 명령을 사용해야 합니다(인용하다):

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

$PSWD위 명령에서 "password"를 변수로 , "6"을 변수로, $HVAL"salt"를 변수로 바꿔야 합니다 $SVAL.

위의 변수를 내보내고 아래와 같이 perl 명령에서 바꾸려고 시도했지만 완전히 엉망이 되었습니다.

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

어떤 수정이 이루어지나요?

답변1

문제는 큰따옴표에 있습니다. 여기서는 이러한 해시 키를 있는 그대로 참조할 필요가 없습니다.단순 식별자. 에서 perldoc perldata:

실제로 중괄호 안의 간단한 식별자는 해시 첨자와 마찬가지로 문자열로 강제 변환됩니다. 인용은 필요하지 않습니다. 이전 예를 다음 $days{'Feb'}과 같이 작성할 수 $days{Feb}있으며 따옴표가 자동으로 가정됩니다. 그러나 아래 첨자에서 더 복잡한 내용은 표현식으로 해석됩니다. 예를 들어, 이는 가 아니라 $version{2.0}++와 동등함을 의미합니다 .$version{2}++$version{'2.0'}++

그래서:

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

백틱 안에 사용하는 경우 다음과 같이 백슬래시를 두 배로 늘려야 합니다.

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

$(...)명령 대체를 사용하는 것이 가장 좋습니다 .

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

답변2

올바른 견적을 얻는 순서는 원래 명령으로 시작됩니다.

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

공간을 추가해 보겠습니다.

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

변수를 해당 변수로 변경해 보겠습니다.

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=6SVAL=saltsalt

$6$옌얀$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

관련 정보