~ / .profile не загружается при использовании SSH (Ubuntu)

22

Отредактировано, чтобы отразить проблему, которую я действительно хотел решить:

Мне нужно настроить свою среду ruby, чтобы я мог развернуть ее через Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Я помещаю их в ~ deploy / .profile, но когда я запускаю ssh, они не запускаются. Идеи?

Я использую Ubuntu 12.04.


Первоначальный вопрос был:

Когда я захожу в другой аккаунт на localhost, он не загружает мой .profile. Как я могу заставить ssh загрузить его? Я использую Ubuntu 12.04.

Чарльз Р
источник

Ответы:

15

Вы можете явно указать, что хотите запустить интерактивную оболочку входа в систему:

 ssh user@host bash --login -i 

«Роль» из ~/.profile(. Или ~ / bash_profile) и .bashrcдля SSH есть некоторые другие файлы (см man sshподробности):

~ / .Ssh / окружающая среда

Содержит дополнительные определения для переменных среды; см. ОКРУЖАЮЩАЯ СРЕДА, выше.

~ / .Ssh / гс

Команды в этом файле выполняются ssh, когда пользователь входит в систему, непосредственно перед запуском оболочки пользователя (или команды). Для получения дополнительной информации см. Справочную страницу sshd (8).


источник
«Возможно» часто не соответствует действительности, потому что ssh запускается каким-либо другим инструментом (непрерывная доставка), и команда не может быть легко изменена.
Ян Худек
6

.profileзагружается только для оболочек входа в систему, которых нет в сеансе ssh (по умолчанию). Если вы хотите, чтобы что-то запускалось при запуске для всех интерактивных оболочек, вставьте это .bashrcвместо ( .zshrcили того, что использует ваша оболочка).

Кроме того, если вы просто хотите войти в другую учетную запись на локальном компьютере, ssh, вероятно, излишне. Вы можете использовать suили что-то вместо этого.

qmega
источник
3
Вроде .bashrcтоже не грузится.
Кенорб
Это неверно Это является Войти оболочки. Со страницы руководства: «Если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему».
MKJ
~ / .zshenv у меня работает. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Когда ssh получает команду для запуска, по умолчанию он не выделяет tty, и тогда оболочка также не является «интерактивной».
Ян Худек
4

Использование 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при использовании Баша):


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

eremmel
источник
0

Bash читает ~/.profileтолько тогда, когда это оболочка входа в систему и ~/.bash.bashrcтолько если у него есть терминал, ни один из которых не является истинным по умолчанию при вызове команды с помощью ssh. Однако, есть несколько других опций для установки среды на сервере, но, к сожалению, все зависит от настроек системы:

  • Zsh читает ~/.zshenvдаже в этом случае; для bash нет соответствующего файла конфигурации.
  • Если PermitUserEnvironmentопция /etc/sshd_configвключена, ssh будет читать ~/.ssh/environment. К сожалению, эта опция по умолчанию отключена.
  • Если pam_env.soвызывается с user_readenv=1in /etc/pam.d/sshd, он будет читать ~/.pam_environment. Хотя это не модуль по умолчанию, он называется так, по крайней мере, в Ubuntu .
  • Если все остальное терпит неудачу, вы можете поместить command=директиву в файл авторизованных ключей, вызывая скрипт-обертку, который устанавливает среду и выполняет $SSH_ORIGINAL_COMMANDв конце (я это команда для оболочки, поэтому здесь уместно использовать eval, но я не уверен) ,
Ян Худек
источник
0

Вы, вероятно, есть ~/.bash_profile, который переопределяет ~/.profile.

user541686
источник