Historiquement, les fichiers de profil ( /etc/profile
et ~/.profile
) ont été invoqués lorsque vous vous êtes connecté (sur la console texte, quoi d'autre?) Et ont servi à de nombreuses fins:
- Définissez les variables d'environnement et d'autres paramètres (par exemple umask) pour la session.
- Exécutez des programmes supplémentaires au début de la session (par exemple, notification par e-mail).
- Exécutez le programme pour la session, s'il est différent du shell (par exemple un autre shell ou X Window).
- Définissez les paramètres du terminal (par exemple
stty
).
- Définissez les paramètres du shell (par exemple les alias).
Tous ces objectifs n'ont été identifiés comme séparés que plus tard. Parce que les scripts de profil peuvent faire des choses qui n'ont de sens que dans une session interactive (interaction de terminal, démarrer d'autres programmes), lorsque l'invocation du shell distant ( rsh ) a été introduite, la marque de rsh a décidé de ne pas appeler le shell distant en tant que shell de connexion, afin que les scripts de profil ne soient pas exécutés. (Certaines versions de rshd
ont une option pour exécuter le shell distant en tant que shell de connexion.) Ssh a copié ce comportement afin de remplacer directement rsh.
Si vous souhaitez exécuter vos scripts de profil, vous pouvez les invoquer explicitement.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Notez la commande .
pour charger les scripts de profil à l'intérieur du shell: ce sont des commandes à exécuter à l'intérieur de ce shell, pas un programme externe.
Si vous souhaitez définir une variable d'environnement globalement pour tous les utilisateurs, il existe une autre méthode sur de nombreux systèmes: au lieu de la définir dans /etc/profile
, définissez-la dans /etc/environment
. Ce fichier est lu dans le pam_env
module; la plupart des distributions Linux sont configurées pour le lire.
Si votre shell de connexion est bash, il existe une autre possibilité. Normalement, vous ne devez pas définir de variables d'environnement dans.bashrc
(car elles ne seront pas définies dans les sessions X, sauf si vous passez par un terminal avec un shell interactif, car elles ne seront pas définies si vous vous connectez de manière interactive sur une console de texte ou sur ssh, car ils remplaceront les paramètres personnalisés si vous appelez un shell dans un autre programme). Cependant, bash a une caractéristique étrange que je n'ai jamais comprise: il se lit ~/.bashrc
dans deux circonstances indépendantes:
- dans des shells interactifs qui ne sont pas des shells de connexion;
- dans des shells non interactifs qui ne sont pas des shells de connexion, si bash pense qu'il a été invoqué par
rshd
ou sshd
.
Lorsque vous exécutez une commande sur ssh, vous êtes dans le deuxième cas. Vous pouvez faire en sorte que votre profil soit lu par lecture /etc/profile
et à .profile
partir de .bashrc
. Incluez le code suivant dans votre ~/.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
? çassh 127.0.0.1 /usr/app/cpn/bin/ydisplay
marche?