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}\$")'

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

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

$(...)コマンド置換を使用するのが最善です。

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

おすすめ記事