Как мне установить $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 в интерактивном режиме проверяет эти файлы и использует первый из существующих в следующем порядке:
~/.bash_profile
~/.bash_login
~/.profile
Так что если у вас есть ~/.bash_profile
то все изменения, которые вы делаете для ~/.profile
останется невидимым
Bash в неинтерактивном режиме иногда читает файл ~/.bashrc
(который также часто исходит из интерактивных сценариев.) Под "иногда" я подразумеваю, что это зависит от распределения: как ни странно, есть опция времени компиляции для включения этого. Debian включает ~/.bashrc
чтение, в то время как, например, Arch не делает.
ssh
кажется, использует неинтерактивный режим, так ~/.bashrc
должно быть достаточно. Когда возникают такие проблемы, я обычно добавляю несколько эхо, чтобы увидеть, какие файлы запускаются.
Документация SSH гласит:
Если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему.
именно поэтому добавление в файлы bashrc не работает. однако у вас есть следующие варианты:
Если
PermitUserEnvironment
опция установлена в конфигурации sshd, вы можете добавить настройки PATH в~/.ssh/environment
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