ユーザーのパスワードを要求するスクリプトがあり、指定したパスワードが間違っているかどうかを確認したいと思います。
#A little fragment of my script
read -sp 'Your password: ' password;
if [[ $password -ne WHAT GOES HERE? ]]; then
MORE CODE HERE
else
MORE CODE HERE
fi
ユーザーのパスワードをチェックする完全にポータブルな方法はありません。これには特権のある実行可能ファイルが必要なので、最初から作成することはできません。 [〜#〜] pam [〜#〜] は、ほとんどの非組み込みLinuxシステム、多くの組み込みシステム、およびその他のほとんどのUnixバリアントで使用されており、setuidバイナリが付属していますが、直接シェルインターフェイスがある場合は、PAMスタックを経由する必要があります。
Perl、Pythonまたは Ruby でPAMバインディングを使用できます。
いくつかの checkpassword
実装の1つをインストールできます。
ユーザーがSudoの実行を許可されている場合は、Sudo -kv
は認証を要求します(Sudo構成でこれが無効になっていない場合)。しかし、ユーザーに関するsudoersルールがない場合は機能しません。
su
を実行できます。これはほとんどの実装で機能します。これはおそらくあなたの場合に最善の策です。
if su -c true "$USER"; then
echo "Correct password"
fi
シャドウファイルを使用して、特定のlocalパスワードが特定のユーザー名に対して正しいことを検証できます。
最近のほとんどのディストリビューションでは、ハッシュ化されたパスワードはシャドウファイル/ etc/shadow(rootのみが読み取り可能)に保存されています。 rootとして、次のように指定されたユーザーのシャドウファイルから行をプルします。
cat /etc/shadow | grep username
次のようなものが表示されます。
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
ユーザー名の後に$ 1があります。これは、MD5ハッシュであることを示しています。その後、別の$があり、次に(この場合)TrOIigLpの後に別の$が続きます。 TrOIigLpは塩です。その後は、ソルトを使用してハッシュされたハッシュパスワードです。この場合はPUHL00kS5UY3CMVaiC0/g0です。
これで、opensslを使用して、次のように同じソルトを使用して特定のパスワードをハッシュできます。
openssl passwd -1 -salt TrOIigLp
プロンプトが表示されたら、所定のパスワードを入力します。opensslコマンドは、提供されたソルトを使用してMD5ハッシュを計算し、シャドウファイルからの上記とまったく同じである必要があります。上記のコマンドの-1
は、MD5ハッシュ用です。
これは、ローカルユーザーとリモートユーザーの両方で機能し、単純にパスワードハッシュを比較するのではなく、問題のユーザーとして完全なPAMスタックに対して認証を試みる比較的堅牢なソリューションです。
#!/usr/bin/env Ruby
require 'rpam'
username = ARGV[0]
password = ARGV[1]
if Rpam.auth(username, password, service: 'system-auth')
puts 'authentication successful'
exit 0
else
puts 'authentication failure'
exit 1
end
実行するには:./authenticate_as.rb
、chmod +x ./authenticate_as.rb
、./authenticate_as.rb $username $password
として保存します。 Rubyとrpam gemが必要です。