Wie kann ich den Besitzer eines Prozesses ändern?

Wie kann ich den Besitzer eines Prozesses ändern?

Hallo, ich habe gerade einen technischen Test auf Ubuntu abgeschlossen und bin auf ein Problem gestoßen, bei dem ich den Benutzer des PHP-Prozesses ändern musste, um eine defekte Website zu reparieren. Ich glaube, der Benutzer war „foo“, aber es hätte „www-data“ sein müssen. Am Ende wurde mir gesagt, dass „chowning the process“ die Lösung sei. Ich möchte nur wissen, wie das für die Zukunft geht.

Auf die gleiche Weise würden Sie den Benutzer einer Datei chownen (nehme ich an), aber nur für einen Prozess. Ich habe gesucht und gesucht, aber ich frage mich, ob ich nach dem falschen Befehl suche? Oder könnte dies vielleicht irgendwo in einer Konfigurationsdatei geändert werden?

Dank im Voraus!

Antwort1

Es ist nicht möglich, den Benutzer oder die Gruppe eines laufenden Prozesses in Linux extern zu ändern. Was Sie tun können, ist, die Konfiguration des laufenden Prozesses so zu ändern, dass beim nächsten Ausführen der neue Benutzer verwendet wird. Das hängt davon ab, wie Sie PHP installiert und konfiguriert haben (oder vielmehr davon, was PHP für Sie ausführt – Apache, php-fpm usw.).

Antwort2

Das schaffst du nicht, Mann. Wenn du es uns bitte mitteilen könntest, sieh dir diesen Link an: https://stackoverflow.com/questions/37401774/change-owner-of-a-currently-running-process

Antwort3

Dies ist eigentlich ein Konstruktionsfehler des Linux-Kernels, da Anmeldeinformationen nur auf der Festplatte, nicht aber im Speicher geändert werden. Genauer gesagt: Wenn Anmeldeinformationen (UID, GID oder ergänzende Gruppenliste) geändert werden, verwenden alle vorhandenen Prozesse weiterhin ihre vorherigen Anmeldeinformationen und haben Zugriff auf zuvor gewährte Daten. Und es gibt keine einzige API-Funktion, um Anmeldeinformationen im gesamten System (d. h. in allen Prozessen) zu verbreiten. Aufgrund dieses Fehlers können keine Programme auf Benutzerebene das tun, was Sie möchten. Dazu benötigen Sie ein Kernelmodul. Ich habe gerade versucht, eines zu erstellen, und es funktioniert bei einfachen Programmen. (https://github.com/xuancong84/supgroup)

Im Allgemeinen ist dies jedoch keine gute Idee, da ein Programm im Allgemeinen viele Interaktionen aufweisen kann, z. B. geöffnete Dateihandles, untergeordnete Prozesse/Threads, die auf anderen CPU-Kernen laufen, gebundene Pipes, geöffnete Geräte usw. Daher kann das Ändern der UID/GID während der Ausführung zu vielen undefinierten Verhaltensweisen führen, von denen einige Fehler verursachen (z. B. unterbrochene Pipe, abgebrochene E/A-Kommunikation) und andere gefährlich sein können (z. B. Systemabsturz). Ich habe getestet, dass dieses Programm bei einfachen Programmen (wie z. B. nc -l 8080) funktioniert, aber bei einem viel größeren, komplexen Programm, das viele Threads auf vielen CPU-Kernen und GPU-CUDA-Kernen ausführt und starke Netzwerkaktivität und Festplatten-E/A-Aktivität aufweist, bin ich nicht sicher, was passieren wird.

verwandte Informationen