Maison >Périphériques technologiques >Industrie informatique >Comprendre les scripts de connexion Nix

Comprendre les scripts de connexion Nix

Lisa Kudrow
Lisa Kudroworiginal
2025-02-19 12:30:12574parcourir

Understanding *NIX Login Scripts

Comprendre les scripts de connexion Nix

Les plats clés

  • Le script / etc / profil, qui est lu par tous les shells pendant la connexion, est utilisé pour définir le chemin $ et $ ps1, et pour source /etc/bash.bashrc.
  • Les comptes d'utilisateurs de bash individuels peuvent créer l'un des fichiers ~ / .bash_profile, ~ / .bash_login, ou ~ / .profile pour être obtenu, permettant des paramètres spécifiques à l'utilisateur.
  • BASH lira les deux /etc/bash.bashrc et ~ / .bashrc lorsqu'il est démarré comme un shell interactif qui n'est pas un shell de connexion, mais Debian s'approvisionne ces fichiers à partir du / etc / profil et ~ / .profile de connexion scripts respectivement.
  • ~ / .xSessionrc est l'endroit idéal pour charger des variables d'environnement ou exécuter des utilitaires une fois au lancement qui ne s'appliquent qu'aux séances X, et ~ / .bash_logout est lue lors de la connexion d'une coquille interactive.
  • pour les variables d'environnement à l'échelle du système, /etc/profile.d/somefile.sh est un bon pari, tandis que pour les emplacements d'annuaire personnels qui peuvent se déplacer, .profile ou .bashrc pourrait être utilisé en fonction du compromis entre les entre Efficacité et flexibilité de session.

Avez-vous déjà fait face à un scénario où vous deviez définir une variable d'environnement ou exécuter un programme pour modifier votre environnement de shell ou de bureau, mais je ne connaissais pas le meilleur endroit où l'appeler?

C'est une situation courante. De nombreuses tâches nécessitent des variables d'environnement pour fonctionner correctement, de la gestion des utilitaires de Debian Packaging à la gestion des IaaS et à tout le reste.

Parfois, un programme n'a généralement besoin que d'exécuter une seule fois lorsque vous vous connectez pour la première fois, comme la commande xrandr. En outre, les programmes s'attendent occasionnellement à être injectés dans la coquille, tels que RBENV, RVM ou le propre utilitaire Envwitch de SitePoint.

Ces paramètres ne doivent pas être chargés de n'importe où. Parfois, il existe un certain nombre de facteurs qui devraient être pris en compte avant de porter un jugement sur le meilleur endroit.

Jetons un coup d'œil à certaines options communes présentes sur une installation Debian GNU / Linux Jessie, et essayez de donner un sens à tout cela.

/ etc / profil

Par défaut, Debian fournit / etc.

<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>
Pour plus de commodité, l'utilisateur racine (ID utilisateur 0) obtient différents chemins définis à tout le monde. En effet, les emplacements System Binary (SBIN) sont idéalement réservés à l'administration du système ou aux programmes qui doivent s'exécuter comme root. Les chemins de jeux sont omis pour root car vous ne devez jamais exécuter de programmes comme l'utilisateur racine sauf si nécessaire.

Suivant Up, / etc / Profile gère la configuration de $ PS1, qui est utilisée pour définir la chaîne d'invite principale. Les valeurs par défaut définies sont «$» (ou «#» pour la racine), sauf si le shell est bash. Si la coquille est bash, /etc/bash.bashrc provient plutôt de le gérer (entre autres). Nous parlerons de /etc/bash.bashrc sous peu.

Ainsi, à ce stade, nous pouvons déduire que / etc / profil est lu par tous les shells pendant la connexion (c'est-à-dire par la commande de connexion). Au lieu d'utiliser la variable intégrée plus efficace BASH $ {uid} pour déterminer l'ID utilisateur, / etc / Profile appelle la commande ID à la place. Au lieu de définir une invite de shell fantaisie, une configuration spécifique au bash a été provenant, car Bash prend en charge des caractères spéciaux insuffisants de barreaux arrière tels que U (nom d'utilisateur) et H (nom d'hôte), ce que de nombreux autres shells ne le feraient pas. / etc / profil devrait essayer d'être conforme à POSIX, afin d'être compatible avec n'importe quel shell que l'utilisateur peut installer.

Debian GNU / Linux est souvent préinstallé avec Dash, qui est un shell de base qui vise uniquement à implémenter les extensions POSIX (et certaines Berkeley). Si nous modifions / etc / profil (faites une sauvegarde d'abord!) . Cependant, si nous appelons à la place la commande Dash sans l'argument -l, / etc / profil n'est pas lu, et que DASH retombe à une valeur par défaut (qui est d'ailleurs ce que la valeur PS1 d'origine était avant de la modifier).

La dernière chose intéressante à noter sur / etc / profil est l'extrait suivant à la fin:

<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>

En d'autres termes, tout ce qui est lisible correspondant au /tc/profile.d/*.sh glob est d'origine. Ceci est important, car cela indique que l'édition / etc / le profil n'est jamais réellement requise (restaurez donc la sauvegarde que vous avez faite plus tôt!). Toutes les variables définies ci-dessus peuvent être remplacées dans un fichier séparé. Un avantage de le faire est qu'il permet aux mises à niveau du système d'ajouter automatiquement des modifications à / etc / profil, car le système de gestion des packages APT de Debian ne touchera généralement pas les fichiers de configuration modifiés.

~ / .bash_profile, ~ / .bash_login, et ~ / .profile

Un problème potentiel avec / etc / profil est qu'il est situé dans un chemin à l'échelle du système. Cela signifie que les modifications y affectent tous les utilisateurs du système. Sur un ordinateur personnel, cela peut ne pas sembler être un problème, mais les modifications nécessitent des privilèges racine. Pour ces raisons, chaque compte utilisateur individuel peut créer l'un des fichiers ~ / .bash_profile, ~ / .bash_login, ou ~ / .profile à obtenir - et le premier fichier trouvé (recherché dans l'ordre répertorié) est utilisé pendant que tout Les fichiers restants sont ignorés. D'autres obus - comme Dash - prennent en charge quelque chose de similaire, mais ne regardent que ~ / .profile. Cela permet à l'utilisateur de créer un .bash_profile pour des situations spécifiques à Bash, et si elle passe parfois à Dash ou à un autre shell comme shell de connexion (comme via la commande CHSH -S Dash), ~ / .profile peut être réservé à Ce cas d'utilisation.

Il faut garder à l'esprit l'importance de cela. Le répertoire de Debian Skeleton par défaut (/ etc / skel, utilisé pour héberger des fichiers et des répertoires à copier dans les nouveaux comptes d'utilisateurs répertoires domestiques) comprend un fichier .profile, mais pas un fichier .bash_profile ou .bash_login. Debian utilise également Bash comme shell utilisateur par défaut. Par conséquent, de nombreux utilisateurs sont habitués à mettre leurs paramètres de coquille de connexion bash dans .profile.

J'ai vu des instructions d'installation pour des projets tels que RVM demande à l'utilisateur de créer un fichier .bash_profile, mais cela est dangereux, car il peut briser l'environnement du shell de l'utilisateur! Même si l'utilisateur n'a pas modifié .profile, elle peut profiter de la fonctionnalité par défaut ~ / .profile qui ajoute ~ / bin à la variable de l'environnement $ $. Cela ne fonctionnera plus. Une option qui pourrait améliorer la sécurité consiste à ajouter .bash_profile comme lien symbolique à .bashrc dans / etc / skel avant de créer des comptes d'utilisateurs.

Si nous regardons le script par défaut de Debian Jessie, nous pouvons voir l'extrait suivant:

<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>

Ceci est similaire à ce que nous avons vu dans / etc / profil, où /etc/bash.bashrc provient si le shell est bash. La signification de ceci est discutée dans la section suivante.

/etc/bash.bashrc et ~ / .bashrc

Lorsque démarré, Bash lira à la fois /etc/bash.bashrc et ~ / .bashrc, dans cet ordre, mais seulement s'il est démarré comme un obus interactif qui n'est pas un shell de connexion (ce qui signifie généralement lorsque vous démarrez via un xter ). Il s'agit d'un comportement standard pour la coquille de bash. Cependant, Debian s'approvisionne de ces fichiers à partir des scripts de connexion / etc / du profil et ~ / .profile respectivement. Cela modifie efficacement le comportement de telle sorte que /etc/bash.bashrc et .bashrc (s'ils existent) sont tous les deux invoqués lorsqu'une coquille bash est démarrée, indépendamment d'être une coquille de connexion ou non. Ne comptez pas sur ce comportement étant le même dans différentes distributions.

.Bashrc est un excellent endroit pour ajouter des alias de commande. En fait, certaines personnes ont tellement d'alias qu'ils préfèrent les garder dans un fichier séparé. Le défaut de Debian .Bashrc recherche ~ / .bash_aliases et le s'approvisionne si le fichier existe, alors n'hésitez pas à y garder tous vos alias bash. .Bashrc est également le meilleur endroit pour l'utilisateur pour remplacer les variables de shell telles que $ ps1 ou $ histsize (le montant de l'historique des commandes à conserver) si elle le souhaite. Le par défaut de Debian .Bashrc est de 100 lignes, mais est une lecture assez simple et est bien commenté. Comme son nom l'indique, .Bashrc ne devrait pas être obtenu par des coquilles non bash.

~ / .xSession et ~ / .xSessionrc

Si vous êtes un utilisateur de bureau GNU / Linux qui se connecte localement via un gestionnaire d'affichage (par opposition au programme de connexion via un getty), / etc / profil et ~ / .profile ne peut pas fonctionner. Certains gestionnaires d'affichage procurent à tort ces fichiers - comme le Gnome Display Manager - mais d'autres DM, comme LightDM, ne le font pas. Heureusement, vous avez d'autres options.

Lorsqu'une session Système de fenêtre X est démarrée (indépendamment de l'utilisation d'un gestionnaire d'affichage ou de startx à partir d'un terminal virtuel), le script de shell / etc / x11 / xSession sera exécuté. Il s'agit essentiellement de l'équivalent à / etc / profil utilisé par les coquilles de connexion, uniquement pour x et non d'origine mais directement exécutée. Il est également considérablement plus complexe. Semblable à comment / etc / profil se lit dans les scripts de /etc/profile.d, / etc / x11 / xSession sources scripts sous /etc/x11/xsession.d. Tous les scripts de ce répertoire commencent par un nombre, donc les scripts seront chargés dans l'ordre numéroté.

Debian Jessie comprend un fichier appelé 40x11-Common_xSessionrc. Tout ce qu'il fait est de vérifier si ~ / .xSessionrc est lisible et (si oui) le s'approvisionne. Cela fait de ~ / .xSessionrc l'endroit idéal pour charger des variables d'environnement ou d'exécuter des utilitaires unique au lancement (tels que xrandr ou xmodmap) qui ne s'appliquent qu'aux séances X. Vous pouvez également l'utiliser pour source / etc / profil et ~ / .profile si vous le vouliez, donc toutes les variables d'environnement spécifiées seront également héritées par votre gestionnaire de session (s'ils ne l'ont pas déjà été). Notez que .xSessionrc n'existe pas par défaut, vous devez donc le créer.

Si nous continuons à parcourir les fichiers dans / etc / x11 / xSession, nous trouvons 50x11-COMMON_DETERMINE-Startup qui détermine le gestionnaire de session à charger. Si le fichier ~ / .xSession existe et est exécutable, il sera enregistré et exécuté plus tard dans le cadre de 99x11-COMMON_START. Étant donné que ~ / .xSession est destiné à exécuter le gestionnaire de session, la session X se déconnectera et vous serez retourné à l'écran de connexion de votre gestionnaire d'affichage lorsque ce script se terminera.

comme ~ / .xSessionrc, ~ / .xSession n'existe pas par défaut, vous devez donc en créer un si vous le souhaitez. Vous pourriez créer un script .xSession simple qui ressemble comme suit:

<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>

où X-Session-Manager est par défaut tout ce qui est configuré via la commande de mise à jour-alternatives. De cette façon, vous pouvez facilement modifier le gestionnaire de session loin de la valeur par défaut à l'échelle du système, simplement en remplaçant X-Session-Manager par disons, / usr / bin / startxfce4 (pour passer à XFCE) et d'autres comptes d'utilisateurs seront complètement non affectés .

Bien sûr, de nombreux gestionnaires d'affichage offrent la possibilité de sélectionner les gestionnaires de session communs directement dans l'écran de connexion, donc ce fichier n'est souvent pas nécessaire. Cependant, .xSession offre beaucoup de flexibilité, et vous pourriez avoir n'importe quel programme appelé ici - pas seulement les gestionnaires de session. Par exemple, vous pouvez appeler Chromium ou Iceweasel dans une boucle de temps ici pour implémenter une configuration de mode de kiosque de base.

~ / .bash_logout

Nous avons couvert plus tôt les fichiers qui sont lus lorsqu'un utilisateur exécute un shell de connexion Bash interactif, mais que se passe-t-il si vous vouliez exécuter un programme lorsque vous vous déconnectez? Pour cette utilisation, ~ / .bash_logout est votre ami. La valeur par défaut incluse dans Debian n'est utilisée que pour effacer l'écran (ce qui, je pense, est important du point de vue de la sécurité), mais avec un peu d'imagination, il pourrait être utilisé à d'autres fins - par exemple, pour afficher un rappel pendant quelques secondes avant vous Éloignez-vous de votre machine.

Le principal facteur de limitation est que .bash_logout n'est lu que lors de la sortie d'un shell interactif, et on ne peut pas supposer qu'il sera chargé lors de la connexion d'une session X.

Autres options

Cela couvre les options les plus courantes qui vous sont disponibles. D'autres options peuvent exister, selon votre installation (telles que / etc / environnement), mais je ne les considère pas comme susceptibles d'exister sur d'autres plateformes, et j'ai rarement besoin de les toucher.

Exemples

Alors, où devez-vous placer vos variables d'environnement à l'échelle du système? Si vous voulez qu'une variable d'environnement affecte chaque utilisateur, /etc/profile.d/somefile.sh est un bon pari. Cependant, cela suppose que vous utilisez un gestionnaire de connexion qui sources / etc. / profil. Sinon, vous pouvez (en tant qu'administrateur) ajouter un script à /etc/x11/xsession.d/ à source / etc / profil à la place.

Si vous voulez qu'un script trouve un emplacement de répertoire personnel et l'ajoute à votre chemin, vous devez considérer si le répertoire se déplace beaucoup. Si vous ajoutez du code pour le faire à .profile, l'utilisateur devra se connecter et à nouveau pour que le chemin reflète un changement de répertoire pendant la session utilisateur. Si vous avez plutôt ajouté le code à .bashrc, cela signifie que le code sera exécuté à chaque fois que l'utilisateur ouvre un Xterm - ce qui n'est probablement pas idéal s'il prend plus d'une demi-seconde à exécuter. Il s'agit donc de peser les compromis.

Et si vous voulez une variable d'environnement uniquement pour vos séances de connexion personnelles? S'il ne concerne que x sessions, vous pouvez l'ajouter à ~ / .xSessionrc. Cela a l'avantage qu'il sera généralement disponible pour tous les programmes lancés via X Session Manager, car il est défini avant le lancement du X-Session Manager, et est donc hérité. Par exemple, certains pilotes graphiques peuvent avoir VSYNC désactivé en exécutant

<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>

Le fait de placer cela dans .xSessionRC devrait donc affecter tous les programmes.

Cependant, si cette ligne était ajoutée à .Bashrc, seuls les programmes lancés via le XTERM seraient affectés; Les programmes lancés via un lanceur de gestionnaires de fenêtres fonctionneraient comme d'habitude. Vous pouvez l'ajouter à .profile et source .profile à partir de .xSessionrc, mais vous exportez inutilement la variable d'environnement même lorsque votre serveur X n'est pas en cours d'exécution.

J'espère que vous comprenez maintenant mieux comment les scripts de connexion et de déconnexion fonctionnent sur les systèmes Debian GNU / Linux. Faites-nous savoir dans les commentaires si vous avez créé ou rencontré des utilisations particulièrement intéressantes ou créatives pour ces scripts de connexion et de déconnexion, et comment vous y êtes allé.

Next dans cette série, je vais discuter des options de gestion des fichiers de dot.

Questions fréquemment posées (FAQ) sur les scripts de connexion NIX

Quelle est la signification des scripts de connexion NIX dans la configuration du système?

Les scripts de connexion NIX jouent un rôle crucial dans la configuration du système. Ce sont des scripts qui s'exécutent automatiquement chaque fois qu'un utilisateur se connecte à un système NIX. Ces scripts sont utilisés pour configurer l'environnement de l'utilisateur, y compris la définition des variables d'environnement, la définition des fonctions et l'exécution d'autres scripts. Cela permet un environnement cohérent et reproductible entre différentes sessions et même différentes machines. Il fournit également un moyen d'automatiser les tâches qui doivent être effectuées lors de la connexion, du temps d'économie et de la réduction du potentiel d'erreurs.

Comment créer un script de connexion NIX?

Création d'une connexion NIX Le script implique d'écrire un script shell qui est exécuté lorsqu'un utilisateur se connecte. Ce script est généralement placé dans le répertoire personnel de l'utilisateur et nommé .nix-profile. Le script peut contenir toutes les commandes que vous souhaitez exécuter à Login, telles que la définition des variables d'environnement ou les services de démarrage. Une fois le script créé, vous pouvez le rendre exécutable en exécutant la commande chmod x .nix-profile.

comment puis-je déboguer un script de connexion Nix?

Le débogage d'un script de connexion Nix peut être fait en ajoutant set -x au début du script. Cela amènera le shell à imprimer chaque commande avant son exécution, ce qui peut vous aider à identifier les erreurs ou le comportement inattendu. Si le script s'exécute sans erreurs mais ne produit pas les résultats attendus, vous pouvez ajouter des instructions d'écho à travers le script pour imprimer les valeurs de variables ou d'autres informations qui peuvent vous aider à comprendre ce qui se passe.

Puis-je utiliser NIX Connexion Scripts pour gérer les packages?

Oui, les scripts de connexion NIX peuvent être utilisés pour gérer les packages. Nix possède un puissant système de gestion des packages qui vous permet d'installer, de mettre à niveau et de supprimer les packages d'une manière cohérente et reproductible. Vous pouvez utiliser un script de connexion NIX pour installer ou mettre à jour automatiquement les packages chaque fois que vous vous connectez, en vous assurant que votre environnement a toujours les dernières versions du logiciel dont vous avez besoin.

Comment utiliser les scripts de connexion NIX pour définir des variables d'environnement?

Définition des variables d'environnement dans un script de connexion NIX est aussi simple que d'ajouter une ligne comme export varName = valeur vers le script. Cela définira la variable d'environnement Varname sur la valeur de valeur pour la durée de la session de connexion. Vous pouvez également utiliser la commande Export pour mettre une variable à la disposition des sous-processus. Par exemple, Export Path = $ path: / path / to / dir ajoutera / path / to / dir à la variable d'environnement de chemin, ce qui rend les exécutables dans ce répertoire sans avoir besoin de spécifier le chemin complet.

peut J'utilise les scripts de connexion NIX pour exécuter des services?

Oui, les scripts de connexion NIX peuvent être utilisés pour démarrer des services. Cela peut être fait en ajoutant des commandes au script qui démarrent les services souhaités. Par exemple, vous pouvez ajouter une ligne comme SystemCTl Start ServiceName pour démarrer un service SystemD. Notez que vous aurez besoin des autorisations appropriées pour démarrer les services, ce qui peut nécessiter l'exécution du script avec sudo ou en tant que root.

Comment faire fonctionner un script de connexion NIX à connexion?

Pour faire fonctionner un script de connexion NIX à Connexion, vous devez l'ajouter à l'endroit approprié dans les fichiers de démarrage de votre shell. Pour Bash, il s'agit généralement du fichier .bash_profile ou .bashrc dans votre répertoire domestique. Vous pouvez ajouter une ligne comme source ~ / .nix-profile à ce fichier pour exécuter votre script de connexion NIX chaque fois que vous démarrez une nouvelle session bash.

Puis-je utiliser les scripts de connexion NIX pour personnaliser mon invite de shell?

Oui, vous pouvez utiliser un script de connexion NIX pour personnaliser votre invite de shell. Cela peut être fait en définissant la variable d'environnement PS1 dans le script. Par exemple, l'exportation ps1 = "u @ h: w $" définira l'invite pour afficher le nom d'utilisateur, le nom d'hôte et le répertoire actuel.

Comment utiliser les scripts de connexion NIX pour gérer mon chemin?

Gérer votre chemin avec un script de connexion NIX implique d'ajouter des répertoires à la variable d'environnement de chemin. Cela peut être fait avec une ligne comme Export Path = $ path: / path / to / dir, qui ajoute / path / to / dir au chemin. Cela rend les exécutables dans ce répertoire disponibles sans avoir besoin de spécifier le chemin complet. Vous pouvez ajouter autant de répertoires au chemin que vous le souhaitez, en les séparant avec des Colons.

Puis-je utiliser les scripts de connexion Nix pour automatiser Automatiser les tâches qui doivent être effectuées à la connexion. Cela peut inclure n'importe quoi, de la définition des variables d'environnement et des services de démarrage à l'installation de packages et à la mise à jour des logiciels. En automatisant ces tâches, vous pouvez gagner du temps et vous assurer qu'ils sont effectués de manière cohérente à chaque fois que vous vous connectez.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn