Исторически файлы профиля ( /etc/profile
и ~/.profile
) вызывались при входе в систему (в текстовой консоли, что еще?) И служили многим целям:
- Установите переменные окружения и другие параметры (например, umask) для сеанса.
- Запустите дополнительные программы в начале сеанса (например, уведомление по электронной почте).
- Запустите программу для сеанса, если она отличается от оболочки (например, другой оболочки или X Window).
- Установите параметры терминала (например
stty
).
- Установите параметры оболочки (например, псевдонимы).
Все эти цели не были определены как отдельные до позже. Поскольку сценарии профиля могут делать вещи, которые имеют смысл только в интерактивном сеансе (взаимодействие с терминалом, запуск других программ), когда был введен удаленный вызов оболочки ( rsh ), представители rsh решили не вызывать удаленную оболочку в качестве оболочки входа в систему, так что сценарии профиля не выполняются. (В некоторых версиях rshd
есть возможность запускать удаленную оболочку в качестве оболочки входа в систему.) Ssh скопировал это поведение для замены rsh.
Если вы хотите, чтобы выполнялись сценарии вашего профиля, вы можете явно вызывать их.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Обратите внимание на команду .
для загрузки скриптов профиля внутри оболочки: это команды, которые должны выполняться внутри этой оболочки, а не внешняя программа.
Если вы хотите установить глобальную переменную среды для всех пользователей, во многих системах есть другой метод: вместо того, чтобы определять его в /etc/profile
, определите его в /etc/environment
. Этот файл читается через pam_env
модуль; большинство дистрибутивов Linux настроены на его чтение.
Если ваша оболочка входа в систему bash, есть еще одна возможность. Как правило, вы не должны устанавливать переменные среды в.bashrc
(потому что они не будут установлены в сеансах X, за исключением случаев, когда вы проходите через терминал с интерактивной оболочкой, потому что они не будут установлены, если вы входите в систему интерактивно на текстовой консоли или более ssh, потому что они переопределят пользовательские настройки, если вы вызовете оболочку внутри другой программы). Однако, у bash есть странная особенность, которую я никогда не понимал: она читается ~/.bashrc
в двух не связанных между собой обстоятельствах:
- в интерактивных оболочках, которые не являются оболочками входа в систему;
- в неинтерактивных оболочках, которые не являются оболочками входа в систему, если bash считает, что она была вызвана
rshd
или sshd
.
Когда вы запускаете команду через ssh, вы находитесь во втором случае. Вы можете сделать так, чтобы ваш профиль читали, читая /etc/profile
и .profile
от .bashrc
. Включите следующий код в свой ~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac
ydisplay
? делаетssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
работу?