3

Я пытаюсь выполнить команду через ssh на сервере под управлением Mac OS 10.9.5 с помощью команды вроде

ssh server.address command

и я получаю ошибку bash: command: command not found .

Когда я вхожу в интерактивную сессию, все работает нормально, и команда находится в /usr/local/bin/command:

$ which command
/usr/local/bin/command

И когда я запрашиваю неинтерактивный путь через ssh от клиента, он включает /usr/local/bin:

$ ssh server.address "echo $PATH"
/Users/me/.rvm/gems/ruby-2.1.10/bin:/Users/me/.rvm/gems/ruby-2.1.10@global/bin:/Users/me/.rvm/rubies/ruby-2.1.10/bin:/Users/me/anaconda3/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/Users/me/.rvm/bin

Поэтому я не уверен, почему он не находит команду (или любую из команд в /usr/local/bin)

Я подозревал, что это из-за этих странных путей в начале $PATH (например, /Users/me/.rvm/gems/ruby-2.1.10@global/bin , но я не могу найти, где они добавляются в Путь в первую очередь. Я проверил ~/.bash_profile и ~/.profile . Эти рубиновые пути также отсутствуют в PATH когда я вхожу в интерактивном режиме.

Я не уверен, куда идти отсюда. Использование полного пути к команде не вариант, потому что она вызывается из другой программы. (Плюс, это обязательно произойдет снова, если я не смогу найти /usr/local/bin на моем пути).

Заранее благодарю за любую помощь!

2 ответа2

1

Так что, по сути, это, насколько я могу судить, дубликат https://serverfault.com/questions/351731/why-does-the-path-of-an-ssh-remote-command-differ-from-that -of-ан-интерактивных-х лет

Со страницы руководства ssh(1): «Если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему».

Короче говоря, когда вы фактически входите в систему, bash запускается как оболочка входа и загружает соответствующие файлы, когда вы подключаетесь удаленно и запускаете команду, она запускается вместо bash, что означает, что эти файлы НЕ загружаются. Вы можете обойти это с помощью su -l -c или аналогичного в командной части ssh.

Простой ответ заключается в использовании полных путей к файлам , а не те , в $ PATH, легко найти с помощью с помощью which

which nano /usr/bin/nano

1
$ ssh server.address "echo $PATH"

возвращает $ PATH вашей локальной оболочки, даже если она написана с удаленной оболочки . Расширение переменной в кавычках выполняется перед отправкой команды на сервер. Чтобы получить удаленный путь, вам нужно использовать

$ ssh server.address 'echo $PATH'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .