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.

Andrew Wood
la source
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.

user1686
la source
(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.

Droj
la source
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
1

Essayez exportla variable d'environnement qui vous intéresse.

export LD_LIBRARY_PATH
Benjamin Bannier
la source