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исполняемый файл устанавливается с битом setgid для utmpгруппы, чтобы иметь возможность изменять utmpбазу данных. Он также использует setgid для управления доступом к каталогу сокетов ( /var/run/screen/).

В Linux, когда запускается программа setuid (или setgid ), она не получает определенные переменные среды (включая LD_LIBRARY_PATHнесколько других LD_*переменных и HOSTALIASES), чтобы уменьшить возможные точки атаки: в противном случае вы можете написать небольшую библиотеку и трюк suили sudoтаким образом вызывая ваши «улучшенные» функции.


Вы можете удалить бит setgidscreen , но вам придется сделать каталог сокетов полностью доступным для всех (режим 0777). Это не должно быть угрозой безопасности, так как screenтакже проверяет сам UID атакующего.

Однако вы не должны делать utmpбазу данных доступной для записи.

user1686
источник
(Примечание: я не совсем уверен, удаляются ли переменные окружения ядром, или ld-linux.so, или средой выполнения glibc.)
user1686
Работал действительно хорошо. Это команды, которые необходимо выполнить: chgrp root $(which screen)и chmod 777 /var/run/screen. Вы можете протестировать этот небольшой скрипт bash: while true; do echo $LD_LIBRARY_PATH; sleep 2; done вы увидите, что путь успешно отображается. Спасибо, благодарность.
Лепе
7

В вашем .screenrc, вы можете использовать setenvкоманду, чтобы установить значение в среде экрана.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Это устанавливается до запуска вашей оболочки. Очевидно, что LD_LIBRARY_PATH_SCREENнеобходимо установить перед запуском экрана.

Droj
источник
1
Смотрите ответ от grawity - LD_LIBRARY_PATH является специальной переменной в этом контексте. Даже если это сработало (setenv не нужно '=', кстати), было бы не очень полезно переименовать переменную окружения, которую мы пытаемся установить; программы все равно будут искать каноническое имя (см. stackoverflow.com/questions/13974069/… ).
Эндрю Вуд
Чем для исправления. Я исправил синтаксис и забыл, что у меня была другая переменная на начальном экране среды. Один из _SCREENних может быть установлен в вашем файле rc или в скрипте-оболочке, который запускает экран.
Дрой
1

Попробуйте exportиспользовать переменную окружения, которая вас интересует.

export LD_LIBRARY_PATH
Бенджамин Банье
источник