Установите PATH при SSH-подключении к MacOS

Установите PATH при SSH-подключении к MacOS

Моя проблема в том,

$ ssh localhost fswatch          
bash: fswatch: command not found

когда без команды SSH (т.е. fswatch) работает нормально.

Я обнаружил, что PATH в сеансе SSH является значением по умолчанию для Mac.

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

так как без SSH

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

Я действительно не помню, как я настроил PATH, но уверен, ~/.bashrcи ~/.bash_profileне редактировал переменную PATH. Есть файл конфигурации /etc/paths:

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

Homebrew, npm, pip обычно устанавливают программы в /usr/local/bin, поэтому все установленные программы там, и я не могу получить к ним доступ через ssh localhost commandмой MacOS. С Linux проблем нет.

Итак, мой вопрос:как настроить OpenSSH для использования PATH из /etc/pathsи/etc/paths.d?

Я также пытался взломать:

$ 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

первая строка всегда пустая, не знаете почему?

И мой последний обходной путь

$ 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.

Здесь first :;важен, потому что первая команда каким-то образом исключается из выполнения

Система: 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)

решение1

Вы можете настроить сервер SSH, чтобы предоставить клиентам настраиваемую среду, включая пользовательскую PATHпеременную. Вам нужно будет настроить 2 вещи:

  1. ~/.ssh/environmentСоздайте на сервере файл, содержащий следующее:

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  2. Измените файл конфигурации сервера SSH /private/etc/ssh/sshd_config, включив в него следующую строку:

    PermitUserEnvironment PATH,LANG
    

Наконец, перезапустите/перезагрузите демон SSH на сервере. Клиенты входа по SSH должны иметь доступ к вашей настроенной среде!

решение2

В моей системе я могу просто отредактировать .bashrcи поместить этона самом верху:

PATH=/my/path:$PATH

Важно поставить его перед:

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

решение3

В своем ответе я предполагаю, что вы используете Bourne Again SHell, но следующее справедливо и для большинства других оболочек:

Причина наблюдаемого поведения в том, что ваша команда будет выполняться не в интерактивной, а в неинтерактивной оболочке:

Когда сервер принимает идентификацию пользователя, сервер либо выполняет заданную команду в неинтерактивном сеансе, либо, если команда не указана, входит в систему и предоставляет пользователю обычную оболочку в качестве интерактивного сеанса. Все коммуникации с удаленной командой или оболочкой будут автоматически зашифрованы.

-$ man ssh

Я подозреваю, что где-то внутри .bashrcвы расширяете свою PATHпеременную. Но BASH не будет интерпретировать ваш .bashrcфайл, если вы не запустите интерактивную оболочку:

Когдазапускается интерактивная оболочка, не являющаяся оболочкой входа, bash считывает и выполняет команды из /etc/bash.bashrc и ~/.bashrc, если эти файлы существуют.

-$ man bash

Поэтому самое простое решение этой проблемы — просто указать полный путь к исполняемому файлу, например: $ ssh localhost /full/path/to/fswatchЭто самое стабильное и безопасное решение этой проблемы, и оно всегда будет работать!

При подключении localhostвы можете использовать whichкоманду: $ ssh localhost $(which fswatch). Однако это, скорее всего, не сработает, если вы подключитесь к другому хосту.

Другим возможным способом было бы манипулирование PATHпеременной окружения удаленного хоста для неинтерактивных оболочек (см. ответ @hedgie). Однако это создает проблемы безопасности и поэтому не должно использоваться в производстве:

Включение обработки среды может позволить пользователям обходить ограничения доступа в некоторых конфигурациях с помощью таких механизмов, как LD_PRELOAD.

-man sshd_config

Связанный контент