Defina PATH quando SSH no MacOS

Defina PATH quando SSH no MacOS

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 ~/.bashrcnão ~/.bash_profileedito 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 commandno meu MacOS. Não há problema com o Linux.

Então minha pergunta écomo configurar o OpenSSH para usar PATHs de /etc/pathse/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 PATHvariável customizada. Você precisará configurar 2 coisas:

  1. Crie o arquivo ~/.ssh/environmentno servidor contendo o seguinte:

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  2. Altere o arquivo de configuração do servidor SSH /private/etc/ssh/sshd_configpara 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 .bashrce 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ê .bashrcvocê estenda sua PATHvariável. Mas o BASH não interpretará seu .bashrcarquivo 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/fswatchEsta é a solução mais estável e segura para este problema e sempre funcionará!

Ao se conectar, localhostvocê pode aproveitar o whichcomando: $ 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 PATHvariá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

informação relacionada