Il n'existe aucun moyen entièrement portable de vérifier le mot de passe de l'utilisateur. Cela nécessite un exécutable privilégié, donc ce n'est pas quelque chose que vous pouvez créer à partir de zéro. PAM, qui est utilisé sur la plupart des systèmes Linux non embarqués ainsi que sur de nombreux systèmes embarqués et la plupart des autres variantes Unix, est livré avec un binaire setuid mais il n'a pas d'interface shell directe, vous devez passer par la pile PAM. /P>
Vous pouvez utiliser une liaison PAM en Perl, Python ou Ruby.
Vous pouvez installer l'un des nombreux checkpassword
implémentations.
Si l'utilisateur est autorisé à exécuter sudo pour quoi que ce soit, alors sudo -kv
demandera l'authentification (sauf si cela a été désactivé dans la configuration sudo). Mais cela ne fonctionne pas s'il n'y a pas de règle sudoers concernant l'utilisateur.
Vous pouvez exécuter su
. Cela fonctionne sur la plupart des implémentations. C'est probablement le meilleur pari dans votre cas.
if su -c true "$USER"; then
echo "Correct password"
fi
Vous pouvez valider qu'un local donné le mot de passe est correct pour un nom d'utilisateur donné en utilisant le fichier shadow.
Sur la plupart des distributions modernes, les mots de passe hachés sont stockés dans le fichier shadow /etc/shadow (qui n'est lisible que par root). En tant que root, tirez la ligne du fichier shadow pour l'utilisateur donné comme ceci :
cat /etc/shadow | grep username
Vous verrez quelque chose comme ceci :
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
Après le nom d'utilisateur, il y a $1. Cela indique qu'il s'agit d'un hachage MD5. Après cela, il y a un autre $, puis (dans ce cas) TrOIigLp suivi d'un autre $. TroIigLp est le sel. Vient ensuite le mot de passe haché, qui a été haché à l'aide du sel - dans ce cas PUHL00kS5UY3CMVaiC0/g0.
Maintenant, vous pouvez utiliser openssl pour hacher le mot de passe donné en utilisant le même salt, comme ceci :
openssl passwd -1 -salt TrOIigLp
Entrez le mot de passe donné lorsque vous y êtes invité, la commande openssl doit calculer le hachage MD5 à l'aide du sel fourni, et il doit être exactement le même que celui ci-dessus à partir du fichier shadow. Le -1
dans la commande ci-dessus est pour le hachage MD5.
Voici une solution relativement robuste qui fonctionne avec les utilisateurs locaux et distants et tente de s'authentifier auprès de la pile PAM complète en tant qu'utilisateur en question, plutôt que de simplement comparer les hachages de mots de passe.
#!/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
Pour l'exécuter :enregistrez-le sous ./authenticate_as.rb
, chmod +x ./authenticate_as.rb
, et ./authenticate_as.rb $username $password
. Nécessite Ruby et la gemme rpam, au cas où ce ne serait pas évident.