Скасовано екраном LD_LIBRARY_PATH


13

Запуск screenу bash стирає змінну LD_LIBRARY_PATH. Я прочитав читання і, здається, це очікувана поведінка, але мені потрібно обійти це.

До вирішення додається декларація LD_LIBRARY_PATH ~/.bashrc. У моєму випадку LD_LIBRARY_PATH сильно змінився між запуском оболонки та коли я викликаю екран, тому мені потрібно отримати поточне значення LD_LIBRARY_PATH в screenсеанс.


Ви експортували LD_KLIBRARY_PATH перед запуском екрана?
kinnou02

Суперузерне питання.
karlphillip

Вибачте, чи можу я якось перемістити його чи потрібно видалити та повторно поставити?

Якщо ви отримаєте п'ять закритих голосів, вони потраплять туди автоматично. Ще один!
Томас

Відповіді:


14

screenне скидає змінну середовища; він видаляється самим Linux.

У більшості систем /usr/bin/screenвиконуваний файл встановлюється із встановленим жорстким бітом для utmpгрупи, щоб мати змогу змінювати utmpбазу даних. Він також використовує setgid для управління доступом до каталогу socket ( /var/run/screen/).

У Linux, коли УИП (або setgid ) програма RAN, він не отримує певні змінні середовища ( в тому числі LD_LIBRARY_PATH, кілька інших LD_*змінних, а HOSTALIASES), для того , щоб зменшити можливі точки атаки: В іншому випадку ви могли б написати невелику бібліотеку і трюк suабо sudoтаким чином викликати ваші "покращені" функції.


Ви можете видалити setgid біт з screen, але ви повинні зробити каталог гніздо повністю доступні всім (режим 0777). Однак це не повинно бути ризиком для безпеки, як це screenперевіряє ідентифікаційний код атташера.

Однак ви не повинні робити utmpбазу даних всесвітньо доступними для запису.


(Примітка. Я не зовсім впевнений, чи видаляються змінні середовища ядром, або ld-linux.so, або glibc runtime.)
user1686

Працювали по-справжньому чудово. Це команди, які потрібно виконати: chgrp root $(which screen)і chmod 777 /var/run/screen. Ви можете протестувати за допомогою цього невеликого скрипта bash: while true; do echo $LD_LIBRARY_PATH; sleep 2; done Ви побачите, що шлях відображається успішно. Дякуємо завзятість.
lepe

7

У вашій команді .screenrcви можете використовувати setenvкоманду для встановлення значення в середовищі екрану.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Це встановлюється до запуску оболонки. Очевидно, що LD_LIBRARY_PATH_SCREENпотрібно встановити перед запуском екрана.


1
Дивіться відповідь grawity - LD_LIBRARY_PATH - це особлива змінна в цьому контексті. Навіть якщо це спрацювало (setenv не потрібно '=', btw), це не буде дуже корисно перейменувати змінну середовища, яку ми намагаємося встановити; програми все ще дивляться на канонічну назву (див. stackoverflow.com/questions/13974069/… ).
Ендрю Вуд

Чим за виправлення. Я виправив синтаксис і забув, що у мене на початковому екрані середовища була інша змінна. Його _SCREENможна встановити у вашому файлі rc або в скрипті для обгортки, який починається на екрані.
Droj

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.