Existe-t-il des shells de connexion non interactifs?


14

Je sais quelle est la différence entre les shells interactifs / non interactifs et les shells de connexion / non-connexion, mais il semble qu'en pratique, il n'y aura jamais de shell de connexion non interactif , sauf si vous avez quelque chose comme /bin/bash --login some-script.shdans un script (et même cela semble un peu bizarre). Est-ce correct ou sont-ils plus courants?


7
telnet towel.blinkenlights.nlpour un shell de connexion non interactif ;-)
Martin Tournoij

1
Cette question est répondue brièvement dans cette réponse plus longue .
Wildcard

@CaptainMan: En regardant les réponses, nous en avons deux qui se concentrent sur des significations très différentes de "interactif". À la lumière de cela, pouvez-vous développer un peu votre réponse pour expliquer quel sens vous utilisiez lorsque vous avez posé la question?
Curt J. Sampson

Réponses:


10

Je suppose que vous parlez du concept de Bash de connexion vs non-connexion et des shells Bash interactifs vs non interactifs comme décrit dans la section Invocation de la page de manuel. (Ceci est différent de l'interprétation dans la réponse de James Youngman de toute commande arbitraire utilisée comme "shell" (ou interpréteur de commande utilisateur) dans le passwd(5)fichier et si ce programme accepte ou non l'entrée utilisateur; certains, comme /usr/sbin/nologin, évidemment, ne le font pas. )

Vous avez raison, cela /bin/bash --login some-script.shproduira une invocation Bash de connexion non interactive, et c'est peut-être un exemple pathologique. Il y a un cas, peut - être rare , mais pas vraiment bizarre, qui produit un shell de connexion non interactive: ssh somehost < some-file. Ici sshd, Bash démarrera avec argv[0]set to -bashcar aucune commande à exécuter ne lui a été donnée, ce qui obligera Bash à se considérer comme un shell de connexion, mais, comme stdin n'est pas connecté à un terminal, Bash ne se mettra pas en mode interactif ( $-ne contiendra pas i) .

(Personnellement, ce cas semble beaucoup plus raisonnable que l'inverse, ssh somehost somecommandqui n'est pas considéré comme un "shell de connexion" même s'il s'agit d'une nouvelle connexion, somehosttout comme ce qui précède.)

J'ai récemment fait ce que j'aurais dû faire il y a longtemps et j'ai préparé un tableau des modes de Bash et des fichiers init qui sont exécutés . Si vous trouvez cela déroutant, prenez-y à cœur, du moins moi aussi. Cela me mystifie quel était leur objectif initial avec les règles sur le moment de l' .bashrcexécution.


1

La plupart des shells de connexion par compte sur un système nouvellement installé ne sont pas interactifs, en fait:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Clairement /bin/bashet /bin/shsont des coquilles traditionnelles et elles sont interactives. Mais tous les autres éléments de cette liste ne sont pas interactifs. Si vous lisez la liste et ne savez pas ce que fait l'un d'eux, vous pouvez simplement consulter sa page de manuel (avec par exemple man nologinou man sync).

Ce que fait réellement la commande

En regardant l'historique des publications de Captain Man, je vois qu'ils sont assez inexpérimentés avec Unix. Alors peut-être que la question dans le commentaire de ne pas suivre concerne la ligne de commande en haut de la réponse, pas simplement la sortie. Je vais donc aussi expliquer la ligne de commande, même si c'est vraiment hors sujet pour cette question.

La commande est un pipeline Unix . Un pipeline est une chaîne de commandes - vous le lisez de gauche à droite - dans laquelle la sortie de la première commande devient l'entrée de la seconde, la sortie de la seconde devient l'entrée de la troisième, et ainsi de suite, jusqu'à ce que le fin du pipeline. La sortie du dernier processus est affichée sur le terminal (sauf s'il a été redirigé). Voir l'entrée Wikipedia sur les pipelines shell pour plus d'informations.

Si vous ne comprenez pas ce que fait un pipeline, vous pouvez simplement l'exécuter en segments pour voir ce qui se passe. Vous pouvez également lire la page de manuel pour les commandes qui sont utilisées (ici, awk, sortet uniq). En fait, vous devriez le faire maintenant. J'attendrai.

Exécutons les étapes du pipeline de manière incrémentielle (vous pouvez le faire en toute sécurité sur votre propre système Unix):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

La sortie ci-dessus est simplement le contenu du septième champ du /etc/passwdfichier. C'est la base de données (fichier texte plat) qui indique au système ce qu'est le shell de connexion de tout le monde. Si vous voulez en savoir plus, /etc/passwdlisez-le (il est lisible dans le monde entier) et consultez sa page de manuel (man 5 passwd).

Donc, en lisant toute la liste, vous pouvez avoir une idée des éléments populaires, mais ce n'est pas un bon format pour une réponse à cette question, car la question portait vraiment sur la fréquence des coquilles non interactives. Comptons-les. La façon la plus simple de procéder consiste à trier les éléments en premier:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Nous pouvons utiliser le programme uniqpour nous montrer uniquement les éléments uniques:

~ $ awk -F: '{print $ 7}' </ etc / passwd | trier | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Mais attendez, cela ne sert à rien, combien de chacun était là? Demandons uniq(lisez la page de manuel!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

C'est le résultat que nous avons vu en haut de la réponse, bien sûr. Trions-le à nouveau pour voir les entrées dans l'ordre:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Attendez, cela ne peut pas être vrai, 17 vient avant 1 et 5 après 23. Le problème est que les articles sont triés lexicographiquement . Demandons sortde les trier numériquement, et dans l'ordre inverse:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Je pense que cela explique tout dans la réponse originale. Si vous ne savez toujours pas ce que font ces commandes, vous pouvez lire les pages de manuel. Si vous n'êtes toujours pas clair sur les principes de ce qui se passe, il serait préférable de commencer par lire un livre (en ligne ou sur papier) expliquant Unix et Linux.


Pouvez-vous expliquer un peu plus s'il vous plaît? Je ne suis pas sûr de suivre ce que je lis.
Captain Man

est /bin/syncune coquille? donc tout utilitaire est un shell?
eloone

@eloone il y a deux (peut-être trois) significations pour "shell". L'un est, les programmes configurés comme un shell de connexion dans la base de données de mots de passe. C'est le sens du mot voulu par l'expression "shell de connexion non interactif". L'autre sens est "un REPL adapté au travail interactif quotidien sur un système Unix". Celles-ci sont interactives. Cependant, la plupart des programmes utilisables dans le contexte REPL prennent également en charge l'utilisation non interactive comme interprètes pour une sorte de langage de script (bien que "script shell" signifie presque universellement "script shell Bourne-family-shell").
James Youngman

2
Vous semblez répondre à une autre question. Vous listez simplement les shells disponibles et vous signalez que certains ne seront jamais interactifs. Je crois que l'OP demande si un shell de connexion non interactif est jamais rencontré dans la nature. Donc, que les shells qui peuvent être interactifs, bash par exemple, lancent jamais des shells de connexion non interactifs . En d'autres termes, un "shell de connexion" ici ne signifie pas "un shell de connexion par défaut d'un utilisateur", cela signifie un shell qui a été lancé en tant que shell de connexion . Voir unix.stackexchange.com/a/46856/22222
terdon

1
Ou peut-être, étant donné que l'affiche écrit explicitement bash --logindans la question, il pose des questions spécifiques sur les bashprocessus qui n'ont pas l' ioption définie. (Ceux-ci proviennent de commandes telles que ssh somehost < script.sh; ce sera un shell "de connexion, non interactif" dans les sens spécifiés dans la section INVOCATION de la page de manuel Bash.)
Curt J. Sampson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.