Історично склалося, що файли профілів ( /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
за двох непов'язаних обставин:
- в інтерактивних оболонках, які не є оболонками для входу;
- в неінтерактивних оболонках, які не є оболонками для входу, якщо Баш вважає, що на нього було викликано
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
роботу?