webentwicklung-frage-antwort-db.com.de

Ersatz für nicht interaktives "chpasswd -e"?

Auf älteren Debian-Maschinen könnte man so etwas ausgeben:

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

um das Passwortfeld des Benutzers (<username>) in * zu ändern.

Jetzt bin ich mir dessen bewusst

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

um einen ähnlichen Effekt zu erzielen, setzen Sie das Passwortfeld auf !. Bei einigen neueren Vanilla Ubuntu-Konfigurationen (insbesondere 10.04 LTS) kann sich der Benutzer jedoch nicht mehr auf dem Computer anmelden (z. B. über SSH und Schlüssel) - mit: Your account has expired; please contact your system administrator. - obwohl passwd(1) "warnt", dass dies möglich ist.

Genau das möchte ich aber erreichen. Das manuelle Ändern des Felds in der /etc/shadow -Datei von ! in * behebt das Problem, aber es scheint keinen skriptfähigen Weg zu geben, um dasselbe zu erreichen, ohne direkt mit dem shadow zu experimentieren. Datei (zB mit sed). chpasswd -e war früher eine bequeme Alternative, aber das wurde offensichtlich entfernt.

Also, was ich suche, ist entweder eine Variation von passwd -l, mit der ich das Token auswählen kann, das in die Datei geschrieben wird, oder eine andere Art von Ersatz für die genaue Funktionalität, die chpasswd -e angeboten.

NB:* wird bereits für Systemkonten verwendet, und es scheint einen semantischen Unterschied zu PAM oder was auch immer zwischen ! und * im Passwortfeld zu geben .

Beachten Sie auch: unter Debian 5 und 6 chpasswd -e funktioniert. Daher muss die Funktionalität in Ubuntu bewusst eingeschränkt worden sein. Ich habe Ubuntu 9.10, 10.04 getestet (sie haben es nicht), 11.04 und 11.10 haben chpasswd -e.

6
0xC0000022L

Verwenden Sie ein einfaches Skript wie dieses, das ich gerade geschrieben habe:

#!/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

Die Verwendung des Skripts erfolgt auf eigenes Risiko.