49 votes

Différencier les connexions interactives des connexions non interactives Shell.

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

  • interactif - login Shell
  • interactive - non-login Shell
  • non interactif - login Shell
  • non-interactif - non-login Shell

Si j'ai bien compris
interactif - non login Shell : Démarrer le système, se connecter au système et ouvrir le terminal et
non-interactif - login Shell Telnet : se connecter au système et ouvrir une session

Mais qu'en est-il d'une connexion interactive - login Shell ?
Se connecte-t-il au système, ouvre-t-il un terminal virtuel et se connecte-t-il ? et
non-interactif - sans login Shell, exécute-t-il un Shell automatisé dans la crontab ?

79voto

Stewart Points 1385

La seule idée fausse que vous semblez avoir concerne ce qui constitue un Shell non interactif.

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

  • connexion interactive Shell : Vous vous connectez à un ordinateur distant via, par exemple ssh . Vous pouvez également vous connecter à un tty sur votre machine locale ( Ctrl + Alt + F1 ) et s'y connecter.

  • interactive non-login Shell : Ouvrir un nouveau terminal.

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

  • connexion non interactive Shell : Cette situation est extrêmement rare et il est peu probable que vous la rencontriez. Une façon de le lancer est echo command | ssh server . Quand ssh est lancé sans commande (donc ssh au lieu de ssh command qui exécutera command sur le Shell distant), il lance une connexion Shell. Si le stdin de la ssh n'est pas un tty, il démarre un Shell non interactif. C'est pourquoi echo command | ssh server lance un Shell de connexion non interactif. Vous pouvez également en lancer 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érifier le contenu du $- variable. Pour les shells interactifs, elle comprendra i :

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • S'agit-il d'un login Shell ?

    Il y a pas de moyen de transport de vérifier cela mais, pour bash, vous pouvez vérifier si l'option login_shell est activée :

    ## 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 mettant tout cela ensemble, voici un de chaque type possible de Shell :

## 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

10voto

muru Points 180007

Essentiellement, le fait qu'un Shell soit login ou non, interactif ou non, n'a d'importance que pour une seule raison :

Les fichiers d'initialisation et les options par défaut définies dépendent du fait qu'un Shell soit connecté ou non et interactif ou non.

Par conséquent, le fait qu'un Shell soit login ou non ou interactif ou non dépend uniquement de l'option invocation utilisé - le nom exact de la commande et les options.

Les deux propriétés sont par ailleurs orthogonales - le fait qu'un Shell soit login ou non n'a aucune incidence sur la détermination de son caractère interactif ou non.

Bash lance un Shell de connexion si l'un de ces éléments est vrai :

  • argv[0] le nom de la commande qui a été invoquée, commence par un -
  • die -l est spécifiée

De même, bash lance un Shell interactif si l'une de ces conditions est remplie :

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

Notamment (et paradoxalement), cette dernière implique que bash -ic 'foo' lance un Shell interactif.

Ainsi, ce qui suit lance un login, Shell interactif, même s'il n'a rien d'interactif et que l'invocation n'a rien à voir avec le login :

bash -lic true

Le fait que la connexion via la console ou l'interface graphique lance un Shell de connexion (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 le manuel bash, section sur les fichiers de démarrage .


Une source majeure de confusion réside dans le fait qu'il existe une autre signification commune pour "login" Shell :

Le Shell de connexion d'un utilisateur est le Shell défini dans la base de données de cet utilisateur. passwd (qui peut provenir de /etc/passwd LDAP ou toute autre source).

En login programme, SSH, etc. démarrez ce Shell comme un connexion Shell dans le sens indiqué dans le reste de la réponse - avec un signe de tête - dans le nom de la commande. Si vous voulez être particulièrement confus, vous pouvez dire :

Certains processus de connexion démarrent la connexion Shell de l'utilisateur en tant que connexion Shell.

Notez que le login GUI démarre un login Shell uniquement parce que les développeurs l'ont jugé pratique - LightDM exécute un Shell au login qui n'est évidemment pas interactif et ne dépend certainement pas du login Shell de l'utilisateur (dans le second sens du terme). Ne comptez pas sur le fait que le gestionnaire d'affichage démarre un Shell à la connexion, cependant - tous ne le font pas, et sur Wayland et GNOME, le processus de connexion n'utilise pas du tout Shell Shell.

4voto

George Udosen Points 33267

Connexion Shell :

Le premier processus qui s'exécute sous notre nom d'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 est normalement le nom de l'exécutable Shell, avec un caractère " - " en préambule.

Interactive Shell :

Lit les commandes de l'utilisateur sur un tty. Entre autres choses, un tel Shell lit les fichiers de démarrage à l'activation, affiche une invite et active le contrôle des tâches par défaut. L'utilisateur peut interagir avec le Shell. Un Shell exécutant un Shell est toujours un Shell non interactif.

En termes simples : les Shell interactifs requièrent l'intervention de l'utilisateur, tandis que les Shell non interactifs sont exécutés par des Shell et ne requièrent pas d'intervention de l'utilisateur.

1voto

Cheery Points 9929

Une catégorie de Shell (Non-interactive, login Shell avec options hBc) est manquante dans le fichier réponse acceptée . Elle est couramment utilisée contrairement à celle avec les options hBs pour exécuter une commande dans une session ssh. Pour s'en rendre compte, il suffit de comparer 4 et 5. Je l'ai inclus avec d'autres.

# Combination of login and interactive shells

#1. Interactive, login shell: himBHs
{
 bash --login
 echo $-
 shopt login_shell 
 logout    # use CTRL-D   : Note the difference here between 1 and 2
}                                                       
#2. Interactive, no-login shell: regular terminal: himBHs
{
 bash   
 echo $-
 shopt login_shell
 exit     # use CTRL-D   : Note the difference here between 1 and 2
}
#3. Interactive, no-login shell: executing commands from standard input - scripts: himBHs
{
cat <<-EOF > myfile && bash -s < myfile         
echo $-
shopt login_shell
EOF
}
#4. Non-interactive, login shell  - takes commands from standard input - pipes: hBs
echo 'echo $-; shopt login_shell' | ssh localhost   
#5. Non-interactive, login shell  - executes commands : hBc
ssh localhost  'echo $-; shopt login_shell'         
#6. Non-interactive, no-login shell : hBc
bash -c 'echo $-; shopt login_shell'                

Qu'est-ce qu'un login Shell ?

Il lit et exécute les commandes du premier fichier disponible (s'il existe) pendant la session de connexion dans l'ordre suivant :

  1. /etc/profil
  2. ~/.bash_profile,
  3. ~/.bash_login, et
  4. ~/.profile

Il lit et exécute les commandes de tous les fichiers (s'ils existent) pendant la déconnexion dans l'ordre suivant :

  1. ~/.bash_logout et
  2. /etc/bash.bash_logout

Nota: La différence entre l'appel des fichiers de connexion (uniquement le premier fichier disponible) et des fichiers de déconnexion (tous les fichiers).

    echo 'echo "Logging out ... $(date)"' >> ~/.bash_logout
    echo 'echo "Logging out from /etc/bash.bash_logout... $(date)"' | sudo tee -a /etc/bash.bash_logout 
    bash --login
    Ctrl-D    # logs out

Nota: Une confusion surgit toujours lorsque ~/.bashrc Les commandes de fichiers sont exécutées pendant la session de connexion Shell. En général, les commandes dans ~/.bashrc ne doit pas être exécuté pendant que le login Shell . Cependant, si elle se produit, c'est à cause de ~/.bash_profile Le fichier comprend ~/.bashrc dans ce fichier. Vérifiez votre ~/.bash_profile fichier. Il s'agit d'un comportement courant dans les distributions Linux basées sur Fedora.

Qu'est-ce qu'un Shell sans ouverture de session ?

Il lit et exécute les commandes du fichier de configuration spécifique à l'utilisateur : ~/.bashrc

Qu'est-ce qu'une session non interactive ?

Il lit et exécute les commandes de BASH_ENV variable. C'est également un moyen de contrôler le comportement d'une session non interactive.

echo "HELLO=WORLD" > ~/myrc
BASH_ENV=~/myrc bash -c 'echo $BASH_ENV; echo $HELLO'

Nota: BASH_ENV doit contenir le chemin complet du fichier Shell-Shell.

Nota: La session ssh remote non-interactive Shell ne lit pas BASH_ENV . Au lieu de cela, le texte est le suivant ~/.bashrc de l'utilisateur distant dans le système distant.

Nota: ssh les sessions distantes n'exécutent pas les commandes des fichiers mentionnés dans le login Shell (~/.bash_profile).

Cela ne fonctionnera pas :

BASH_ENV=~/myrc ssh localhost 'echo $BASH_ENV; echo $HELLO'

ssh remoteuser@localhost  'echo $HELLO'

Cela fonctionnera : Parce que, .bashrc appartient à l'utilisateur actuel qui est supposé être l'utilisateur distant, et le système distant est supposé être localhost dans cet exemple.

echo 'HELLO=WORLD' >> ~/.bashrc
ssh localhost  'echo $HELLO'

Comment contrôler le comportement du login Shell ?

  1. en utilisant --noprofile pour désactiver la lecture des commandes des fichiers mentionnés ci-dessus dans le login Shell.

    echo "HELLO=WORLD1" >> ~/.bash_profile
    bash --login
    echo $HELLO
    bash --login --noprofile
    echo $HELLO

Comment contrôler le comportement de no-login Shell ?

  1. en utilisant --rcfile option permettant de spécifier un fichier rc spécifique à l'utilisateur
  2. en utilisant --norc option pour désactiver la lecture des commandes des fichiers mentionnés ci-dessus dans no-login Shell.

0voto

SantaXL Points 111

J'aimerais mentionner que vous pouvez lancer un login interactif Shell par :

  1. Exécution sudo /bin/login et en saisissant vos données d'identification
  2. Exécution exec -l /bin/bash
  3. Exécution su -
  4. et comme les réponses ci-dessus l'ont indiqué, en utilisant ssh et en se connectant à une machine distante

Vous pouvez également vérifier (en bash) si le Shell est connecté en tapant echo $0 et si le résultat commence par un tiret - Il s'agit alors d'un login Shell.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X