Cómo establecer variables de entorno de todo el sistema en OS X Mavericks


36

Solíamos usar /etc/environmentpara establecer variables de entorno de todo el sistema en Mountain Lion. Sin embargo, parece que este archivo ya no se lee.

Idealmente, la solución debería aplicarse a todos los usuarios, y necesitamos que funcione con sesiones de consola ssh. Entonces, necesitamos que esto funcione

ssh user@mavericks-machine 'echo $MY_ENV_VAR'

Hasta ahora hemos intentado:

  • /etc/launchd.conf

    Funciona para todos los usuarios, pero solo se aplica a las aplicaciones 'en ventana', es decir, funciona en Terminal, pero no en una sesión ssh.

  • ~/.profile, ~/.bash_profileEtc.

    Solo aplica para proyectiles

¿Alguna sugerencia?


El archivo ( /etc/environment) no se lee porque no es un estándar entre sistemas, es solo parte de la instalación PAM de Linux. Mac OS X no es Linux y no utiliza PAM, ni otros sistemas operativos que yo sepa. Solo te saliste con la tuya porque estabas en Linux, aparentemente. Y sí, todavía se lee - por Linux ;-)
amn

Respuestas:


18

El archivo correcto, antes de Mavericks, era ~/.MacOSX/environment.plist. Esto ya no es compatible.

En Darwin, y por lo tanto en Mac OS X, el lugar adecuado para configurarlos es /etc/launchd.confaplicarlo a todos los procesos; si se relaciona específicamente con shells de usuario, use los archivos de shell apropiados en su lugar, dependiendo del shell en cuestión. Vea las páginas launchd.confy launchctlman para más.

Dicho eso ...

Si su objetivo es ver específicamente estas aplicaciones aplicadas para sesiones ssh, entonces debe tener en cuenta que ssh, por razones de seguridad, no aplica variables de entorno de esta manera. De hecho, una sesión ssh normalmente recibe un conjunto mucho más restrictivo de variables de entorno del sistema operativo ya que no es lo que se conoce como un shell de "inicio de sesión" o "interactivo", se clasifica como un shell "no interactivo". (Consulte man bashpara obtener más información sobre los tipos de shell). La forma en que ssh maneja las variables de entorno está bien cubierta en los documentos ssh / sshd y las páginas de manual.

Para ssh, que es su propio shell, similar a bash, las variables de entorno para la sesión se almacenan ~/.ssh/environmentcomo el equivalente por usuario de configurarlas para bash o csh, etc. en sus archivos de inicio relevantes. Probablemente sea aquí donde desea establecer sus variables ENV para sus sesiones ssh de usuario, aunque no detalla por qué está buscando asignar ENV globalmente en su publicación original, lo que habría sido útil para proporcionar una solución. Te sugiero que los configures explícitamente en función de cada usuario para mantener la seguridad adecuada basada en cada cuenta respectiva siguiendo la mejor práctica de privilegio / atributo menos restrictivo.

Si por alguna razón desea ignorar las implicaciones de seguridad de esto, configure PermitUserEnvironmentsus configuraciones ssh. Tenga en cuenta que esto está deshabilitado si UseLoginestá habilitado. IMPORTANTE: Tenga en cuenta que esto significa que las cuentas de usuario configuradas para usar /bin/falsecomo su shell, el método típico para deshabilitar una cuenta de usuario, ahora pueden sortear esta restricción y ahora podrían activarse, lo cual es peligroso. Muchas cuentas están configuradas para usarse /bin/falsecomo su shell como expectativa de seguridad.

En pocas palabras, no debería estar haciendo esto globalmente y esperar que ssh propague ENV por razones de seguridad. Su pregunta es, efectivamente, preguntando a propósito cómo derrotar varios mecanismos que existen por razones de seguridad.


respuesta muy detallada (+10) Me gusta la conclusión también :) ¡Bienvenido!
Ruskes

Sugeriría que con la advertencia de seguridad, puede haber razones válidas para hacerlo. Todo depende de su modelo de amenaza. Si está configurando un grupo de máquinas de automatización de pruebas, podría tener sentido hacerlo.
uchuugaka

2
De acuerdo con stackoverflow.com/a/26311753/1081043 , /etc/launchd.confya no funciona a partir de OSX 10.10 Yosemite.
wisbucky

10

Si está utilizando bash, la configuración de las variables de entorno /etc/profilese aplicará a todos los usuarios.

Del bashmanual sobre OS X Mavericks , con mi énfasis (esto no ha cambiado desde versiones anteriores):

Cuando se invoca bash como un shell de inicio de sesión interactivo o como un shell no interactivo con la opción --login, primero lee y ejecuta comandos del archivo / etc / profile, si ese archivo existe. Después de leer ese archivo, busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos del primero que existe y es legible.
...
Si se invoca bash con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más fielmente posible, a la vez que se ajusta al estándar POSIX. Cuando se invoca como un shell de inicio de sesión activo interactivo interactivo, o un shell no interactivo con la opción --login, primero intenta leer y ejecutar comandos desde / etc / profile y ~ / .profile, en ese orden.


5

Lo que usted (y cualquier otra persona que encuentre esta pregunta) seguramente está buscando es la siguiente ruta:

/private/etc/paths

Siempre puede colocar sus ediciones en el /private/etc/paths.dsi desea evitar cambiar el documento de configuración de "rutas" predeterminado del sistema principal, pero luego se agregarán al final de su $PATHvariable, por lo que si desea agregar directorios al frente de $PATH(para anular las utilidades predeterminadas del sistema, por ejemplo), solo tendrá que editar el /private/etc/pathsarchivo principal y agregarlos al principio de la lista. Por ejemplo, hago esto para una carpeta en la que almaceno un puñado de scripts que hice yo mismo, junto con algunas utilidades clave, comomozjpeg, que quiero que el sistema siempre use en lugar de los valores predeterminados con los que viene (de esa manera, todos los archivos jpeg guardados por prácticamente cualquier programa se comprimen automáticamente hasta en un 10% más de lo que la utilidad cjpeg del sistema normal los comprimiría - I ' He leído que la razón por la cual no es predeterminada en la mayoría de los sistemas es porque es mucho más lenta, pero cuando se habla de algo así como 0.14 segundos en lugar de 0.02 segundos, "más lento en un factor de 7" realmente no significa mucho de cualquier cosa ... suponiendo que esto no sea un servidor, por supuesto). Sé que mucha gente probablemente advertirá sobre el "peligro" potencial de realizar ediciones tan profundas en el sistema, pero diría que si está buscando una respuesta como esta, probablemente sepa lo suficiente para lidiar con cualquier nombre de utilidad conflictos que puedan surgir en el futuro,/private/etc/pathsrealmente los propaga a todos los usuarios / inicios de sesión / instancias posibles: todos los programas, shells, etc. utilizarán las rutas en ese archivo para construir la base de su $PATHvariable.

Para ser sincero, estoy bastante sorprendido de que nadie más haya mencionado esto todavía. Todo ese problema con el lanzamiento y las distracciones sobre los usos específicos de SSH ... esta es la solución que cualquiera que esté buscando este problema básico realmente está buscando: la solución limpia, directa al origen y siempre en funcionamiento.

Por cierto, en caso de que se lo pregunte, en OS X /etces simplemente un enlace simbólico /private/etc, por lo que podría hacerlo fácilmente sudo nano /etc/pathsy llegar al mismo lugar exacto. La ruta anterior es solo la ruta real completa del archivo.


2
A menos que me falte algo, eso establecerá solo una variable de entorno de todo el sistema - $PATH. El OP parece estar buscando una solución genérica: configurar cualquier entorno, todo el sistema, por ejemplo $EDITOR, etc.
John N

Incluso con el sudocomando, en macOS Sierra, obtengo permiso denegado si intento crear, usando echoun nuevo archivo que /private/etc/paths.dcontiene una adición a la ruta. Pero funciona para crear primero el archivo y luego usarlo sudo mvpara moverlo /private/etc/paths.d.
Murray

Esto ayudó Otros directorios se estaban anteponiendo a mi PATH a pesar de establecer $ PATH en mi ~/.zshrc... el culpable era /private/etc/pathsy tuve que actualizar este archivo. Gracias.
ser

1

Tuve un problema similar, específicamente ~/.bashrcno se originó cuando me conecté a mi máquina a través de SSH. Descubrí que cambiar una configuración de configuración para SSHd hizo el truco. ¿Quizás tu problema también esté en el demonio SSH?

Modifique el archivo de configuración del servicio SSH de la siguiente manera:

# /etc/sshd_config
PermitUserEnvironment yes

Luego, reinicie el servicio de Inicio de sesión remoto en Preferencias del sistema> Compartir.

Desde la página del sshd_configmanual:

 PermitUserEnvironment
         Specifies whether ~/.ssh/environment and environment= options in
         ~/.ssh/authorized_keys are processed by sshd(8).  The default is
         ``no''.  Enabling environment processing may enable users to
         bypass access restrictions in some configurations using mecha-
         nisms such as LD_PRELOAD.

(En caso de que ayude, he escrito cómo probé esto en mi wiki personal )


1

Si otros buscan cómo establecer variables de entorno para procesos iniciados desde una sesión de inicio de sesión gráfica normal, puede usarla /etc/launchd.conf. Para, por ejemplo, agregar /usr/local/bina la ruta predeterminada, ejecute

echo setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin|sudo tee -a /etc/launchd.conf

y reinicie para aplicar los cambios. Otra forma de aplicar los cambios es ejecutar launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.confy relanzar procesos.


/etc/launchd.conf ya no se usa en launchd.
uchuugaka

2
/etc/launchd.confya no es compatible desde OSX 10.10 Yosemite
wisbucky

0

Hmm ... A partir de Mac OS X 10.10.5 y probablemente anterior, man -s5 launchd.confnos dice: " launchd.conf is no longer respected by the system." Tengo demasiadas cosas en este momento para poner una variable ficticia en el archivo y reiniciar para ver si realmente funciona o no después todo, pero la documentación dice que no debería funcionar.

Estoy bastante seguro de que no lo hará. Haz man launchctly verás: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations."

Lo que puede hacer es poner todas las variables de entorno que desea que sean globales en algún archivo, tal vez llamado environmentde acuerdo con Linux, o (en caso de que Apple decida hacer algo con eso más tarde, nunca se sabe) environment.conf, como lo hice yo, luego obtenga esto a través de /etc/profile:

if [ -f /etc/environment.conf ]; then
   source /etc/environment.conf
fi

o, si prefiere el formato compacto:

if [ -f /etc/environment.conf ]; then . /etc/environment.conf; fi

Si usa otro shell que no sea bash, y usa la misma sintaxis de configuración de variables que bash (al igual que zsh, creo), también necesitará obtener este archivo del archivo rc de todo el sistema de ese shell (por ejemplo /etc/zshrc). Si usa un shell que usa una sintaxis diferente, por ejemplo, tcsh, deberá mantener un archivo similar para ese shell y obtenerlo del archivo rc de todo el sistema del shell (por ejemplo, /etc/csh.cshrcpara tcsh), o mejor aún crear un script eso lo genera automáticamente, por lo que solo tiene que editar un archivo para agregar / cambiar variables. Este no es el lugar para tal tutorial; unos segundos en Google descubrieron cómo convertir [t] exportaciones de variables csh a sintaxis bash, en https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -set-the-enviroment, por lo que probablemente haya algo disponible para ir en la otra dirección.

Según mi experiencia, Mac OS X se está alejando cada vez más del comportamiento predecible de los archivos rc. A partir de al menos 10,8, ya no parece cargar /etc/rc.common, /etc/rc.confo /etc/rc.<anything>, ni (por lo menos desde 10,9) va a cargar /etc/bash.bashrcen los depósitos sin inicio de sesión interactivos (que sin duda debería estar haciendo, al igual que carga ~/.bashrcpara ellos, todavía, a partir de 10.10) . Por otra parte, tengo Fink, MacPorts y Homebrew, todos instalando cosas, por lo que tal vez uno de ellos está interfiriendo con el comportamiento predeterminado de los archivos de puntos. YMMV.


La pregunta es para OS X anterior, habrá otros, por ejemplo, apple.stackexchange.com/questions/215932/… para más adelante
user151019

Mi publicación se dirigió tanto a Mavericks (10.9) en parte como a 10.10 en parte. Si su punto es que 10.10 es un tema verboten completamente en un hilo sobre 10.9, no estoy seguro de por qué me dirigió a un hilo 10.11, donde 10.10 también estaría fuera de tema (si el hilo en cuestión no fuera inválido y cerrado de todos modos). Jajaja
S. McCandlish
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.