Как мне установить $PATH таким образом, чтобы `ssh user@host command` работал?

Я не могу установить новый $PATH таким образом, чтобы он использовался при выполнении команд через ssh user@host command, Я пробовал добавлять export PATH=$PATH:$HOME/new_path в ~ /.bashrc и ~ /.profile на удаленной машине, но с выполнением ssh user@host "echo \$PATH" показывает, что изменение не было получено (показывает /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games). Удаленный компьютер работает под управлением Ubuntu 8.04.

Я уверен, что смогу взломать его в / etc / profile, но это не чистое решение, и оно работает, только если у вас есть root-доступ.

6 ответов

Решение

Как сказал Grawity, ~/.bashrc - это то, что вам нужно, поскольку он получен из неинтерактивных оболочек без входа в систему.

Я ожидаю, что ваша проблема связана с файлом Ubuntu ~/.bashrc по умолчанию. Обычно это начинается примерно так:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Вы хотите поместить что-нибудь для неинтерактивных оболочек перед этой строкой.

У тебя есть ~/.bash_login или же ~/.bash_profile?

Bash в интерактивном режиме проверяет эти файлы и использует первый из существующих в следующем порядке:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Так что если у вас есть ~/.bash_profileто все изменения, которые вы делаете для ~/.profile останется невидимым

Bash в неинтерактивном режиме иногда читает файл ~/.bashrc (который также часто исходит из интерактивных сценариев.) Под "иногда" я подразумеваю, что это зависит от распределения: как ни странно, есть опция времени компиляции для включения этого. Debian включает ~/.bashrc чтение, в то время как, например, Arch не делает.

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

Документация SSH гласит:

Если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему.

именно поэтому добавление в файлы bashrc не работает. однако у вас есть следующие варианты:

  1. Если PermitUserEnvironment опция установлена ​​в конфигурации sshd, вы можете добавить настройки PATH в ~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'

Вы всегда можете сказать:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

В дополнение к ответу @signpolyma, вам придется добавить свой экспорт до этих строк

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Просто у меня была такая же проблема, решил ее с помощью:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Другие вопросы по тегам