URL: https://linuxfr.org/forums/astucesdivers/posts/petite-interface-zenity-pour-kpasswd Title: Petite interface zenity pour kpasswd Authors: labiloute Date: 2015年07月21日T10:21:45+02:00 License: CC By-SA Tags: zenity, kpasswd, domaine, samba4, mot_de_passe et active_directory Score: 3 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. ```bash #!/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 ```