Ändern des Benutzerkennworts über die GUI-App

Ändern des Benutzerkennworts über die GUI-App

Ich habe eine GUI-Anwendung zur Verwaltung von Benutzern und Gruppen in Linux erstellt!

Ich bin mit dem Teil fertig, in dem ein neuer Benutzer erstellt wird, aber ich hänge bei dem Teil fest, in dem dem neu erstellten Benutzer ein neues Passwort zugewiesen wird. Meine App nimmt einfach die erforderlichen Eingaben (Benutzername, Gruppenliste und Passwort) über eine GUI entgegen und führt ein Skript aus, das diese Informationen als Argument übergibt. Nehmen wir an, wir haben ein Benutzerkonto, xyz. Wenn ich das Passwort für dieses Konto ändern möchte, muss ich lediglich den folgenden Befehl ausführen:

passwd xyz

Dadurch wird ein neues Passwort abgefragt. Jetzt kann ich mithilfe von Skripten ein neues Konto erstellen, da alle erforderlichen Informationen in der Befehlszeile übergeben werden.

useradd -m -G users -g "groups" -s /bin/bash "UserName"

Ich kann ein Skript über die Qt-App ausführen und den Benutzer erstellen, aber in passwd cmdwird die Eingabe in der anderen Zeile abgefragt. Wie geht man damit um?

Antwort1

Ich denke, die richtige Antwort hier ist:Wechseln Sie nicht zu einem Kommandozeilentool – verwenden Sie einen Bibliotheksaufruf. Dadurch können Sie Fehler besser behandeln und die risikobehaftete Weitergabe des Passworts auf einer Befehlszeile vermeiden.

Eine Bibliothek, die Sie verwenden können, istlibuser, das relativ einfach ist und über C- und Python-Anbindungen verfügt.

Antwort2

Als Root können Sie das Passwort eines Benutzers mithilfe dieser Methode systematisch über ein Skript festlegen:

$ echo -n "$passwd" | passwd "$uname" --stdin

Passwörter generieren

Ich verwende gerne das Befehlszeilentoolpwgenum Passwörter zu generieren.

$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"

$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

Options supported by pwgen:
  -c or --capitalize
    Include at least one capital letter in the password
  -A or --no-capitalize
    Don't include capital letters in the password
  -n or --numerals
    Include at least one number in the password
  -0 or --no-numerals
    Don't include numbers in the password
  -y or --symbols
    Include at least one special symbol in the password
  -s or --secure
    Generate completely random passwords
  -B or --ambiguous
    Don't include ambiguous characters in the password
  -h or --help
    Print a help message
  -H or --sha1=path/to/file[#seed]
    Use sha1 hash of given file as a (not so) random generator
  -C
    Print the generated passwords in columns
  -1
    Don't print the generated passwords in columns
  -v or --no-vowels
    Do not use any vowels so as to avoid accidental nasty words

Aber ist das nicht unsicher?

Nein. Das Passwort wird über STDIN an weitergegeben, passwddaher ist es möglicherweise möglich, dass jemand die Prozesse über ausspioniert. psAuch wenn ein Benutzer dadurch nicht die Prozesse von root sehen kann, ist die Weitergabe des Passworts an passwdabgeschottet.

Beispiel

Angenommen, ich führe diesen Befehl in einem Terminal als Root aus:

$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989

Ich führe dann psin einem anderen Terminal aus:

$ ps -AOcmd | grep pass
14046 passwd samtest --stdin      R pts/11   00:00:00 passwd samtest --stdin

Nachdem das Passwort im 1. Terminal geändert wurde:

[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.

Was ist mit dem Echo zu Passwd?

Auch dadurch wird das Passwort nicht weitergegeben. Hier ist ein weiterer Test, der dies demonstriert. Zuerst starten wir diesen Befehl in einem sekundären Terminal. Dadurch wird die Ausgabe von gesammelt ps.

$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt

Anschließend führen wir unseren Befehl zum Festlegen des Passworts aus:

$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.

[1]+  Done                    echo "supersecret" | passwd "samtest" --stdin

Die Überprüfung des Inhalts ps.txtzeigt, dass das Passwort nicht weitergegeben wurde:

$ grep supersecret ps.txt
$

Auch das Ändern des psvon uns verwendeten Befehls ps -eafführt nicht zu einem Datenverlust.

Antwort3

passwd --helpAuf meiner Box wird angezeigt, dass rootes ausgeführt werden kann, indem --stdindas neue Kennwort über die Standardeingabe eingegeben wird.

Antwort4

Der Befehl chpasswd liest eine Liste von Benutzernamen/Passwort-Paaren aus der Befehlszeile, um eine Gruppe bestehender Benutzer zu aktualisieren. Jede Zeile hat das Format

user_name:password

Dieser Befehl ist für die Verwendung in großen Systemumgebungen vorgesehen, in denen viele Konten gleichzeitig erstellt werden. Um mehr über die Optionen dieses Befehls zu erfahren, geben Sie ein

man chpasswd

verwandte Informationen