Gibt es unter Unix eine Möglichkeit, dass ein Prozess die Umgebungsvariablen eines anderen ändert (vorausgesetzt, sie werden alle von demselben Benutzer ausgeführt)? Eine allgemeine Lösung wäre am besten, aber wenn nicht, was ist mit dem speziellen Fall, in dem einer ein Kind des anderen ist?
Edit: Wie wäre es über gdb?
Antworten:
Über gdb:
Dies ist ein ziemlich böser Hack und sollte natürlich nur im Rahmen eines Debugging-Szenarios durchgeführt werden.
quelle
ptrace: Operation not permitted
Sie können es wahrscheinlich technisch tun (siehe andere Antworten), aber es hilft Ihnen möglicherweise nicht.
Die meisten Programme erwarten, dass env-Variablen nach dem Start nicht von außen geändert werden können. Daher lesen die meisten wahrscheinlich nur die Variablen, an denen sie beim Start interessiert sind, und initialisieren sie basierend darauf. Ein späteres Ändern macht also keinen Unterschied, da das Programm sie nie wieder liest.
Wenn Sie dies als konkretes Problem angegeben haben, sollten Sie wahrscheinlich einen anderen Ansatz wählen. Wenn es nur aus Neugier war: Schöne Frage :-).
quelle
Im Wesentlichen nein. Wenn Sie über ausreichende Berechtigungen (root oder so ungefähr) verfügten und in / dev / kmem (Kernelspeicher) stöberten und Änderungen an der Umgebung des Prozesses vorgenommen haben und wenn der Prozess die Umgebungsvariable danach tatsächlich neu referenziert hat (d. H. Den Prozess) hatte noch nicht eine Kopie der env var genommen und benutzte nicht nur diese Kopie), dann vielleicht, wenn Sie Glück hatten und klug waren und der Wind in die richtige Richtung wehte und die Mondphase vielleicht richtig war, vielleicht Sie könnten etwas erreichen.
quelle
gdb
und mit einem Skript versehen, um die Änderung vorzunehmen. Es funktioniert, ohne den übergeordneten Prozess zum Absturz zu bringen. OK - Sie können es wahrscheinlich tun, aber Sie werden es nicht routinemäßig tun. Aus praktischen Gründen bleibt die Antwort daher Nein . Der Rest der Antwort behandelt die theoretisch möglichen, etwas unpraktisch machbaren Alternativen.Zitat Jerry Peek:
Das einzige, was Sie tun können, ist, die Umgebungsvariable des untergeordneten Prozesses zu ändern, bevor Sie ihn starten: Es wird leider die Kopie der übergeordneten Umgebung abgerufen.
Weitere Informationen finden Sie unter http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm .
Nur ein Kommentar zur Antwort über die Verwendung von / proc. Unter Linux wird / proc unterstützt, aber es funktioniert nicht, Sie können die
/proc/${pid}/environ
Datei nicht ändern , auch wenn Sie root sind: Es ist absolut schreibgeschützt.quelle
Ich könnte mir den ziemlich erfundenen Weg vorstellen, das zu tun, und es wird nicht für willkürliche Prozesse funktionieren.
Angenommen, Sie schreiben Ihre eigene gemeinsam genutzte Bibliothek, die 'char * getenv' implementiert. Anschließend richten Sie 'LD_PRELOAD' oder 'LD_LIBRARY_PATH' env ein. vars, sodass beide Prozesse mit vorinstallierter gemeinsam genutzter Bibliothek ausgeführt werden.
Auf diese Weise haben Sie im Wesentlichen die Kontrolle über den Code der Funktion 'getenv'. Dann könnten Sie alle möglichen bösen Tricks machen. Ihr 'getenv' könnte eine externe Konfigurationsdatei oder ein SHM-Segment für alternative Werte von env vars konsultieren. Oder Sie können die angeforderten Werte erneut suchen / ersetzen. Oder ...
Ich kann mir keinen einfachen Weg vorstellen, dies für beliebig laufende Prozesse zu tun (selbst wenn Sie root sind), ohne den dynamischen Linker (ld-linux.so) neu zu schreiben.
quelle
Oder veranlassen Sie Ihren Prozess, eine Konfigurationsdatei für den neuen Prozess zu aktualisieren, und dann entweder:
quelle
Soweit ich weiß, nicht. Sie versuchen wirklich, von einem Prozess zum anderen zu kommunizieren, was eine der IPC-Methoden erfordert (gemeinsamer Speicher, Semaphoren, Sockets usw.). Nachdem Sie Daten mit einer dieser Methoden empfangen haben, können Sie Umgebungsvariablen festlegen oder andere Aktionen direkter ausführen.
quelle
Wenn Ihr Unix das Dateisystem / proc unterstützt, ist es trivial, die Umgebung zu LESEN. Sie können die Umgebung, die Befehlszeile und viele andere Attribute jedes Prozesses, den Sie besitzen, auf diese Weise lesen. Ändern ... Nun, ich kann mir einen Weg vorstellen, aber es ist eine schlechte Idee.
Der allgemeinere Fall ... Ich weiß es nicht, aber ich bezweifle, dass es eine tragbare Antwort gibt.
(Bearbeitet: Meine ursprüngliche Antwort ging davon aus, dass das OP die Umgebung LESEN und nicht ändern wollte.)
quelle
UNIX ist voll von prozessübergreifender Kommunikation. Überprüfen Sie, ob Ihre Zielinstanz welche hat. Dbus wird zum Standard im "Desktop" -IPC.
Ich ändere Umgebungsvariablen innerhalb von Awesome Window Manager mit awesome-client mit einem Dbus "Absender" von Lua-Code.
quelle
Keine direkte Antwort, aber ... Raymond Chen hatte erst neulich eine [Windows-basierte] Begründung : -
Mit anderen Worten, solche Kernel-Einrichtungen wären
Der wahrscheinlichste Grund ist jedoch einfach, dass es für eine solche Einrichtung nur begrenzte Anwendungsfälle gibt.
quelle
Es scheint, dass putenv jetzt nicht funktioniert, aber setenv . Ich habe die akzeptierte Antwort getestet, während ich versucht habe, die Variable in der aktuellen Shell ohne Erfolg festzulegen
und die Variante, wie es funktioniert:
quelle