ユーザーのパスワードを確認する完全に移植可能な方法はありません。これには特権実行可能ファイルが必要なため、最初から作成できるものではありません。ほとんどの非組み込み Linux システム、多くの組み込みシステム、および他のほとんどの Unix バリアントで使用される PAM には、setuid バイナリが付属していますが、直接のシェル インターフェイスはありません。PAM スタックを経由する必要があります。 /P>
Perl、Python、または Ruby で PAM バインディングを使用できます。
いくつかの checkpassword
のいずれかをインストールできます
ユーザーが何に対しても sudo を実行できる場合、 sudo -kv
認証を求めるプロンプトが表示されます (これが sudo 構成で無効にされていない限り)。しかし、ユーザーに関する sudoers ルールがない場合、これは機能しません。
su
を実行できます .これは、ほとんどの実装で機能します。あなたのケースでは、これがおそらく最善の策です。
if su -c true "$USER"; then
echo "Correct password"
fi
指定された ローカル を検証できます シャドウ ファイルを使用して、指定されたユーザー名のパスワードは正しいです。
最近のほとんどのディストリビューションでは、ハッシュ化されたパスワードはシャドウ ファイル /etc/shadow (ルートのみが読み取り可能) に保存されます。 root として、指定されたユーザーのシャドウ ファイルから次のように行を引き出します。
cat /etc/shadow | grep username
次のように表示されます:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
ユーザー名の後に $1 があります。これは、MD5 ハッシュであることを示します。その後、別の $ があり、(この場合) TrOIigLp の後に別の $ が続きます。 TrOIigLpは塩である。その後は、salt を使用してハッシュ化されたハッシュ化されたパスワードです。この場合は 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 が必要です。