Я знаю /etc/profile
и ~/.profile
нахожусь среди сценариев запуска, используемых, когда ssh
используется для входа на сервер – т.е. с использованием ssh
аргумента сервера. Однако сценарий, где я просто использую ssh
аргумент сервера+команда, похоже, не подхватывает те же сценарии запуска.
Предположим, что у меня bash в качестве оболочки по умолчанию. Если .bashrc
существует, я знаю, что он выбирается в этом сценарии. Но если .bashrc
не существует и нет других персональных профилей, что еще запускается?
Есть ли другой глобальный скрипт, предоставляющий переменные среды?
решение1
На этой странице вы найдете больше информации, чем вам, вероятно, хотелось бы знать, но это отличный краткий ресурс:
В принципе, когда вы подключаетесь к компьютеру по ssh, вы не запускаете оболочку 'login', поэтому берутся другие файлы. Короче говоря, если ваша оболочка по умолчанию — /bin/bash (по умолчанию в Ubuntu), вы будете получать ~/.bashrc
в домашнем каталоге. Проверьте FILES
раздел страницы руководства bash ( man bash
), ближе к концу, на предмет других файлов, которые вступают в игру.
Также убедитесь, что вы начеку в ваших .bashrc
for строках, которые выходят, если не используете 'интерактивную' оболочку. Хороший способ выяснить это - ввести отпечатки в ваш .bashrc
и продолжать экспериментировать, пока не поймете это.
Так:
# ~/.bashrc:
echo "HERE I WAS!"
# Exit here unless an interactive session.
[ -z "$PS1" ] && return
echo "HERE I AM!"
решение2
Без команды 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
это было, поэтому вы не можете использовать здесь команды оболочки.