2009-04-28 19 views
3

Ich weiß über passwd(1) und crypt(3). Nach was ich suche, ist eine c API, die angerufen wird, die das Kennwort des Benutzers in den passwd/Schattenakten setzt, ohne die Akten programmatisch laufen zu lassen und den Eintrag für den fraglichen Benutzer zu überschreiben. Die Anwendung läuft als root.Welche API rufe ich auf, um das Passwort eines Benutzers auf Linux zu setzen?

Gibt es eine solche API?

EDIT: Rate ich sollte angeben, das Passwort wird zwischen verschiedenen Systemen synchronisiert, so dass wir nicht einfach System aufrufen können ("passwd") und erlauben Sie den Benutzer Passwort eingeben, wenn passwd sie fordert. Wir müssen das Passwort kennen, damit wir die anderen Systeme mit dem gleichen Passwort programmatisch aktualisieren können.

+0

Ich würde einfach passwd mit den richtigen Argumenten ausführen ... –

+1

Welche Parameter wäre das? passwd hat keinen Parameter zur Angabe des Passworts - nur den Benutzernamen. :( –

+2

Vielleicht hilft das? Http://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#714934 – 8jean

Antwort

4

Wie 8jean oben kommentiert, könnte/usr/sbin/chpasswd der einfachste Weg sein.Sonst wäre ich mit dem Kommentar von noha gegangen, Funktionen wie fgetpwent() - oder fgetspent() für den Umgang mit der Shadow-Datei zu verwenden - um die Liste der Benutzer durchzugehen und die Datensätze zu ändern, die ich ändern muss. Danke, alle!

+0

Wenn der Prozess mit einer effektiven UID von root ausgeführt wird, ist der Befehl chpasswd die richtige Lösung nicht, naja, es ist nicht die richtige Lösung.Aus einem C-Programm besteht die beste Lösung darin, die Shadow-Bibliothek aus der shadow-utils-Distribution zu verwenden. –

-1

Die beste Wette ist, den Befehl passwd mit den entsprechenden Argumenten auszuführen und sich um die Probleme mit der Dateiverwaltung, der Verschlüsselung und der Dateisperrung kümmern zu müssen. Auf einer bestimmten Ebene muss etwas "programmgesteuert die Dateien" laufen lassen, egal was passiert. Wenn Sie nicht wirklich ein großes Leistungsproblem haben, verlassen Sie sich lieber auf den vorhandenen Code und die vorhandene Erfahrung, anstatt zu versuchen, den vorhandenen Code zu duplizieren.

+1

Passwd Befehl erlaubt kein Passwort angegeben werden als Befehlszeilenargument –

+1

Konnte Pipe-Befehle zu passwd. –

+0

fyi: Piping-Befehle zu passwd ist schwierig, wenn Ihre Kennwörter Sonderzeichen in ihnen haben, seien Sie vorsichtig mit der Flucht –

0

Vielleicht möchten Sie PAM? Nicht sicher, aber die meisten Distributionen verwenden es ...

Hinzugefügt: Es sieht so aus, als ob Mac OS X openssl verwendet, um das Kennwort Hashing zu verwalten. Unter Linux ist es möglich, etwas ähnliches zu tun, aber für Ihre Bedürfnisse müssen Sie mit der vom Betriebssystem verwendeten Authentifizierungsschicht kompatibel sein.

0

Sie könnten einen Blick auf passwd Quelle werfen, aber ich würde zuerst einen leichteren und faulen Weg versuchen: Ich würde einfach passwd strace und sehen, was passiert.

+0

strace würde nicht zu viel helfen, es ist zu niedrigen Pegel Im besten Fall würde es sowohl auf/etc/shadow als auch auf/etc/passwd geöffnet sein und write wird auf diesen Datei-Handles aufgerufen –

2

Verwenden von/etc/passwd und/etc/shadow zum Speichern von Kennwörtern? Sind die UIDs zwischen den Systemen synchronisiert? Sie könnten einfach die Zeile in der Datei/etc/shadow für den jeweiligen Benutzer kopieren/überschreiben.

Und die "do not do it" Antwort wäre, einen NIS Server zu benutzen und das Passwort nur einmal zu ändern.

2

Vielleicht ist der Putpwent-Aufruf, was Sie suchen. Versuchen Sie, Mann Putpwent. Auf einer Schnellsuche finde ich eine Seite mit einigen Beispielen. Es könnte helfen.

http://linux.omnipotent.net/article.php?article_id=10935

prüfen getpwnam zum Nachschlagen als den Eintrag zu ändern und die Nutzung putpwent.

4

Dies würde höchstwahrscheinlich variieren je nach welchem ​​Mechanismus des fraglichen System verwendet ...

..., die mich zu einem anderen Vorschlag bringt, nutzen vorhandene Werkzeuge die verschiedenen Systeme authentifizieren Benutzer gegen einen gemeinsamen Speicher zu haben, statt - Wie LDAP oder was auch immer Verzeichnis oder Master-System auf Ihrer Website verfügbar ist. Oder eins aufstellen. Vorzugsweise nicht NIS + ^^

Nicht das Rad neu erfinden, wie sie angeblich sagen.

Woher würden Sie das Klartext-Passwort von Anfang an bekommen? Wenn es da draußen ist, warum sollten Sie sich überhaupt mit Passwörtern herumschlagen? (Ja, ich weiß, ich bin ein Stichel, wenn es um diese Dinge geht, sorry - lass die Downvoten anfangen;)