Kann ich ein Benutzerkennwort in Linux über die Befehlszeile ohne Interaktivität ändern?

15

Ich habe einen bestimmten Anwendungsfall, in dem ich das Kennwort eines Benutzers wirklich mit einem einzigen Befehl ohne Interaktivität ändern möchte. Dies geschieht auf sichere Weise (über SSH und auf einem System, auf dem nur ein Benutzer angemeldet sein kann). Es ist also in Ordnung, das neue Kennwort (und gegebenenfalls sogar das alte Kennwort) in der Befehlszeile anzugeben. FWIW, es ist ein Ubuntu-System.

Ich möchte nur vermeiden, diesem System für nur diese eine Aufgabe etwas Erwartungsvolles hinzufügen zu müssen.

Paul Hoffman
quelle
3
Für diejenigen, die dies auf FreeBSD tun möchten:echo "newpassword" | pw usermod theusername -h 0
Paul Hoffman

Antworten:

5

Sie können usermodmit der -pOption einen Passwort-Hash angeben (nicht das eigentliche Passwort). Sie können den Passwort-Hash mit etwas wie mkpasswd -m sha-256oder generierenmkpasswd -m md5

Eintopf
quelle
1
... Aber mein AIX-System hat nicht usermod: '(- Ich werde die Tags auf der Frage beheben.
Voretaq7
3

Sicher.

  1. Hash das Passwort auf Ihrem lokalen System.
  2. Stellen Sie eine Verbindung zum Remotecomputer her (wo Sie das Kennwort ändern möchten)
  3. Führen Sie das Hash - Passwort und den Benutzernamen zu einem kreativen sedSkript , das Ihr System aktualisiert Kennwortdatei ( /etc/shadow, /etc/master.passwd, was auch immer es passiert zu sein).
voretaq7
quelle
1

Das passwdDienstprogramm verfügt über die Option --stdin, die Folgendes angibt:

Diese Option wird verwendet, um anzugeben, dass passwd das neue Kennwort von der Standardeingabe lesen soll, die eine Pipe sein kann.

Syntax:

echo "newpass" | passwd --stdin user1

Auch wenn Sie erwähnt haben, dass es Ihnen egal ist, können Sie das Kennwort in eine Textdatei einfügen und dann cat pass.txtanstelle des Befehls echo den Befehl ausführen, damit er nicht im Bash-Verlauf angezeigt wird.

Safado
quelle
Das ist der eine. echo VerySecret | passwd --stdin username
MadHatter
5
Mein Ubuntu-System hat keine --stdinOption für passwd.
Jeff Ferland
Du hast recht, tut es nicht. Ich habe sowohl auf einem CentOS-System als auch auf einem Mac nachgesehen und sie haben die Option --stdin, daher muss das Entfernen eine Ubuntu-Sache sein.
Safado
1
@RyanM. FreeBSD (und AFAIK NetBSD und OpenBSD, AIX, HP-UX und Solaris letzten ich checke) nicht unterstützen --stdinentweder - vor allem , weil es eine große Riesen Sicherheitslücke wartet passieren :-)
voretaq7
1
@quanta: Oder beginne die echo "newpass" | passwd --stdin user1Zeile mit einem Leerzeichen; auf diese Weise wird es überhaupt nicht in die Geschichte eingehen.
Janne Pikkarainen
1

Wenn die --stdinOption nicht funktioniert, können wir grundsätzlich zwei Optionen verwenden:

  1. Verwenden Sie entweder ein anderes Dienstprogramm, das chpaswdin Ihrem Skript aufgerufen wird .
  2. ODER verwenden echo "current_password\nnew_password\nnew_password" | passwd user_name
Sanjay s.
quelle