~/.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. Таким образом, они устанавливаются независимо от того, какую оболочку или тип входа вы используете.

Другие вопросы по тегам