No existe una forma totalmente portátil de verificar la contraseña del usuario. Esto requiere un ejecutable privilegiado, por lo que no es algo que pueda crear desde cero. PAM, que se usa en la mayoría de los sistemas Linux no integrados, así como en muchos sistemas integrados y la mayoría de las otras variantes de Unix, viene con un binario setuid pero no tiene una interfaz de shell directa, debe pasar por la pila PAM.
Puede usar un enlace PAM en Perl, Python o Ruby.
Puede instalar uno de varios checkpassword
implementaciones.
Si el usuario puede ejecutar sudo para cualquier cosa, entonces sudo -kv
solicitará la autenticación (a menos que se haya desactivado en la configuración de sudo). Pero eso no funciona si no hay una regla sudoers con respecto al usuario.
Puedes ejecutar su
. Esto funciona en la mayoría de las implementaciones. Esta es probablemente la mejor apuesta en su caso.
if su -c true "$USER"; then
echo "Correct password"
fi
Puede validar que un determinado local la contraseña es correcta para un nombre de usuario dado usando el archivo shadow.
En la mayoría de las distribuciones modernas, las contraseñas codificadas se almacenan en el archivo shadow /etc/shadow (que solo puede leer root). Como root, extraiga la línea del archivo shadow para el usuario dado de la siguiente manera:
cat /etc/shadow | grep username
Verás algo como esto:
username:$1$TrOIigLp$PUHL00kS5UY3CMVaiC0/g0:15020:0:99999:7:::
Después del nombre de usuario hay $1. Esto indica que es un hash MD5. Después hay otro $, luego (en este caso) TrOIigLp seguido de otro $. TrOIigLp es la sal. Después de eso, está la contraseña codificada, que fue codificada usando la sal, en este caso PUHL00kS5UY3CMVaiC0/g0.
Ahora, puede usar openssl para codificar la contraseña dada usando la misma sal, así:
openssl passwd -1 -salt TrOIigLp
Ingrese la contraseña dada cuando se le solicite, el comando openssl debe calcular el hash MD5 usando la sal provista, y debe ser exactamente igual que el anterior del archivo shadow. El -1
en el comando anterior es para hashing MD5.
Esta es una solución relativamente robusta que funciona tanto con usuarios locales como remotos e intenta autenticarse contra la pila PAM completa como el usuario en cuestión, en lugar de simplemente comparar hashes de contraseña.
#!/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
Para ejecutarlo:guárdelo como ./authenticate_as.rb
, chmod +x ./authenticate_as.rb
y ./authenticate_as.rb $username $password
. Requiere Ruby y la gema rpam, en caso de que no fuera obvio.