LD_LIBRARY_PATH vom Bildschirm nicht festgelegt

13

Laufen screenin bash wischt die Variable LD_LIBRARY_PATH. Ich habe etwas gelesen und es scheint, dass dies erwartetes Verhalten ist, aber ich muss es umgehen.

Die Problemumgehung besteht darin, die LD_LIBRARY_PATH-Deklaration hinzuzufügen ~/.bashrc. In meinem Fall wird LD_LIBRARY_PATH zwischen dem Start der Shell und dem Aufrufen des Bildschirms stark geändert, sodass ich den aktuellen Wert von LD_LIBRARY_PATH in die screenSitzung übernehmen muss.

Andrew Wood
quelle
Sie haben LD_KLIBRARY_PATH exportiert, bevor Sie den Bildschirm ausführen?
Kinnou02
Superuser Frage.
Karlphillip
Entschuldigung, kann ich es irgendwie verschieben oder sollte ich löschen und neu posten?
Wenn Sie fünf enge Stimmen erhalten, wird es dort automatisch gestoßen. Noch einer!
Thomas

Antworten:

14

screenhebt die Umgebungsvariable nicht auf; es wird von Linux selbst entfernt.

Auf den meisten Systemen wird die /usr/bin/screenausführbare Datei mit dem Bit setgid für utmpgroup installiert , um die utmpDatenbank ändern zu können . Außerdem wird setgid verwendet , um den Zugriff auf das Socket-Verzeichnis ( /var/run/screen/) zu steuern .

Wenn unter Linux ein setuid- (oder setgid- ) Programm ausgeführt wird, empfängt es bestimmte Umgebungsvariablen (einschließlich LD_LIBRARY_PATHmehrerer anderer LD_*Variablen und HOSTALIASES) nicht, um die möglichen Angriffspunkte zu verringern: Andernfalls könnten Sie eine kleine Bibliothek und einen Trick schreiben suoder sudoauf diese Weise Ihre "verbesserten" Funktionen aufzurufen.


Sie können das setgid- Bit aus entfernen screen, müssen jedoch das Socket-Verzeichnis für alle zugänglich machen (Modus 0777). Es sollte jedoch kein Sicherheitsrisiko darstellen, da screenauch die UID des Anhängers selbst überprüft wird.

Sie sollten jedoch nicht die machen utmpDatenbank Welt beschreibbar.

user1686
quelle
(Hinweis: Ich bin nicht ganz sicher, ob die Umgebungsvariablen vom Kernel oder von ld-linux.so oder von der glibc-Laufzeit entfernt werden.)
user1686
Hat wirklich gut funktioniert. Dies sind die Befehle, die ausgeführt werden müssen: chgrp root $(which screen)und chmod 777 /var/run/screen. Sie können mit diesem kleinen Bash-Skript testen: while true; do echo $LD_LIBRARY_PATH; sleep 2; done Sie werden sehen, dass der Pfad erfolgreich angezeigt wird. Danke Grawity.
Lepe
7

In Ihrem .screenrckönnen Sie den setenvBefehl verwenden, um einen Wert in der Bildschirmumgebung festzulegen.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Dies wird festgelegt, bevor Ihre Shell gestartet wird. Muss natürlich LD_LIBRARY_PATH_SCREENeingestellt werden, bevor Sie den Bildschirm starten.

Droj
quelle
1
Siehe die Antwort von grawity - LD_LIBRARY_PATH ist in diesem Zusammenhang eine spezielle Variable. Selbst wenn dies funktionieren würde (setenv muss übrigens nicht '=' sein), wäre es nicht sehr hilfreich, die Umgebungsvariable, die wir festlegen möchten, umzubenennen. Programme würden immer noch den kanonischen Namen betrachten (siehe stackoverflow.com/questions/13974069/… ).
Andrew Wood
Danke für die Korrektur. Ich habe die Syntax korrigiert und vergessen, dass ich im Startbildschirm der Umgebung eine andere Variable hatte. Die _SCREENkann in Ihrer RC-Datei oder in einem Wrapper-Skript festgelegt werden, das den Bildschirm startet.
Droj
1

Probieren exportSie die Umgebungsvariable aus, an der Sie interessiert sind.

export LD_LIBRARY_PATH
Benjamin Bannier
quelle