sudo su создают дочерний терминал?

Это - то, что произошло, когда я выполнился sudo su сопровождаемый exit

$ sudo su
# exit
exit
$ 

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

Действительно ли это - дочерний терминал?

9
задан 26 September 2017 в 08:32

2 ответа

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

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

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

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

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
    
15
ответ дан 23 November 2019 в 04:46

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

Дочерние процессы, которые Вы выполняете от оболочки, включая дочерние оболочки, используют тот же терминал автоматически. Это не характерно для 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
17
ответ дан 23 November 2019 в 04:46

Другие вопросы по тегам:

Похожие вопросы: