Sudo su crée-t-il un terminal enfant?

9

C'est ce qui s'est passé lorsque j'ai exécuté sudo susuivi deexit

$ sudo su
# exit
exit
$ 

La commande exit ne ferme pas mon émulateur de terminal.

Est-ce un terminal enfant?

Reeshabh Ranjan
la source

Réponses:

16

Une fois que vous avez exécuté sudo suou qu'un nouveau shell est en cours de création.su user

L'exécution exit(ou Ctrl+ D) quittera le shell nouvellement créé et vous ramènera à votre shell précédent.

  1. Point de départ - le shell bash s'exécute sur le PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. L'exécution sudo sucrée un nouveau processus bash qui s'exécute sur le PID 25203:

    $ sudo su
    # ps
      PID TTY          TIME CMD
    25201 pts/17   00:00:00 sudo
    25202 pts/17   00:00:00 su
    25203 pts/17   00:00:00 bash
    25213 pts/17   00:00:00 ps
    # exit
  3. Quitter sudo suet revenir au point de départ - le shell bash s'exécute sur le PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
Yaron
la source
Alors, cela peut-il être traité comme un shell enfant?
Reeshabh Ranjan
1
@ReeshabhRanjan - oui
Yaron
17

Même terminal, coque différente.

Les processus enfants que vous exécutez à partir d'un shell, y compris les shells enfants, utilisent automatiquement le même terminal. Ce n'est pas spécifique à sudoen aucune façon - c'est généralement comment cela fonctionne lorsque vous exécutez un programme à partir de votre shell.

Les coques et les terminaux sont des choses différentes. Un shell est ce que vous utilisez pour exécuter des commandes dans un terminal . Un shell peut fonctionner de manière interactive - il vous donne une invite, vous lui donnez une commande, il exécute la commande ou affiche une erreur expliquant pourquoi il ne peut pas, et le processus se répète jusqu'à ce que vous quittiez le shell. Ou il peut fonctionner de manière non interactive, en exécutant un script .

Même si votre terminal est (probablement!) Émulé , pas physique , néanmoins des systèmes d'exploitation de type Unix comme Ubuntu attribuent des nœuds de périphérique à chacun de vos terminaux, et vous pouvez vérifier quel terminal vous utilisez avec la ttycommande. Il sera généralement /dev/pts/0, /dev/pts/1, /dev/pts/2, etc. , pour une fenêtre de terminal ou connexion SSH , ou /dev/tty1, /dev/tty2, etc. , pour les consoles virtuelles . En réalité, ce ttyqui est fait, c'est de vous dire à partir de quel terminal, le cas échéant, l' entrée est prise; voir ci-dessous pour plus de détails.

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$

Vous pouvez voir que, même s'il sudo sucrée un nouveau shell comme l'explique très bien Yaron , le terminal que vous utilisez ne change pas.

Bien sûr, il existe une autre façon de constater que le terminal est le même: vous écrivez toujours l'entrée de la même manière et au même endroit, et la lecture de la sortie de la même manière et au même endroit.

Quelques détails techniques

La plupart des commandes dans un shell - comme ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bashet beaucoup plus - provoquer un processus enfant à créer. Ce processus enfant a votre shell comme parent mais il s'agit d'un programme distinct. Par défaut, il est connecté au même terminal que votre shell.

Votre shell est toujours en cours d'exécution, mais il attend en arrière-plan que le programme se termine (ou que vous le suspendiez ). À la fin du programme, le shell est toujours en cours d'exécution et reprend son fonctionnement, vous invitant à entrer votre prochaine commande.

Ce sont les principales exceptions:

Bien que je ne considère pas vraiment cela comme une exception aux processus enfants connectés au même terminal que leur parent, notez qu'un processus que vous exécutez à partir d'un shell dans un terminal ne prendra pas toujours l'entrée de ce terminal ou n'en enverra pas de sortie à ce terminal. :

Comme la ttycommande ne vérifie que le terminal de son entrée standard, vous pouvez le "tromper":

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0

Ou, moins sournoisement:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Eliah Kagan
la source