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