1 votos

Establecer variable de entorno para toda la sesión GUI (Aka sin usar `~/.zshenv`)

(EDITADO EL 06/02/2023 : El título anterior era Las variables establecidas con launchctl setenv no forman parte del entorno en Mac OS 12 )

Soy un usuario diario de Linux y decidí probar Mac recientemente. Tengo un Macbook pro 13" principios de 2015 que actualmente ejecuta MacOS Monterey (12.6.3).

Estoy luchando desde hace unos días para configurar SSH_AUTH_SOCK variable de entorno para toda mi sesión

Me basé en el siguiente archivo plist en $HOME/Library/LaunchAgents/ :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.mooltipass.mc-agent</string>

    <key>RunAtLoad</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/tmp/mc-agent.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/mc-agent.err</string>
    <key>Debug</key>
    <true/>

    <key>ProgramArguments</key>
    <array>
        <string>/opt/local/bin/mc-agent</string>
        <string>-n</string>
        <string>--address=/tmp/moolticute-ssh-agent.sock</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>AUTH_SSH_SOCK</key>
        <string>/tmp/moolticute-ssh-agent.sock</string>
        <key>TOTO</key>
        <string>test</string>
    </dict>
</dict>
</plist>

A continuación, activo el agente mediante launchctl bootstrap gui/501/com.moolticute.mc-agent (o algo parecido, no recuerdo bien) y reiniciar mi sesión.

El binario mc-agent está funcionando como se esperaba pero:

  • cuando compruebo SSH_AUTH_SOCK todavía contiene el valor por defecto, no el que ha sido suplantado por mi script.
  • cuando corro virt-manager (que hacen uso de esta variable) desde el Launchpad, obviamente no tiene el valor correcto.
  • cuando corro launchctl getenv SSH_AUTH_SOCK el valor de la variable es el esperado.

¿me he perdido algo?

06/02/2023 : EDICIÓN PARA ACLARACIONES

Después de la primera respuesta, que es correcta pero no satisface mis necesidades, me di cuenta de que mi pregunta no era lo suficientemente clara.

Al final, quiero imitar el comportamiento de regular ssh-agent . En la instalación de MacOS sin procesar, ssh-agent se lanza utilizando un plist al iniciar la sesión GUI, fuera de cualquier shell.

Quiero que mi agente se ejecute al inicio de la sesión GUI y que la variable de entorno se establezca para toda la sesión, dentro o fuera del shell.

El objetivo es, cuando lance virt-manager (que es una aplicación gráfica) directamente desde el finder o launchpad, no se genera ningún shell para lanzarla, virt-manager no heredará la variable establecida en mi .zshenv o .bashrc ¿Verdad? Esto es lo mismo supongo que para cualquier IDE con conectividad git.

Por ejemplo, en Linux, esto se conseguiría modificando Xsession para su DM favorito o utilizando el modo de inicio heredado para xsession y estableciendo un .xinitrd o .Xsession. Entonces, cada variable establecida de esta manera será heredada por cualquier aplicación lanzada desde el gestor de ventanas como parte de su entorno.

He leído este fin de semana varios métodos para hacerlo con launchctl / launchd pero parece que todos ellos dejaron de funcionar en versiones posteriores de MacOS...

1voto

Douglas Puntos 10417

Las variables que se establecen mediante launchd son sólo válido para el sub-shell en el que se ejecuta.

Cuando compruebe SSH_AUTH_SOCK o ejecute virt-manager está abriendo un shell interactivo (a través de Terminal o iTerm) y ese proceso shell no tiene ni idea de qué variables de entorno se establecieron en el shell no interactivo abierto por launchd . Por lo tanto, las variables de entorno no se modifican/desconfiguran como has descubierto.

Si desea que esa variable se propague tanto en el shell interactivo como en los no interactivos, debe establecer el parámetro PATH variable en .zshenv . Ver el post ZSH: .zprofile, .zshrc, .zlogin - ¿Qué va dónde? para más detalles.

Pasar variables a otros shells

Puede utilizar export para pasar variables a sub-shells.

export PATH=“/foo/bar:/hello/world:/acme;road_runner/coyote” 

La variable se "exporta" del shell padre al sub-shell hijo. Sin embargo, como Finder es no una subcáscara del launchd shell ejecutando su script, las variables no serán pasadas.

En Soporte técnico de Apple

Utilizar variables de entorno en Terminal en Mac

Aunque los procesos hijos de un shell heredan el entorno de ese shell, los shells son contextos de ejecución independientes que no comparten información de entorno entre sí. Las variables que se establecen en una ventana de Terminal no se establecen en otras ventanas de Terminal.

Para resolver su problema, debe utilizar .zshenv o .zprofile o .zshrc . Como se trata de una aplicación GUI, puede colocarla en Iniciar sesión y hacer que se inicie dentro de Finder, pero Finder obtiene sus variables establecidas por uno de estos archivos de todos modos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X