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

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

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

  • Es necesario crear una preference de Experiencia de usuario para "Crear count mobile al iniciar session"
  • Traceroute Terminal vs Network Utility diferente?
  • ¿Cómo puedo encontrar dónde se estableció una variable ambiental?
  • No se puede ejecutar vi desde la terminal
  • Bash commands que funcionan en un iphone
  • bash: Buscando con ls
  •  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 'windowed', es decir, funciona en Terminal, pero no en una session ssh.

    • ~/.profile , ~/.bash_profile etc.

      Solo se aplica a las conchas

    ¿Alguna sugerencia?

  • No se puede encontrar el script de shell personalizado
  • Cómo utilizar el process nohup / send al background en os / x
  • ¿Cómo encontrar .bashrc o .zshrc?
  • Cómo restablecer $ PATH?
  • Cambiar la image de background a través de la terminal en macOS Sierra
  • ¿Cómo puedo crear bash_profile y bashrc
  • 6 Solutions collect form web for “Cómo establecer variables de entorno de todo el sistema en OS X Mavericks”

    El file 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 en /etc/launchd.conf para aplicarlo a todos los processs; si se trata de shells de usuario específicamente, use los files de shell apropiados en su lugar, según el shell en cuestión. Consulte las páginas man launchd.conf y launchctl para get más información.

    Eso dijo …

    Si su objective es específicamente ver que esto se aplique a las sesiones ssh, entonces debe tener en count que ssh, por razones de security, no aplica variables de entorno de esta manera. De hecho, una session ssh normalmente recibe un set mucho más restrictivo de variables de entorno del sistema operativo, ya que no es lo que se conoce como shell "de inicio de session" o "interactivo", sino que se clasifica como un shell "no interactivo". (Consulte man bash para get más información sobre los types de shell.) La forma en que ssh maneja las variables de entorno está bien cubierta en los documentos ssh / sshd y en las páginas man.

    Para ssh, que es su propio shell, parecido a bash, las variables de entorno para la session se almacenan en ~/.ssh/environment como el equivalente por usuario de configurarlas para bash o csh, etc. en sus files de inicio relevantes. Probablemente este sea el lugar donde desee establecer sus variables ENV para las sesiones ssh de su usuario, aunque no detalla por qué desea asignar ENV globalmente en su publicación original, lo que hubiera sido útil para proporcionar una solución. Sugiero que los establezcas explícitamente en function del usuario por usuario para mantener la security adecuada en function de cada count respectiva siguiendo las prácticas recomendadas de privilegio / atributo less restrictivas.

    Si por alguna razón desea ignorar las implicaciones de security de esto, configure PermitUserEnvironment en sus configuraciones ssh. Tenga en count que esto está deshabilitado si UseLogin está habilitado. IMPORTANTE: Tenga en count que esto significa que las counts de usuario configuradas para usar /bin/false como shell, el método típico para deshabilitar una count de usuario, ahora pueden evitar esta restricción y ahora pueden activarse, lo cual es peligroso. Muchas counts están configuradas para usar /bin/false como su shell como una expectativa de security.

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

    Si está utilizando bash , entonces la configuration de las variables de entorno en /etc/profile se aplicará a todos los usuarios.

    Desde el manual bash en OS X Mavericks , con mi énfasis (esto no ha cambiado desde versiones anteriores):

    Cuando bash se invoca como un shell de inicio de session interactivo o como un shell no interactivo con la opción –login, primero lee y ejecuta commands desde el file / etc / profile, si ese file existe. Después de leer ese file, busca ~ / .bash_profile, ~ / .bash_login, y ~ / .profile, en ese order, y lee y ejecuta commands del primero que existe y que es legible.

    Si bash se invoca con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más cerca posible, al mismo time que se ajusta al estándar POSIX. Cuando se invoca como un shell de inicio de session interactivo interactivo, o un shell no interactivo con la opción –login, primero intenta leer y ejecutar commands desde / etc / profile y ~ / .profile, en ese order.

    Tuve un problema similar, específicamente ~/.bashrc no se estaba obteniendo cuando me conecté a mi máquina a través de SSH. Descubrí que cambiar el ajuste de configuration para SSHd fue el truco. Tal vez su problema también se encuentra con el daemon SSH?

    Modifique el file de configuration del service SSH de la siguiente manera:

     # /etc/sshd_config PermitUserEnvironment yes 

    A continuación, reinicie el service de inicio de session remoto en Preferences del sistema> Compartir.

    Desde la página de manual de sshd_config :

      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, escribí cómo probé esto en mi wiki personal )

    Si otros buscan cómo establecer variables de entorno para processs iniciados desde una session de inicio de session gráfica normal, puede usar /etc/launchd.conf . Para, por ejemplo, agregar /usr/local/bin a la ruta pnetworkingeterminada, ejecutar

     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.conf y launchctl</etc/launchd.conf;sudo launchctl</etc/launchd.conf processs.

    Lo que usted (y cualquier otra persona que encuentre esta pregunta) casi seguramente buscan es la siguiente ruta:

     /private/etc/paths 

    Siempre puede poner sus ediciones en /private/etc/paths.d si desea evitar cambiar el documento de configuration de "routes" pnetworkingeterminadas del sistema principal, pero luego se agregarán al final de su variable $PATH , por lo que si desea agregar directorys al frente de $PATH (para anular las utilidades pnetworkingeterminadas del sistema, por ejemplo), solo tendrá que editar el file main /private/etc/paths y agregarlos a la parte superior de la list. Por ejemplo, hago esto para una carpeta en la que almaceno un puñado de scripts que hice yo mismo, junto con algunas utilidades key, como mozjpeg , que quiero que el sistema use siempre en lugar de los valores pnetworkingeterminados que viene (de esa manera todos los files jpeg guardados por casi cualquier progtwig se comprimen automáticamente hasta en un 10% más de lo que la utilidad regular del sistema cjpeg los comprimiría; he leído que la razón por la que no está pnetworkingeterminada en la mayoría de los sistemas es porque es mucho más lenta, pero cuando estás hablando algo así como 0.14 segundos en vez de 0.02 segundos, el "más lento por un factor de 7" realmente no significa mucho de nada … asumiendo que este no es un server, por supuesto). Sé que muchas personas probablemente advertirán sobre el posible "peligro" de realizar ediciones tan profundamente en el sistema, pero diría que si está buscando una respuesta como esta, probablemente sepa lo suficiente como para ocuparse de cualquier nombramiento de utilidad. conflictos que pueden popup en el futuro, y simplemente hacer que los cambios en /private/etc/paths realmente los propaguen a todos los usuarios / inicios de session / instancias posibles – todos los progtwigs, shells, etc. usarán las routes en ese file para build el base de su variable $PATH .

    Para ser sincero, estoy bastante sorprendido de que nadie más haya mencionado esto todavía. Todo ese lío con el lanzamiento y las distracciones acerca de los usos específicos de SSH … esta es la solución que realmente busca alguien que busca este tema básico: la solución limpia, directa a la fuente y siempre funcional.

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

    Hmm … A partir de Mac OS X 10.10.5 y probablemente antes, man -s5 launchd.conf nos dice: " launchd.conf is no longer respected by the system. " Tengo demasiadas cosas pasando ahora mismo para poner un variable ficticia en el file y reiniciar para ver si realmente funciona o no, después de todo, pero la documentation dice que no debería funcionar.

    Estoy bastante seguro de que no será así. man launchctl y verá: " The /etc/launchd.conf file is no longer consulted for subcommands to run during early boot time; this functionality was removed for security considerations. " 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 puedes hacer es poner todas las variables de entorno que quieras que sean globales en algún file, tal vez llamado environment de acuerdo con Linux, o (en caso de que Apple decida hacer algo con eso más tarde, nunca lo sepas) environment.conf , como lo hice, luego fuente esto a través de /etc/profile :

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

    o, si prefiere el formatting compacto:

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

    Si usa algún otro shell que bash, y usa la misma syntax de configuration de variables que bash (como lo hace zsh, creo), necesitará también get este file del file rc de todo el sistema de ese shell (por ejemplo, /etc/zshrc ). Si usa un shell que usa una syntax diferente, por ejemplo, tcsh, necesitará mantener un file similar para ese shell y /etc/csh.cshrc file rc de todo el sistema del shell (por ejemplo, /etc/csh.cshrc para tcsh), o mejor aún, crea una secuencia de commands que la autogenera, por lo que solo tienes que editar un file para agregar / cambiar variables. Este no es el lugar para tal tutorial; unos segundos en Google aparecieron cómo convertir [t] las exportaciones de la variable csh a la syntax de bash, en https://stackoverflow.com/questions/2710790/how-to-source-a-csh-script-in-bash-to -configurar-el-ambiente , por lo que probablemente haya algo disponible para ir en la otra dirección.

    Según mi experiencia, Mac OS X se aleja cada vez más del comportamiento pnetworkingecible de los files rc. Desde al less 10.8, ya no parece cargar /etc/rc.common , /etc/rc.conf o /etc/rc.<anything> , ni (al less 10.9) cargará /etc/bash.bashrc bashrc para shells interactivos non-login (lo cual ciertamente debería estar haciendo, al igual que carga ~/.bashrc para ellos, aún así, a partir de 10.10). Por otra parte, tengo Fink, MacPorts y Homebrew instalando todo, por lo que tal vez uno de ellos interfiera con el comportamiento del file par pnetworkingeterminado. YMMV.

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).