LD_LIBRARY_PATH desarmado por pantalla

13

Ejecutar screenen bash borra la variable LD_LIBRARY_PATH. He leído un poco y parece que este es un comportamiento esperado, pero necesito evitarlo.

La solución consiste en agregar la declaración LD_LIBRARY_PATH a ~/.bashrc. En mi caso, LD_LIBRARY_PATH se cambia mucho entre el inicio del shell y cuando invoco la pantalla, por lo que necesito obtener el valor actual de LD_LIBRARY_PATH en la screensesión.

Andrew Wood
fuente
has exportado LD_KLIBRARY_PATH antes de ejecutar la pantalla?
kinnou02
Pregunta de superusuario.
karlphillip
Lo sentimos, ¿puedo moverlo de alguna manera o debo eliminarlo y volver a publicarlo?
Si obtiene cinco votos cerrados, se eliminará allí automáticamente. Uno más para ir!
Thomas

Respuestas:

14

screenno desarma la variable de entorno; es eliminado por el propio Linux.

En la mayoría de los sistemas, el /usr/bin/screenejecutable se instala con el bit setgid para utmpgrupo, para poder modificar la utmpbase de datos. También usa setgid para controlar el acceso al directorio de socket ( /var/run/screen/).

En Linux, cuando se ejecuta un programa setuid (o setgid ), no recibe ciertas variables de entorno (incluidas LD_LIBRARY_PATHvarias otras LD_*variables, y HOSTALIASES), para reducir los posibles puntos de ataque: de lo contrario, podría escribir una pequeña biblioteca y truco suo sudopara llamar a sus funciones "mejoradas" de esa manera.


Puede eliminar el bit setgidscreen , pero deberá hacer que el directorio del socket sea totalmente accesible para todos (modo 0777). Sin embargo, no debería ser un riesgo de seguridad, ya que screentambién verifica el UID del atacante.

Sin embargo, usted debe no hacer que la utmpbase de datos con permiso de escritura.

usuario1686
fuente
(Nota: no estoy muy seguro de si las variables de entorno son eliminadas por el kernel, o por ld-linux.so, o por glibc runtime.)
user1686
Funcionó muy bien. Estos son los comandos que deben hacerse: chgrp root $(which screen)y chmod 777 /var/run/screen. Puede probar con este pequeño script bash: while true; do echo $LD_LIBRARY_PATH; sleep 2; done verá que la ruta se muestra con éxito. Gracias Grawity.
lepe
7

En su .screenrc, puede usar el setenvcomando para establecer un valor en el entorno de la pantalla.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Esto se establece antes de que se inicie su shell. Obviamente LD_LIBRARY_PATH_SCREEN, debe configurarse antes de iniciar la pantalla.

Droj
fuente
1
Vea la respuesta de Grawity: LD_LIBRARY_PATH es una variable especial en este contexto. Incluso si esto funcionara (setenv no necesita '=', por cierto) no sería muy útil cambiar el nombre de la variable de entorno que estamos tratando de establecer; los programas seguirían mirando el nombre canónico (consulte stackoverflow.com/questions/13974069/… ).
Andrew Wood
Que es por la corrección. Arreglé la sintaxis y olvidé que tenía una variable diferente en la pantalla de inicio del entorno. El _SCREENque se puede configurar en su archivo rc o en un script de envoltura que inicia la pantalla.
Droj
1

Probar exportla variable de entorno que le interesa.

export LD_LIBRARY_PATH
Benjamin Bannier
fuente