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 ~/.bashrc
y ~/.bash_profile
no 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 command
en mi MacOS. No hay ningún problema con Linux.
Entonces mi pregunta escómo configurar OpenSSH para usar PATH desde /etc/paths
y/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 PATH
variable personalizada. Necesitarás configurar 2 cosas:
Cree el archivo
~/.ssh/environment
en el servidor que contenga lo siguiente:PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Cambie el archivo de configuración del servidor SSH
/private/etc/ssh/sshd_config
para 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 .bashrc
y 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 .bashrc
extiendes tu PATH
variable. Pero BASH no interpretará su .bashrc
archivo 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, localhost
puedes aprovechar el which
comando: $ 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 PATH
variable 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