Meu problema é
$ ssh localhost fswatch
bash: fswatch: command not found
quando sem comando SSH (ou seja, fswatch) funciona bem.
Descobri que PATH na sessão SSH é o padrão do Mac
$ ssh localhost echo \$PATH
/usr/bin:/bin:/usr/sbin:/sbin
já que sem SSH
$ echo $PATH
/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Eu realmente não me lembro como configurei o PATH, mas com certeza ~/.bashrc
não ~/.bash_profile
edito a variável PATH. Existe um arquivo de configuração /etc/paths
:
$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
Homebrew, npm, pip geralmente instalam programas /usr/local/bin
, então todos os programas instalados estão lá e não consigo acessá-los ssh localhost command
no meu MacOS. Não há problema com o Linux.
Então minha pergunta écomo configurar o OpenSSH para usar PATHs de /etc/paths
e/etc/paths.d?
Eu também tentei 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
a primeira linha está sempre vazia, você não sabe por quê?
E minha solução 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.
Aqui, o primeiro :;
é importante porque o primeiro comando é de alguma forma retirado da execução
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)
Responder1
Você pode configurar o servidor SSH para fornecer aos clientes um ambiente customizado, incluindo uma PATH
variável customizada. Você precisará configurar 2 coisas:
Crie o arquivo
~/.ssh/environment
no servidor contendo o seguinte:PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Altere o arquivo de configuração do servidor SSH
/private/etc/ssh/sshd_config
para incluir a seguinte linha:PermitUserEnvironment PATH,LANG
Finalmente, reinicie/recarregue o daemon SSH no servidor. Os clientes de login SSH devem ter acesso ao seu ambiente customizado!
Responder2
No meu sistema posso apenas editar .bashrc
e colocar issobem no topo:
PATH=/my/path:$PATH
É importante colocar isso antes:
# If not running interactively, skip the rest
[ -z "$PS1" ] && return
Responder3
Para minha resposta, presumo que você esteja usando o Bourne Again SHell, mas o seguinte também se aplica à maioria dos outros shells:
A razão para o comportamento observado é que seu comando não será executado em um shell interativo, mas não interativo:
Quando a identidade do usuário for aceita pelo servidor, o servidor executa o comando fornecido em uma sessão não interativa ou, se nenhum comando tiver sido especificado, efetua login na máquina e fornece ao usuário um shell normal como uma sessão interativa. Toda a comunicação com o comando remoto ou shell será criptografada automaticamente.
-$ man ssh
Eu suspeito que em algum lugar dentro de você .bashrc
você estenda sua PATH
variável. Mas o BASH não interpretará seu .bashrc
arquivo se você não executar um shell interativo:
Quandoum shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de /etc/bash.bashrc e ~/.bashrc, se esses arquivos existirem.
-$ man bash
Portanto, a solução mais fácil para este problema é apenas fornecer o caminho completo para o executável, como: $ ssh localhost /full/path/to/fswatch
Esta é a solução mais estável e segura para este problema e sempre funcionará!
Ao se conectar, localhost
você pode aproveitar o which
comando: $ ssh localhost $(which fswatch)
. No entanto, isso provavelmente não funcionará quando você se conectar a outro host.
Outra maneira possível seria manipular a PATH
variável de ambiente do host remoto para shells não interativos (veja a resposta de @hedgie). No entanto, isto apresenta implicações de segurança e, portanto, não deve ser utilizado na produção:
A ativação do processamento do ambiente pode permitir que os usuários ignorem as restrições de acesso em algumas configurações usando mecanismos como LD_PRELOAD.
-man sshd_config