~/.profile не загружается при использовании SSH (Ubuntu)
Отредактировано, чтобы отразить проблему, которую я действительно хотел решить:
Мне нужно настроить свою среду ruby, чтобы я мог развернуть ее через Capistrano.
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
Я помещаю их в ~ deploy /.profile, но когда я запускаю ssh, они не запускаются. Идеи?
Я использую Ubuntu 12.04.
Первоначальный вопрос был:
Когда я захожу в другой аккаунт на localhost, он не загружает мой.profile. Как я могу заставить ssh загрузить его? Я использую Ubuntu 12.04.
8 ответов
Вы можете явно указать, что хотите запустить интерактивную оболочку входа в систему:
ssh user@host bash --login -i
"Роль" ~/.profile (или ~./bash_profile) и .bashrc для SSH есть другие файлы,
(см. man ssh для деталей):
~ /.Ssh / окружающая среда
Содержит дополнительные определения для переменных среды; см. ОКРУЖАЮЩАЯ СРЕДА, выше.
~ /.Ssh / гс
Команды в этом файле выполняются ssh, когда пользователь входит в систему, непосредственно перед запуском оболочки пользователя (или команды). Для получения дополнительной информации см. Справочную страницу sshd(8).
.profile загружается только для оболочек входа в систему, которых нет в сеансе ssh (по умолчанию). Если вы хотите, чтобы что-то запускалось при запуске для всех интерактивных оболочек, поместите это в .bashrc вместо (или .zshrc или то, что использует ваша оболочка).
Кроме того, если вы просто хотите войти в другую учетную запись на локальном компьютере, ssh, вероятно, излишне. Вы можете использовать su или что-то вместо этого.
Использование Bash должно привести к чтению ~/.bashrc , Следующее может помочь с ksh и sh (bash в режиме sh), или когда ваш ~/.bashrc не выполняется во время входа в систему.
Sshd консультируется ~/.ssh/environment (проверьте sshd_config (5) для разрешений) и ~/.ssh/sshrc или же ~/.ssh/rc , Это дает возможность настроить ENV=~/.profile или же BASH_ENV=~/.profile а также SSH_LOGIN=Y
В ~/.profile У меня есть следующий макет (Заменить ENV с BASH_ENV при использовании bash):
if [[ -n $SSH_LOGIN || -z $ENV ]]; then
# Put here login initialization code
unset SSH_LOGIN
ENV=~/.profile
fi
# Put here code thats get executed with each ksh/sh invocation
У вас наверное есть ~/.bash_profile, который переопределяет ~/.profile,
Баш читает ~/.profile только когда это оболочка входа в систему и ~/.bash.bashrc только если он имеет терминал, ни один из которых не является истинным по умолчанию при вызове команды с помощью ssh. Однако, есть несколько других опций для установки среды на сервере, но, к сожалению, все зависит от настроек системы:
- Зш читает
~/.zshenvдаже в этом случае; нет соответствующего конфигурационного файла для bash. - Если
PermitUserEnvironmentопция включена в/etc/sshd_configssh прочитает~/.ssh/environment, К сожалению, эта опция по умолчанию отключена. - Если
pam_env.soназывается сuser_readenv=1в/etc/pam.d/sshdбудет читать~/.pam_environment, Хотя это не модуль по умолчанию, он называется так, по крайней мере, в Ubuntu. - Если ничего не помогает, вы можете положить
command=директива в файле авторизованных ключей, вызывающая скрипт-обертку, который устанавливает среду и выполняет$SSH_ORIGINAL_COMMANDв конце (у меня команда для оболочки, так что здесь уместно использовать eval, но я не уверен).
Из вопроса неясно, подключаетесь ли вы по ssh к учетной записи пользователя развертывания и выполняете команды:
ssh deploy@myhost
... или если вы используете ssh для запуска команды от имени пользователя развертывания:
ssh deploy@myhost my-command-to-run
Если я вошел в систему и:
earl@myhost:~$ echo $PATH
/home/earl/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Он отображается в начале моего, потому что я установил его в свой файл.
Если я подключусь к другому пользователю на той же машине:
earl@myhost:~$ ssh deploy@myhost
deploy@myhost:~$ echo $PATH
/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Теперь для входа используетсяPATHдля пользователя, потому что я использую интерактивную оболочку входа в систему ssh. Он получает настройку PATH из файла развертывания, который не содержит/home/earl/bin.
Однако, если бы я просто набрал:
earl@myhost:~$ ssh deploy@myhost ./run-commands.sh
ssh подключится к учетной записи пользователя на том же хосте и запустит./run-commands.shскрипт, но ssh не будет использовать оболочку входа и ни одна из настроек среды в пользовательском файле.~/.profileили~/.bashrcили~/.bash_profileфайлы будут выполнены, потому что ssh просто запускает команду, а не запускает оболочку.
Если вы пытаетесь использовать ssh в интерактивном режиме и не запускается, вы, вероятно, установили оболочку, которая не существует, или оболочку, которая не использует.profileфайлы. Пытаться:
earl@myhost:~$ ssh deploy@myhost
deploy@myhost:~$ ps -p $$
... чтобы узнать, какая оболочкаdeployпользователь использует.
Если вы пытаетесь использовать ssh для запуска команды, создайтеrun-commands.shсценарий оболочки, добавьте:
source ~/.profile
... в начало сценария оболочки, за которым следуют команды, которые вы хотите выполнить, а затемssh deploy@myhost ./run-commands.shдолжно сработать.
ssh localhost 'echo $MyEnv'
ssh с командой попытается получить $BASH_ENV в соответствии с руководством по gnu bash, потому что я думаю, что это неинтерактивная оболочка.
https://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files
Если у вас есть root-доступ, вы можете поместить переменные среды в/etc/environment. Таким образом, они устанавливаются независимо от того, какую оболочку или тип входа вы используете.