Establecer RUTA cuando SSH en MacOS

Establecer RUTA cuando SSH en MacOS

Mi problema es

$ ssh localhost fswatch          
bash: fswatch: command not found

cuando sin el comando SSH (es decir, fswatch) funciona bien.

Descubrí que la RUTA en la sesión SSH es la predeterminada de Mac

$ ssh localhost echo \$PATH        
/usr/bin:/bin:/usr/sbin:/sbin

ya que sin SSH

$ echo $PATH
/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Realmente no recuerdo cómo configuré la RUTA, pero seguro ~/.bashrcy ~/.bash_profileno edito la variable PATH. Hay un archivo de configuración /etc/paths:

$ cat /etc/paths         
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Homebrew, npm, pip generalmente instalan programas en /usr/local/bin, por lo que todos los programas instalados están allí y no puedo acceder a ellos ssh localhost commanden mi MacOS. No hay ningún problema con Linux.

Entonces mi pregunta escómo configurar OpenSSH para usar PATH desde /etc/pathsy/etc/paths.d?

También intenté hackear:

$ ssh localhost sh -lc 'echo empty;echo $PATH'

/usr/bin:/bin:/usr/sbin:/sbin
$ ssh localhost bash -lc 'echo empty;echo $PATH'

/usr/bin:/bin:/usr/sbin:/sbin

La primera línea siempre está vacía, ¿no sabes por qué?

Y mi solución final

$ ssh localhost bash -lc ':; 
    export PATH="$( cat /etc/paths /etc/paths.d/* | tr \\\\n : )"; 
    echo $PATH; 
    fswatch --version'
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Applications/VMware Fusion.app/Contents/Public
fswatch 1.14.0
Copyright (C) 2013-2018 Enrico M. Crisostomo <[email protected]>.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Enrico M. Crisostomo.

Aquí lo primero :;es importante porque el primer comando de alguna manera se elimina de la ejecución.

Sistema: MacOS Mojave 10.14.5
ssh -V:OpenSSH_7.9p1, LibreSSL 2.7.3
bash --version GNU bash, version 5.0.7(1)-release (x86_64-apple-darwin18.5.0)

Respuesta1

Puede configurar el servidor SSH para brindar a los clientes un entorno personalizado, incluida una PATHvariable personalizada. Necesitarás configurar 2 cosas:

  1. Cree el archivo ~/.ssh/environmenten el servidor que contenga lo siguiente:

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  2. Cambie el archivo de configuración del servidor SSH /private/etc/ssh/sshd_configpara incluir la siguiente línea:

    PermitUserEnvironment PATH,LANG
    

Finalmente, reinicie/recargue el demonio SSH en el servidor. ¡Los clientes de inicio de sesión SSH deberían tener acceso a su entorno personalizado!

Respuesta2

En mi sistema puedo editar .bashrcy poner estoen la cima:

PATH=/my/path:$PATH

Es importante ponerlo antes:

# If not running interactively, skip the rest
[ -z "$PS1" ] && return

Respuesta3

Para mi respuesta, asumo que estás usando Bourne Again SHell, pero lo siguiente también se aplica a la mayoría de los demás shells:

El motivo del comportamiento observado es que su comando no se ejecutará en un shell interactivo sino no interactivo:

Cuando el servidor ha aceptado la identidad del usuario, el servidor ejecuta el comando dado en una sesión no interactiva o, si no se ha especificado ningún comando, inicia sesión en la máquina y le da al usuario un shell normal como una sesión interactiva. Toda la comunicación con el comando remoto o el shell se cifrará automáticamente.

-$ man ssh

Sospecho que en algún lugar dentro de ti .bashrcextiendes tu PATHvariable. Pero BASH no interpretará su .bashrcarchivo si no ejecuta un shell interactivo:

CuandoSe inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos de /etc/bash.bashrc y ~/.bashrc, si estos archivos existen.

-$ man bash

Entonces, la solución más sencilla a este problema es simplemente proporcionar la ruta completa al ejecutable, como: $ ssh localhost /full/path/to/fswatch¡Esta es la solución más estable y segura para este problema y siempre funcionará!

Cuando te conectas, localhostpuedes aprovechar el whichcomando: $ ssh localhost $(which fswatch). Sin embargo, lo más probable es que esto no funcione cuando se conecte a otro host.

Otra forma posible sería manipular la PATHvariable de entorno del host remoto para shells no interactivos (consulte la respuesta de @hedgie). Sin embargo, esto plantea implicaciones de seguridad y, por lo tanto, no debe usarse en producción:

Habilitar el procesamiento del entorno puede permitir a los usuarios evitar las restricciones de acceso en algunas configuraciones utilizando mecanismos como LD_PRELOAD.

-man sshd_config

información relacionada