web-dev-qa-db-fra.com

Remplacement pour "chpasswd -e" non interactif?

Sur des machines Debian plus anciennes, on peut émettre quelque chose comme:

echo '<username>:*'|chpasswd -e

afin de changer le champ de mot de passe de l'utilisateur (<username>) à *.

Maintenant je suis au courant de

passwd -d <username> && passwd -l <username>

pour obtenir un effet similaire et définissez le champ du mot de passe sur !. Cependant, sur certaines configurations plus récentes de Vanilla Ubuntu (en particulier 10.04 LTS), l’utilisateur ne peut plus se connecter à la machine (par exemple via SSH et key) - avec: Your account has expired; please contact your system administrator. - même si passwd(1) "avertit" que cela est possible.

Maintenant, c'est exactement ce que je veux réaliser, cependant. Changer manuellement le champ dans le fichier /etc/shadow de ! à * résout le problème, mais il ne semble exister aucun moyen scriptable de réaliser la même chose sans manipuler directement le shadow fichier (par exemple avec sed). chpasswd -e était une alternative pratique, mais celle-ci a évidemment été supprimée.

Donc, ce que je recherche, c’est soit une variante de passwd -l qui me permette de choisir le jeton qui est écrit dans le fichier, soit tout autre type de remplacement de la fonctionnalité exacte que chpasswd -e offert.

NB:* est déjà utilisé pour les comptes système, et il semble exister une différence sémantique par rapport à PAM ou autre entre ! et * dans le champ mot de passe. .

Remarque: sur Debian 5 et 6 chpasswd -e fonctionne. La fonctionnalité doit donc avoir été supprimée délibérément dans Ubuntu. J'ai testé Ubuntu 9.10, 10.04 (ils ne l'ont pas), 11.04 et 11.10 ont chpasswd -e.

6
0xC0000022L

Utilisez un script simple comme celui que je viens d'écrire:

#!/bin/bash

USER=$1
if [[ -z "$USER" ]]; then
  echo "From which user should I clear the password?"
  read USER
fi
if chpasswd -e -h > /dev/null 2>&1; then
  echo "$USER:*"|chpasswd -e
else
  passwd -d $USER
  cp /etc/shadow /etc/shadow.old
  USEROLD=$USER::
  USERNEW=$USER:*:
  sed -i "s/$USEROLD/$USERNEW/g" /etc/shadow.old
  cp /etc/shadow.old /etc/shadow
fi

L'utilisation du script est à vos risques et périls.

2