Ce script demanderait des améliorations (notamment le contrôle de la validité de l'adresse entrée), mais il suffit à mes besoins et j'ai eu la flemme de finir “proprement”.
#!/bin/bash # script pour ajouter/modifier/supprimer un couple user/pass de dovecot USERSDOVCONF=/etc/postfix/dovecot/users.conf DOVPW=/usr/sbin/dovecotpw function usage() { echo "usage: $(basename $0) [-r] -u user@domaine.tld" echo "Cela va ajouter ou modifier le mot de passe de user@domaine.tld dans $USERSDOVCONF." echo "Pour supprimer un compte, utiliser -r." exit 1 } function remove() { # cette fonction ne doit rien retourner ! # il faut en sortir avec exit # sinon (retour != 0) chgpass sera appele par main (OK pas très clean ;-) nb=`grep -c "^$1:" $USERSDOVCONF` if [ $nb -lt 1 ] then echo "$1 n'existe pas dans $USERSDOVCONF" exit 1 else if [ $nb -gt 1 ] then echo "Il y avait $nb $1 dans $USERSDOVCONF ! On les supprime tous." fi sed -i -e "/^${1}:/d" $USERSDOVCONF nb=`grep -c "^$1:" $USERSDOVCONF` if [ $nb -ne 0 ] then echo "La suppression a échoué, il reste $nb entrée(s) de $1 dans $USERSDOVCONF" exit 1 else echo "$1 supprimé de $USERSDOVCONF" exit 0 fi fi } function askpass() { echo "Entrez le nouveau mot de passe :" read rep echo "Confirmez ce nouveau mot de passe :" read rep2 if [ "$rep" != "$rep2" ] then echo "Les mots de passe sont différents !" exit 1 fi chgpass $1 $rep # $1 pas testé } function chgpass() { # pas de test si $1 et $2 OK # il faudrait tester que $1 est une adresse valide # et que le domaine est dans les virtual_domains de postfix if [ -x /usr/sbin/dovecotpw ] then # si le compte existe, on substitue plutôt que effacer/ajouter (au cas où ajout plante, et ça conserve l'ordre) nb=`grep -c "^$1:" $USERSDOVCONF` if [ $nb -eq 1 ] then sed -i -e "s/^${1}:.*/$1:`dovecotpw -p $2`/" $USERSDOVCONF [ $? -ne 0 ] && echo "Le changement de mot de passe a échoué" && exit 1 else if [ $nb -gt 1 ] then echo "Il y avait $nb entrées pour $1 dans $USERSDOVCONF, on les supprime." fi echo "$1:`dovecotpw -p $2`" >> $USERSDOVCONF [ $? -ne 0 ] && echo "L'ajout du mot de passe de $1 dans $USERSDOVCONF a échoué :-(" && exit 1 echo "Mot de passe de $1 ajouté à la fin de $USERSDOVCONF" exit 0 fi else echo "$DOVPW n'est pas exécutable !" exit 1 fi } # MAIN # test fichier de conf [ ! -w $USERSDOVCONF ] && echo "$USERSDOVCONF n'est pas accessible en écriture ! Abandon..." && exit 1 # check des options remove=0 user='' while getopts "ru:" OPTION do case "${OPTION}" in r ) remove=1;; u ) user=$OPTARG;; * ) usage;; esac done # et les actions if [ "$user" != '' ] then [ $remove -eq 1 ] && remove $user || askpass $user else usage fi