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 cmd
wird 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 Befehlszeilentoolpwgen
um 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, passwd
daher ist es möglicherweise möglich, dass jemand die Prozesse über ausspioniert. ps
Auch wenn ein Benutzer dadurch nicht die Prozesse von root sehen kann, ist die Weitergabe des Passworts an passwd
abgeschottet.
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 ps
in 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.txt
zeigt, dass das Passwort nicht weitergegeben wurde:
$ grep supersecret ps.txt
$
Auch das Ändern des ps
von uns verwendeten Befehls ps -eaf
führt nicht zu einem Datenverlust.
Antwort3
passwd --help
Auf meiner Box wird angezeigt, dass root
es ausgeführt werden kann, indem --stdin
das 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