web-dev-qa-db-fra.com

Différencier le login interactif et le shell non interactif sans login

J'essaie de différencier ces quatre termes login, non-login, interactif et non interactif :

  • interactif - shell de connexion
  • shell interactif - non connecté
  • non-interactif - shell de connexion
  • shell non interactif - non connecté

Tel que je le comprend
interactive - non login Shell: démarrer le système, se connecter au système et ouvrir le terminal et
non-interactive - login Shell: telnet au système et connectez-vous

Mais qu'en est-il d'un shell de connexion interactive?
Est-ce qu'il se connecte au système, ouvre un terminal virtuel et se connecte? et
non interactif - Shell non connecté, exécute-t-il un script automatisé dans crontab?

24
d a i s y

La seule idée fausse que vous semblez avoir est de savoir ce qui constitue un shell de connexion non interactif.

Brièvement (voir ici pour plus de détails), avec des exemples:

  • login interactif Shell: Vous vous connectez à un ordinateur distant via, par exemple, ssh. Vous pouvez également vous rendre à un terminal sur votre ordinateur local (Ctrl+Alt+F1) et connectez-vous là.

  • Shell interactif sans connexion: Ouvrez un nouveau terminal.

  • Shell non interactif non connecté: Exécuter un script. Tous les scripts s'exécutent dans leur propre sous-shell et ce shell n'est pas interactif. Il ne s'ouvre que pour exécuter le script et se ferme immédiatement une fois le script terminé.

  • Shell de connexion non interactif: Ceci est extrêmement rare, et vous ne le rencontrez pas. Une façon de lancer un est echo command | ssh server. Lorsque ssh est lancé sans commande (donc ssh au lieu de ssh command qui exécutera command sur le shell distant), il lancera un shell de connexion. Si le stdin du ssh n'est pas un terminal, il lance un shell non interactif. C'est pourquoi echo command | ssh server lancera un shell de connexion non interactif. Vous pouvez également en démarrer un avec bash -l -c command.

Si vous voulez jouer avec cela, vous pouvez tester les différents types de Shell comme suit:

  • Ce Shell est-il interactif?

    Vérifiez le contenu de la variable $-. Pour les shells interactifs, il inclura i:

    ## Normal Shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive Shell
    $ bash -c 'echo $-'
    hBc
    
  • Est-ce un shell de connexion?

    Il y a pas de moyen portable de vérifier cela, mais pour bash, vous pouvez vérifier si l'option login_Shell est définie:

    ## Normal Shell, just running a command in a terminal: interacive
    $ shopt login_Shell 
    login_Shell     off
    ## Login Shell; 
    $ ssh localhost
    $ shopt login_Shell 
    login_Shell     on
    

En réunissant tous ces éléments, voici l'un des types de shell possibles:

## Interactive, non-login Shell. Regular terminal
$ echo $-; shopt login_Shell
himBHs
login_Shell     off

## Interactive login Shell
$ bash -l
$ echo $-; shopt login_Shell
himBHs
login_Shell     on

## Non-interactive, non-login Shell
$ bash -c 'echo $-; shopt login_Shell'
hBc
login_Shell     off

## Non-interactive login Shell
$ echo 'echo $-; shopt login_Shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_Shell     on
36
terdon

Qu'un shell soit connecté ou non, qu'il soit interactif ou non, est essentiel pour une seule et même raison:

Les fichiers d'initialisation et les options par défaut définis varient selon qu'un shell est connecté ou non et interactif ou non.

En conséquence, le fait qu'un shell soit connecté ou non, ou interactif ou non dépend uniquement de l'invocation utilisée - du nom exact de la commande et des options.

Les deux propriétés sont par ailleurs orthogonales - qu’un shell soit connecté ou non n’a aucune incidence sur la détermination de son interactivité ou non.

Bash lance un shell de connexion si l’une d’entre elles est vraie:

  • argv[0], le nom de la commande sous laquelle il a été appelé commence par -
  • l'option -l est spécifiée

Semblable, bash démarre un shell interactif si l’un d’eux est vrai:

  • il n'a pas été spécifié de fichier à exécuter (c'est-à-dire que la commande n'était pas bash some/file) ou de chaîne de commande à exécuter (bash -c 'foo') (la condition réelle est un peu plus complexe, voir le manuel).
  • l'option -i a été spécifiée

Notamment (et paradoxalement), ce dernier implique que bash -ic 'foo' démarre un shell interactif.

Ce qui suit commence donc une connexion, un shell interactif, même s’il n’a absolument rien de interactif et que l’invocation n’a rien à voir avec la connexion:

bash -lic true

Le fait de se connecter via la console ou l'interface graphique démarre un login (ou peut-être pas) est entièrement un effet du processus de connexion utilisant l'invocation appropriée.

Les conditions et les effets sont décrits en détail dans Manuel de bash, section Fichiers de démarrage .


Une source de confusion majeure est qu’il existe une autre signification commune pour "login" Shell:

Le shell de connexion d'un utilisateur est le shell défini dans l'entrée passwd de cet utilisateur (qui peut provenir de /etc/passwd, de LDAP ou d'une autre source).

Le programme login, SSH, etc. démarrent ce Shell en tant que login Shell au sens de la suite de la réponse - avec généralement un - en tête dans le nom de la commande. Si vous voulez être particulièrement déroutant, vous pouvez dire:

Certains processus de connexion démarrent le shell de connexion de l'utilisateur en tant que shell de connexion.

Notez que la connexion par l’interface utilisateur démarre un shell de connexion uniquement parce que les développeurs le jugeaient commode - LightDM exécute un script lors de la connexion qui, de toute évidence, n’est pas interactif et ne dépend certainement pas du shell de connexion de l’utilisateur (au deuxième sens). Ne comptez pas sur le gestionnaire d’affichage pour démarrer un shell de connexion, ce n’est pas le cas de tous, et sur Wayland et GNOME, le processus de connexion n’utilise pas du tout les scripts du shell.

6
muru

Shell de connexion:

Le premier processus qui s'exécute sous notre ID utilisateur lorsque nous nous connectons à une session. Le processus de connexion indique au shell de se comporter comme un shell de connexion avec une convention: passer l'argument 0, qui correspond normalement au nom de l'exécutable du shell, avec le caractère "-" ajouté

Shell interactif:

Lit les commandes de l'utilisateur sur un terminal. Entre autres choses, un tel shell lit les fichiers de démarrage lors de l'activation, affiche une invite et active le contrôle des travaux par défaut. L'utilisateur peut interagir avec le shell. Un shell exécutant un script est toujours un shell non interactif.

Autrement dit: Interactive Shell nécessite la saisie de l'utilisateur, tandis que le non-interactif est exécuté par des scripts et ne nécessite aucune saisie de l'utilisateur.

3
George Udosen