¿Cómo configurar la variable de entorno para todos en mi sistema Linux?

132

¿Puedo tener ciertas configuraciones que sean universales para todos mis usuarios?

TIMEX
fuente
2
¿Es EXPORTAR? agregar eso y es global?
TIMEX
Creo que solo se agrega en la sesión actual, cuando abres una nueva sesión en la terminal, desaparecería
Haryono Sariputra

Respuestas:

104

Además de lo /etc/profileque otros han mencionado, algunos sistemas Linux ahora usan un directorio /etc/profile.d/; cualquier .sharchivo allí será originado por /etc/profile. Es un poco más ordenado mantener sus elementos de entorno personalizados en estos archivos que simplemente editarlos /etc/profile.

Kieron
fuente
44
¿Qué pasa si algunos usuarios usan otro shell, como zsh?
Matthieu Napoli
70
esto no es global ... está restringido al caparazón ... lástima que sea la respuesta más aceptada
mmm
1
zsh obtendrá los archivos .sh en /etc/profile.d/, puede verlo en / etc / zshrc @Matthieu Napoli
Bily
44
Las secuencias de comandos no se utilizan para el usuario ROOT.
Val
38

man 8 pam_env

man 5 pam_env.conf

Si todos los servicios de inicio de sesión usan PAM y todos los servicios de inicio de sesión tienen session required pam_env.sosus respectivos /etc/pam.d/*archivos de configuración, entonces todas las sesiones de inicio de sesión tendrán algunas variables de entorno establecidas como se especifica en pam_envel archivo de configuración.

En la mayoría de las distribuciones modernas de Linux, todo esto está allí por defecto, solo agregue las variables de entorno global que desee /etc/security/pam_env.conf.

Esto funciona independientemente del shell del usuario, y también funciona para inicios de sesión gráficos (si xdm / kdm / gdm / entrance / ... está configurado de esta manera).

efímero
fuente
1
+1 también necesita reiniciar después de agregar una variable en pam_env.conf porque instantáneamente sobre la marcha $ echo $ variablename no se muestra
9
No necesita reiniciar, necesita volver a iniciar sesión. (No reiniciar servidores críticos para mí)
Lyndon White
Esto no parece aplicarse a mi distribución, Mint 17.2. El archivo preinstalado está completamente comentado, y si agrego algo como echo foo>/home/me/bary reinicio (y vuelvo a iniciar sesión), ese archivo no se crea. (Probablemente haya una forma más elegante de probar esto, pero quería estar seguro antes de comentar aquí.)
Michael Scheper
16

Sorprendentemente, Unix y Linux en realidad no tienen un lugar para establecer variables de entorno globales. Lo mejor que puede hacer es organizar que cualquier shell específico tenga una inicialización específica del sitio.

Si lo coloca /etc/profile, eso se encargará de la mayoría de los usuarios de shell compatibles con posix. Esto es probablemente "lo suficientemente bueno" para fines no críticos.

Pero cualquiera con un csho tcshshell no lo verá, y no creo que cshtenga un archivo de inicialización global.

DigitalRoss
fuente
8
/etc/environmentEn realidad, parece establecer variables de entorno para mí, incluso como usuario root. Sé que /etc/environmentestá en Amazon Linux y Ubuntu. No pude verificar si funciona para csh, tcsh o zsh.
Jordan Stewart
no es específico del shell que está utilizando, es realmente global
Xerus
9

Algunos extractos interesantes de la página de manual de bash:

Cuando se invoca bash como un shell de inicio de sesión interactivo, o como un shell no interactivo con la --loginopción, primero lee y ejecuta comandos del archivo /etc/profile, si ese archivo existe. Después de leer ese archivo, busca ~/.bash_profile, ~/.bash_loginy ~/.profile, en ese orden, y lee y ejecuta órdenes desde el primero que existe y es legible. La --noprofileopción se puede usar cuando se inicia el shell para inhibir este comportamiento.
...
Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos desde /etc/bash.bashrcy ~/.bashrc, si existen estos archivos. Esto puede inhibirse mediante el uso de la --norcopción. los--rcfilela opción de archivo obligará a bash a leer y ejecutar comandos desde el archivo en lugar de /etc/bash.bashrcy ~/.bashrc.

Eche un vistazo a /etc/profileo /etc/bash.bashrc, estos archivos son los lugares correctos para la configuración global. Ponga algo como esto en ellos para configurar una variable de entorno:

export MY_VAR=xxx
Pascal Thivent
fuente
Tenga en cuenta que en los sistemas clásicos de Unix, tanto el shell Bourne como el shell Korn también leen / etc / profile: es probablemente la ubicación más utilizada para la configuración del entorno del sistema. Algunas versiones del shell C se ven en /etc/csh.cshrc y /etc/csh.login, así como en ubicaciones por usuario; otros no usan ningún archivo de configuración del entorno del sistema.
Jonathan Leffler
Impresionante, justo lo que estaba buscando en cuanto a establecer el entorno para los usuarios de shell que no inician sesión.
David Mann
Lo siento, parece que accidentalmente he votado negativamente sobre esto cuando por un tiempo las flechas no estaban visibles ... ¿te importaría editar esto (por ejemplo, "entorno" en la penúltima línea) para que pueda eliminar el voto negativo?
Benjamin W.
4

Usar PAM es excelente.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

fuente
2

Cada proceso que se ejecuta bajo el kernel de Linux recibe su propio entorno único que hereda de su padre. En este caso, el padre será un shell en sí mismo (engendrando un sub shell) o el programa 'login' (en un sistema típico).

Como el 'entorno de cada proceso está protegido, no hay forma de' inyectar 'una variable de entorno a cada proceso en ejecución, por lo que incluso si modifica el shell predeterminado .rc / profile, no entrará en vigencia hasta que cada proceso salga y se vuelva a cargar su configuración de inicio.

Busque en / etc / para modificar las variables de inicio predeterminadas para cualquier shell en particular. Solo tenga en cuenta que los usuarios pueden (y a menudo lo hacen) cambiarlos en su configuración individual.

Unix está diseñado para obedecer al usuario, dentro de los límites.

NB : Bash no es el único shell en su sistema. Presta mucha atención a lo que realmente apunta el enlace simbólico / bin / sh. En muchos sistemas, esto en realidad podría ser un guión que es (por defecto, sin invocación especial) POSIBLEMENTE correcto. Por lo tanto, debe tener cuidado de modificar ambos valores predeterminados, o los scripts que comienzan con / bin / sh no heredarán sus valores predeterminados globales. Del mismo modo, tenga cuidado de evitar la sintaxis que solo bash entiende al editar ambos, también conocido como avoiding bashisms.

Tim Post
fuente