Es gibt keine vollständig portable Möglichkeit, das Passwort des Benutzers zu überprüfen. Dies erfordert eine privilegierte ausführbare Datei, sodass Sie dies nicht von Grund auf neu erstellen können. PAM, das auf den meisten nicht eingebetteten Linux-Systemen sowie vielen eingebetteten Systemen und den meisten anderen Unix-Varianten verwendet wird, enthält eine setuid-Binärdatei, aber es hat keine direkte Shell-Schnittstelle, Sie müssen über den PAM-Stack gehen.
Sie können eine PAM-Bindung in Perl, Python oder Ruby verwenden.
Sie können einen von mehreren checkpassword
installieren Implementierungen.
Wenn der Benutzer sudo für irgendetwas ausführen darf, dann sudo -kv
fordert zur Authentifizierung auf (es sei denn, dies wurde in der sudo-Konfiguration deaktiviert). Aber das funktioniert nicht, wenn es keine sudoers-Regel bezüglich des Benutzers gibt.
Sie können su
ausführen . Dies funktioniert bei den meisten Implementierungen. Dies ist wahrscheinlich die beste Wahl in Ihrem Fall.
if su -c true "$USER"; then
echo "Correct password"
fi
Sie können dies mit einem bestimmten local validieren das Passwort für einen bestimmten Benutzernamen korrekt ist, der die Shadow-Datei verwendet.
Bei den meisten modernen Distributionen werden die gehashten Passwörter in der Shadow-Datei /etc/shadow gespeichert (die nur von root gelesen werden kann). Ziehen Sie als root die Zeile aus der Schattendatei für den angegebenen Benutzer wie folgt:
cat /etc/shadow | grep username
Sie werden so etwas sehen:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
Hinter dem Benutzernamen steht $1. Dies zeigt an, dass es sich um einen MD5-Hash handelt. Danach kommt ein weiteres $, dann (in diesem Fall) TrOIigLp gefolgt von einem weiteren $. TrOIigLp ist das Salz. Danach kommt das gehashte Passwort, das mit dem Salt gehasht wurde – in diesem Fall PUHL00kS5UY3CMVaiC0/g0.
Jetzt können Sie openssl verwenden, um das angegebene Passwort mit demselben Salt zu hashen, etwa so:
openssl passwd -1 -salt TrOIigLp
Geben Sie das angegebene Passwort ein, wenn Sie dazu aufgefordert werden, der openssl-Befehl sollte den MD5-Hash mit dem bereitgestellten Salt berechnen und es sollte genau das gleiche sein wie oben aus der Shadow-Datei. Die -1
im obigen Befehl ist für MD5-Hashing.
Hier ist eine relativ robuste Lösung, die sowohl mit lokalen als auch mit entfernten Benutzern funktioniert und versucht, sich gegen den gesamten PAM-Stack als der betreffende Benutzer zu authentifizieren, anstatt einfach Passwort-Hashes zu vergleichen.
#!/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
Um es auszuführen:Speichern Sie es als ./authenticate_as.rb
, chmod +x ./authenticate_as.rb
, und ./authenticate_as.rb $username $password
. Benötigt Ruby und das RPAM-Gem, falls das nicht offensichtlich war.