Создает ли sudo дочерний терминал?

9

Это то, что случилось, когда я казнил, sudo suа затемexit

$ sudo su
# exit
exit
$ 

Команда выхода не закрывает мой эмулятор терминала.

Это дочерний терминал?

Ризхаб Ранджан
источник

Ответы:

16

После того, как вы выполните sudo suили новая оболочка создается.su user

Выполнение exit(или Ctrl+ D) закроет вновь созданную оболочку и вернет вас к предыдущей оболочке.

  1. Начальная точка - оболочка bash работает на PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. Running sudo suсоздает новый процесс bash, который выполняется на 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. Выход sudo suи возврат в начальную точку - оболочка bash работает на PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
Ярон
источник
Так может ли это рассматриваться как дочерняя оболочка?
Reeshabh Ranjan
1
@ ReeshabhRanjan - да
Ярон
17

Тот же терминал, другая оболочка.

Дочерние процессы, которые вы запускаете из оболочки, включая дочерние оболочки, автоматически используют один и тот же терминал. Это не относится ни к sudoкакому способу - это, как правило, работает, когда вы запускаете любую программу из вашей оболочки.

Снаряды и терминалы это разные вещи. Оболочки является то , что вы используете для выполнения команд в терминале . Оболочка может работать в интерактивном режиме - она ​​выдает подсказку, вы даете ей команду, запускает команду или показывает ошибку, почему она не может, и процесс повторяется до тех пор, пока вы не выйдете из оболочки. Или он может работать не интерактивно, запуская скрипт .

Хотя ваш терминал (вероятно!) Эмулируется , а не физический , тем не менее Unix-подобные операционные системы, такие как Ubuntu, назначают узлы устройства каждому из ваших терминалов, и вы можете проверить, какой терминал вы используете с помощью ttyкоманды. Это , как правило /dev/pts/0, /dev/pts/1, /dev/pts/2, и т.д. , для окна терминала или подключения SSH , или /dev/tty1, /dev/tty2, и т.д. , для виртуальных консолей . На самом деле то, что ttyнужно, это сказать вам, с какого терминала, если он есть, берется вход ; подробности смотрите ниже.

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:~$

Вы можете видеть, что, несмотря sudo suна то, что Yaron создает новую оболочку, что очень хорошо объясняет , используемый вами терминал не меняется.

Конечно, есть еще один способ заметить, что терминал одинаков: вы по-прежнему пишете ввод одинаково и в одном месте и читаете вывод одинаково и в том же месте.

Несколько технических деталей

Большинство команд , которые выполняются в оболочке - такие , как ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, и многое другое - вызвать дочерний процесс должен быть создан. Этот дочерний процесс имеет вашу оболочку в качестве родителя, но это отдельная программа. По умолчанию он подключен к тому же терминалу, что и ваша оболочка.

Ваша оболочка все еще работает, но в фоновом режиме ожидает завершения программы (или пока вы не приостановите ее ). Когда программа завершается, оболочка все еще работает и возобновляет работу, запрашивая следующую команду.

Это основные исключения:

Хотя я бы не стал рассматривать это как исключение для дочерних процессов, подключенных к тому же терминалу, что и их родительский, обратите внимание, что процесс, который вы запускаете из оболочки в терминале, не всегда будет получать ввод с этого терминала или отправлять вывод на этот терминал :

Поскольку ttyкоманда только проверяет, какой терминал является ее стандартным вводом, вы можете «обмануть» его:

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

Или менее коварно:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Элия ​​Каган
источник