LD_LIBRARY_PATH non défini par écran


13

L'exécution screenen bash efface la variable LD_LIBRARY_PATH. J'ai fait quelques lectures et il semble que ce soit un comportement attendu, mais je dois le contourner.

La solution de contournement consiste à ajouter la déclaration LD_LIBRARY_PATH à ~/.bashrc. Dans mon cas, LD_LIBRARY_PATH est beaucoup changé entre le lancement du shell et lorsque j'appelle l'écran, j'ai donc besoin d'obtenir la valeur actuelle de LD_LIBRARY_PATH dans la screensession.


vous avez exporté LD_KLIBRARY_PATH avant d'exécuter l'écran?
kinnou02

Question de superutilisateur.
karlphillip

Désolé, puis-je le déplacer ou dois-je le supprimer et le republier?

Si vous obtenez cinq votes serrés, il y sera automatiquement remplacé. Un de plus à parcourir!
Thomas

Réponses:


14

screenne désactive pas la variable d'environnement; il est supprimé par Linux lui-même.

Sur la plupart des systèmes, l' /usr/bin/screenexécutable est installé avec le bit setgid pour le utmpgroupe, afin de pouvoir modifier la utmpbase de données. Il utilise également setgid pour contrôler l'accès au répertoire socket ( /var/run/screen/).

Sous Linux, lorsqu'un programme setuid (ou setgid ) est exécuté, il ne reçoit pas certaines variables d'environnement (y compris LD_LIBRARY_PATH, plusieurs autres LD_*variables, et HOSTALIASES), afin de réduire les points d'attaque possibles: Sinon, vous pourriez écrire une petite bibliothèque et tromper suou sudoen appelant ainsi vos fonctions "améliorées".


Vous pouvez supprimer le bit setgid de screen, mais vous devrez rendre le répertoire socket entièrement accessible à tous (mode 0777). Cela ne devrait pas être un risque pour la sécurité, car screenil vérifie également l'UID de l'attacheur lui-même.

Cependant, vous ne devez pas rendre la utmpbase de données accessible en écriture.


(Remarque: je ne sais pas trop si les variables d'environnement sont supprimées par le noyau, ou par ld-linux.so, ou par l'exécution de la glibc.)
user1686

A très bien fonctionné. Ce sont les commandes qui doivent être faites: chgrp root $(which screen)et chmod 777 /var/run/screen. Vous pouvez tester avec ce petit script bash: while true; do echo $LD_LIBRARY_PATH; sleep 2; done vous verrez que le chemin est correctement affiché. Merci grawity.
lepe

7

Dans votre .screenrc, vous pouvez utiliser la setenvcommande pour définir une valeur dans l'environnement de l'écran.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Ceci est défini avant le démarrage de votre shell. De toute évidence, LD_LIBRARY_PATH_SCREENdoit être défini avant de démarrer l'écran.


1
Voir la réponse de grawity - LD_LIBRARY_PATH est une variable spéciale dans ce contexte. Même si cela fonctionnait (setenv n'a pas besoin de '=', btw), il ne serait pas très utile de renommer la variable d'environnement que nous essayons de définir; les programmes chercheraient toujours le nom canonique (voir stackoverflow.com/questions/13974069/… ).
Andrew Wood

C'est pour la correction. J'ai corrigé la syntaxe et j'avais oublié que j'avais une variable différente dans l'écran de démarrage de l'environnement. Celui- _SCREENci peut être défini dans votre fichier rc ou dans un script wrapper qui démarre l'écran.
Droj

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.