Salut les praires (ça change des moules et c'est bon aussi le mardi :))
Ce message s’adresse à ceux d'entre vous qui cumulent les tares, c'est à dire qui seraient sysadmin d'une entreprise utilisant des postes clients sous linux, ces postes eux-mêmes reliés à un (des) contrôleur(s) de domaine (samba 4 bien sûr!).
Sûrement vous êtes-vous déjà demandés comment fournir à vos utilisateurs linuxiens la possibilité de changer leur mot de passe du domaine depuis leur poste ?
Ma réponse jusque là était "Ouvre un terminal, et tape "kpasswd", c'est très simple". Réponse de geek qui ne faisait pas écho à l'oreille de nos chers utilisateurs aux yeux de veau.
Donc pour ceux que ça intéresse voici un petit script bash utilisant "zenity" pour l'interface et "expect" pour communiquer avec kpasswd, afin que nos clico-maniaques puissent satisfaire leur besoin urgent de changer de mot de passe.
Bon môrdi !
Note : testé sous debian.
Note2 : n'hésitez pas si il y a des coquilles, c'est possible, voir c'est humain.
#!/bin/bash
# PARAMS
# Kerberos Domaine Name (DOMAIN.TLD)
DOMAIN_NAME='DOMAIN.TLD'
# CONST
USERNAME=$(whoami)
PRINCIPAL=${USERNAME}@${DOMAIN_NAME}
exit_code=0
kpasswd_path=$(which kpasswd)
zenity_path=$(which zenity)
expect_path=$(which expect)
# Phrases
# Dependancies - The package "expect is missing on your system
missing_expect="Il vous manque le paquet \"expect\" pour utiliser cet outil. Merci de prévenir le S.I."
# Title of the zenity window "Change your password on $DOMAIN_NAME"
form_title="Changez votre mot de passe pour $DOMAIN_NAME :"
# Actuel password
form_pwd_now="Mot de passe actuel : "
# New password
form_pwd_next="Nouveau mot de passe : "
# Repeat your new password
form_pwd_repeat="Répétez votre nouveau mot de passe : "
# Small message (like "4 char min") displayed to user
form_msg='/!\\ 4 caractères minimum !'
# Please fill all the required fields
msg_lack_info='Veuillez remplir tous les champs.'
# Your new passwords do not match
msg_mismatch='Vos mot de passe ne correspondent pas.'
# Your old password does no match
msg_bad_old_pwd="L\'ancien mot de passe n\'est pas le bon."
# Your password do not respect required complexity of your domain
msg_bad_complexity="Votre mot de passe n\'est pas assez sur. Choisissez-en un autre."
# Unhandled Error
msg_unknown_error="Erreur non prise en charge. Merci de contacter votre S.I."
# Password changed.
msg_ok="Mot de passe changé."
# Check if expect is installed
which expect
if [ "$?" = 1 ] ; then
$zenity_path --error --text "$missing_expect"
exit 99
fi
# Zenity form
FORM=$($zenity_path --forms --title="$form_title" \
--separator="," \
--add-password="$form_pwd_now" \
--add-password="$form_pwd_next" \
--add-password="$form_pwd_repeat" \
--text="$form_msg")
# Keep return code in a var
form_exit=$?
# Split zenity form in a array
IFS=',' read -ra ARGS <<< "$FORM"
# If escape or cancel
if [ "$form_exit" != "0" ] ; then
exit 1
# Empty box
elif [[ "${ARGS[0]}" = "" || "${ARGS[1]}" = "" || "{ARGS[2]}" = "" ]] ; then
msg=$msg_lack_info
exit_code=2
# New passwd do not match (verified twice)
elif [ "${ARGS[1]}" != "${ARGS[2]}" ] ; then
msg=$msg_mismatch
exit_code=3
fi
#######
# Run kpasswd command if no errors so far
#######
if [ "$exit_code" = "0" ] ; then
# Run expect (useful tool for interactive tools like kpassword)
$expect_path -c "
proc do_exit {code} {
exit \$code
}
set timeout 2
spawn $kpasswd_path
expect {
\"Password for $PRINCIPAL:\" { send ${ARGS[0]}\r }
default { exit 100 }
}
expect {
\"Enter new password:\" { send ${ARGS[1]}\r }
\"Preauthentication failed getting initial ticket\" { do_exit 11 }
default { exit 100 }
}
expect {
\"Enter it again:\" { send ${ARGS[2]}\r }
default { exit 100 }
}
expect {
\"Password changed.\" { do_exit 0 }
\"Try a more complex password\" { do_exit 12 }
\"Password mismatch while reading password\" { do_exit 13 }
default { exit 100 }
}
"
# Keep in a var return code
return_code=$?
fi
# Bad old passwd
if [ "$return_code" = "11" ] ; then
msg=$msg_bad_old_pwd
exit_code=11
fi
# Password complexity not respected
if [ "$return_code" = "12" ] ; then
msg=$msg_bad_complexity
exit_code=12
fi
# Security not respected
if [ "$return_code" = "13" ] ; then
msg=$msg_mismatch
exit_code=13
fi
# Unknown error
if [ "$return_code" = "100" ] ; then
msg=$msg_unknown_error
exit_code=100
fi
# OK
if [ "$return_code" = "0" ] ; then
msg=$msg_ok
exit_code=0
fi
# Return values
$zenity_path --info --text "$msg"
exit $exit_code
# Webmin
Posté par ptit_poulet . Évalué à 3.
Salut,
Moi personnellement, je me suis pas embêté, j'ai mis en place Webmin. J'ai juste activé le plugin de gestion de password pour les utilisateurs. Ainsi ils peuvent modifier leur mot de passe (et juste le leur) via la page webmin.
[^] # Re: Webmin
Posté par labiloute . Évalué à 1.
Bon à savoir ça ptit poulet.
L'avantage de ma méthode c'est que l'utilisateur a une belle icône sur le bureau, et qu'il n'y a pas de serveur web ni de package webmin a installer sur le serveur Samba4…
# Gnu/Linux pas prêt pour le desktop ?
Posté par tontonrico . Évalué à 0.
Salut, c'est une vraie question :
vous voulez dire qu'il n'y a pas de mécanisme qui permette à un utilisateur de changer son mot de passe "simplement" comme avec Windose ? Même avec un serveur LDAP derrière ?
[^] # Re: Gnu/Linux pas prêt pour le desktop ?
Posté par totof2000 . Évalué à 2.
C pas Linux qui n'est pas prêt pour le desktop mais ldap.
[^] # Re: Gnu/Linux pas prêt pour le desktop ?
Posté par labiloute . Évalué à 2.
En fait, dans notre cas, ce n'est pas un LDAP mais un serveur Kerberos qui reçoit la demande de modification de mot de passe.
Et effectivement, c'est bien triste, mais je ne connaît aucun outil graphique pour le faire.
En même temps l'utilisation d'une infra client/serveur kerberos pour l'authentification n'était pas aussi rependue que ça avant l'arrivée de Samba4…
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.