Séquence de scripts provenant de la connexion

41

Je voudrais concentrer toute ma configuration de connexion dans mes fichiers ~/.bash_profile. Il y en avait un ~/.bashrcpar défaut mais je l'ai remplacé par un ~/.bash_profile.

Cependant, lorsque je me connecte, quelque chose avant que mon ~/.bash_profilesoit obtenu et affiche les éléments suivants:

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

Je voudrais supprimer cela afin que seul mon propre message d'accueil défini dans mes ~/.bash_profileécrans d'affichage soit récupéré, mais je ne suis pas sûr de la logique / séquence des scripts obtenus / exécutés lorsqu'un utilisateur se connecte. Pouvez-vous m'éclairer?

En prime, j'aimerais également connaître la séquence des sources / administrateurs automatisés lorsque le système démarre, et pas seulement lorsqu'un utilisateur démarre une session en se connectant, bien que cette préoccupation soit de moindre importance pour moi pour le moment.

amphibient
la source

Réponses:

53

C'est un peu complexe. Tout d’abord, les détails dépendent du type de shell que vous exécutez. Pour me plagier :

  • Lorsque vous ouvrez un émulateur de terminal ( gnome-terminalpar exemple), vous exécutez ce qu'on appelle un shell interactif sans connexion .

  • Lorsque vous vous connectez à votre ordinateur à partir de la ligne de commande ou exécutez une commande telle que su - username, vous exécutez un shell de connexion interactif .

  • Lorsque vous vous connectez graphiquement, vous exécutez quelque chose de complètement différent. Les détails dépendront de votre système et de votre environnement graphique, mais en général, c'est le shell graphique qui gère votre identifiant. Alors que de nombreuses coquilles graphiques (y compris la valeur par défaut Ubuntu) lit /etc/profileet ~/.profilepas tous les faire.

  • Enfin, lorsque vous exécutez un script shell, il est exécuté dans un shell non interactif et non connecté .

Les fichiers que bash lira au lancement dépendent du type de shell sous lequel il s'exécute. Ce qui suit est un extrait de la section INVOCATION de man bash(souligné par moi):

Lorsque bash est appelé en tant que shell de connexion interactif ou en tant que shell non interactif avec l'option --login, il commence par lire et exécuter les commandes du fichier / etc / profile , si ce fichier existe. Après avoir lu ce fichier, il recherche ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre , puis lit et exécute les commandes à partir de la première qui existe et est lisible. L'option --noprofile peut être utilisée au démarrage du shell pour empêcher ce comportement.

Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, bash lit et exécute les commandes de /etc/bash.bashrc et ~ / .bashrc , si ces fichiers existent. Cela peut être inhibé en utilisant l'option --norc. L'option de fichier --rcfile obligera bash à lire et à exécuter des commandes à partir du fichier au lieu de /etc/bash.bashrc et ~ / .bashrc.

Ce sont les fichiers d'initialisation. Vous pouvez également /etc/environmentdéfinir des variables d’environnement globales, mais celles-ci sont lues plutôt que source (les commandes qu’elle contient ne sont pas exécutées, mais les définitions de variables sont définies).

Maintenant, la salutation que vous voyez est encore autre chose. Cela est défini dans /etc/motdet est affiché à travers pam_motd. Comme expliqué dans man motd:

Le contenu de / etc / motd est affiché par pam_motd (8) après une connexion réussie mais juste avant l’exécution du shell de connexion.

L'abréviation "motd" signifie "message du jour", et ce fichier est traditionnellement utilisé exactement pour cela (il nécessite beaucoup moins d'espace disque que le courrier destiné à tous les utilisateurs).

Sous Debian GNU / Linux, le contenu de /run/motd.dynamic est également affiché. Ce fichier est généré par /etc/init.d/motd au démarrage.

Pour supprimer le message, il suffit de vider le /etc/motdfichier et de s’assurer que rien n’est généré, le /etc/init.d/motdcas échéant.


Quoi qu’il en soit, en fonction du résultat affiché, vous semblez vous connecter via, sshce qui signifie que vous utilisez un shell de connexion interactif . Voir ce que cela signifie plus haut. Donc, en résumé, les choses qui vous intéressent et qui sont extraites lorsque vous vous connectez sont (et dans cet ordre):

  1. Le démon SSH, via le pam_motdmodule de la bibliothèque PAM, affiche le contenu de /etc/motd. Via le pam_envmodule, il définit les variables d'environnement de /etc/environmentet ~/.pam_environment.
  2. Un shell de connexion est démarré et les fichiers suivants sont lus dans l'ordre:
    1. /etc/profile
    2. /etc/bash.bashrc(les /etc/profilesources par défaut Ubuntu /etc/bash.bashrc).
    3. ~/.bash_profile. Les autres fichiers qui auraient pu être lus ici ( ~/.profileet ~/.bash_login) sont ignorés car ~/.bash_profileexiste.
terdon
la source
5
Une astuce intéressante pour découvrir ces choses consiste à définir des variables sentinelles. Je veux dire, je mets export SET_IN_ETC_PROFILE=yesdans /etc/profile, export SET_IN_HOME_ZSHRC=yesdans ~/.zhshrc(je suis un utilisateur de zsh), etc ... Ensuite, redémarrez et une belle env|grep SET_INvous racontera toute l'histoire. Pour savoir quelles variables sont vues par les applications de bureau (celles que vous lancez à partir du tableau de bord ou du gestionnaire de
tâches
1
alors quand vous ssh, ce serait un shell interactif, correct?
amphibient
@amphibient un shell de connexion interactif, oui. Lorsque vous ouvrez un terminal sur une machine locale en tournée, il s’agit d’un shell interactif et non connecté.
terdon
@Rmano J'ai voté pour vos commentaires. Mais des instants plus tard, l’ordre envn’a aucun rapport avec l’ordre d’exécution.
Penghe Geng
2
@ xiaobai bien sûr que non, le but est de SET_INvous montrer quels fichiers ont été lus, et non dans quel ordre ils ont été lus. L'ordre est standard, c'est ce qui est montré dans les extraits de page de manuel que j'ai dans ma réponse.
terdon
1

Les informations que vous voyez lorsque vous vous connectez via ssh sont créées avant même que / etc / profile ne soit consulté. Examinez la séquence de fichiers dans /etc/update-motd.d. Cela vous montrera où les messages que vous voyez sont générés par divers scripts.

Reese
la source
1
Ceci est déjà couvert dans la réponse du haut, mais j'apprécie votre brièveté. +1 :)
wjandrea