web-dev-qa-db-ja.com

bashスクリプトのPerlコマンドでbash変数を使用する

Bashスクリプトを使用して、_/etc/shadow_ファイルのようにハッシュ化されたパスワードを生成しようとしています。ユーザーは、変数PSWDに保存されているパスワードの入力を求められます。 _/etc/shadow_ファイルからハッシュとソルトの値を抽出し、変数HVALおよびSVALにそれぞれ保存しました。

ここで、PasswordとSalt値を使用してハッシュされたパスワードを生成するには、以下のコマンドを使用する必要があります( 参照 ):

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

上記のコマンドでは、「password」を_$PSWD_変数に、「6」を_$HVAL_に、「salt」を_$SVAL_変数に置き換える必要があります。

以下に示すように、上記の変数をエクスポートしてPerlコマンドで置き換えようとしましたが、完全に混乱していました。

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

修正はどうなりますか?

3
Mandar Shinde

問題はあなたの二重引用符にあります。ここでは、これらのハッシュキーをそのまま引用する必要はありません単純な識別子。 _perldoc perldata_から:

実際、このようなカーリー内の単純な識別子は、文字列である必要があり、同様にハッシュ添え字内でも同様です。どちらも引用する必要はありません。前の例である_$days{'Feb'}_は_$days{Feb}_と書くことができ、引用符は自動的に想定されます。ただし、添え字がより複雑なものはすべて式として解釈されます。これは、たとえば、_$version{2.0}++_は_$version{2}++_ではなく_$version{'2.0'}++_と同等であることを意味します。

そう:

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

バックティック内で使用する場合は、次のようにバックスラッシュを2倍にする必要があります。

_var=`Perl -le 'print crypt($ENV{PSWD},"\\$$ENV{HVAL}\\$$ENV{SVAL}\$")'`
_

代わりに、代わりに$(...)形式のコマンド置換を使用することをお勧めします。

_var=$(Perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")')
_
6

正しい見積もりを取得するためのシーケンスは、元のコマンドから始まります。

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=passwordHVAL=6SVAL=saltsalt取得:

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

0
user79743