Я знаю, что /etc/profile
и ~/.profile
входят в число сценариев запуска, которые используются, когда ssh
используется для входа на сервер - i. е. используя ssh
с аргументом сервера. Однако сценарий, в котором я просто использую ssh
с аргументом сервер + команда, похоже, не использует те же сценарии запуска.
Предположим, у меня есть bash в качестве оболочки по умолчанию. Если существует .bashrc
, я знаю, что он подобран в этом сценарии. Но если .bashrc
не существует и других личных профилей не существует, что еще выполняется?
Есть ли еще один глобальный скрипт, который предоставляет переменные среды?
Эта страница имеет больше, чем Вы, вероятно, хотите знать об этом, но это - большой краткий ресурс:
В основном, когда Вы ssh к компьютеру, Вы не выполняете оболочку 'входа в систему', таким образом, различные файлы получены. Короче говоря, если Ваша оболочка по умолчанию будет/bin/bash (значение по умолчанию на Ubuntu), то Вы будете получать ~/.bashrc
в Вашем корневом каталоге. Проверьте FILES
раздел страницы справочника (man bash
) удара, около конца, для других файлов, которые играют роль.
кроме того, удостоверьтесь, что Вы находитесь на наблюдении в Вашем .bashrc
для строк, которые выходят, не используя 'интерактивную' оболочку. Хороший способ понять этот материал состоит в том, чтобы вставить печать в Вашем .bashrc
и продолжать экспериментировать, пока Вы не понимаете это.
Как это:
# ~/.bashrc:
echo "HERE I WAS!"
# Exit here unless an interactive session.
[ -z "$PS1" ] && return
echo "HERE I AM!"
Без команды SSH выполняет оболочку входа в систему. Для bash
, это включает определение источника .profile
(который, на Ubuntu, источниках .bashrc
) (и /etc/profile
, какие источники /etc/bash.bashrc
). Существуют другие файлы, которые могли быть получены вместо этого, такой как .bash_profile
, но установка Ubuntu по умолчанию имеет только .profile
.
$ grep bashrc /etc/profile .profile
/etc/profile: # The file bash.bashrc already sets the default PS1.
/etc/profile: if [ -f /etc/bash.bashrc ]; then
/etc/profile: . /etc/bash.bashrc
.profile: # include .bashrc if it exists
.profile: if [ -f "$HOME/.bashrc" ]; then
.profile: . "$HOME/.bashrc
Когда выполнено с командой, SSH не выполняет оболочку входа в систему, таким образом, согласно man bash
(раздел INVOCATION
):
When an interactive shell that is not a login shell is started, bash
reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if
these files exist. This may be inhibited by using the --norc option.
The --rcfile file option will force bash to read and execute commands
from file instead of /etc/bash.bashrc and ~/.bashrc.
Однако с командой, bash
не выполняется в интерактивном режиме. Затем, почему .bashrc
полученный? Снова, от man bash
:
Bash attempts to determine when it is being run with its standard input
connected to a network connection, as when executed by the remote shell
daemon, usually rshd, or the secure shell daemon sshd. If bash
determines it is being run in this fashion, it reads and executes
commands from ~/.bashrc and ~/.bashrc, if these files exist and are
readable. It will not do this if invoked as sh. The --norc option may
be used to inhibit this behavior, and the --rcfile option may be used
to force another file to be read, but neither rshd nor sshd generally
invoke the shell with those options or allow them to be specified.
Другие файлы могли быть считаны SSH (от man ssh
, раздел FILES
):
~/.ssh/rc
Commands in this file are executed by ssh when the user logs in,
just before the user's shell (or command) is started. See the
sshd(8) manual page for more information.
/etc/ssh/sshrc
Commands in this file are executed by ssh when the user logs in,
just before the user's shell (or command) is started. See the
sshd(8) manual page for more information.
Для переменных среды, (от man ssh
, раздел ENVIRONMENT
):
Additionally, ssh reads ~/.ssh/environment, and adds lines of the format
“VARNAME=value” to the environment if the file exists and users are
allowed to change their environment. For more information, see the
PermitUserEnvironment option in sshd_config(5).
pam_env
модуль включен для SSH:
$ grep pam_env /etc/pam.d/sshd
# /etc/security/pam_env.conf.
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
Поэтому переменные в /etc/environment
и ~/.pam_environment
также установлены (и /etc/default/locale
, с тех пор envfile
установлен). Однако эти файлы не получены путь .profile
таким образом, Вы не можете использовать команды оболочки здесь.