Моя проблема в том,
$ 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 вещи:
~/.ssh/environment
Создайте на сервере файл, содержащий следующее:PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Измените файл конфигурации сервера 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