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

В Ubuntu 14.04 вы можете сделать это следующим образом:

sudo aptitude install libgtk2.0-0:i386 libcanberra-gtk0:i386 libdbus-glib-1-2:i386 libgconf-2-4:i386 liborbit-2-0:i386 libusb-0.1-4:i386 libgnomevfs2-0:i386 libice6:i386 libncurses5:i386 libsm6:i386 libxtst6:i386 libxt6:i386 libasound2:i386 libgcrypt11:i386 libudev0:i386
9
задан 26 September 2017 в 18:32

4 ответа

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

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

Начальная точка - оболочка bash работает на PID 25050:
$ ps
  PID TTY          TIME CMD
25050 pts/17   00:00:00 bash
25200 pts/17   00:00:00 ps
Запуск 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
Выход из sudo su и возврат к начальная точка - оболочка bash работает на PID 25050:
$ ps
  PID TTY          TIME CMD
25050 pts/17   00:00:00 bash
25214 pts/17   00:00:00 ps
$
14
ответ дан 22 May 2018 в 18:23

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

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

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

Даже если ваш терминал (возможно!) [D3] Корпуса и терминалы - это разные вещи. , а не физическая, тем не менее shell [ ! d4], такие как Ubuntu, назначают узлы устройства каждому из ваших терминалов, и вы можете проверить, какой терминал вы используете с помощью команды terminal . Обычно это /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 создает новую оболочку физический , используемый вами терминал не изменяется.

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

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

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

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

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

Оболочка встроена, как cd, не работает, t создать новый процесс вообще, если они не используются в конструкции, которая использует подоболочку (объяснено здесь), такую ​​как группировка ( ) и конвейеры. Вы можете сказать оболочке не дождаться завершения команды, выполнив команду асинхронно. Вы делаете это, завершая команду с помощью &. (your-command arguments... &) Вы можете использовать управление заданиями для изменения команды, если таковая имеется, оболочка ждет. С встроенным disown вы можете отделить задания от своего терминала.

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

Встроенные оболочки, такие как cd, вообще не создают новый процесс, если только они не используются в конструкции, которая использует (см. здесь), например ( ) группировка и конвейеры. Вы можете Shell встроили вывод одной команды в другую подоболочку с |.

Поскольку команда 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
14
ответ дан 24 July 2018 в 18:39

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

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

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

Даже если ваш терминал (возможно!) Корпуса и терминалы - это разные вещи. , а не физическая, тем не менее shell [ ! d4], такие как Ubuntu, назначают узлы устройства каждому из ваших терминалов, и вы можете проверить, какой терминал вы используете с помощью команды terminal . Обычно это /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 создает новую оболочку физический , используемый вами терминал не изменяется.

Конечно, есть еще один способ заметить, что терминал один и тот же: вы все равно записываете ввод таким же образом и в том же месте, и читаете вывод таким же образом и в одном и том же месте. [!d26 ]

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

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

Ваша оболочка все еще запущена, но она ждет в фоновом режиме для завершения программы (или для вас дочерний процесс [!d31 ]).

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

Оболочка встроена, как cd, не работает, t создать новый процесс вообще, если они не используются в конструкции, которая использует подоболочку (объяснено здесь), такую ​​как группировка ( ) и конвейеры. Вы можете сказать оболочке не дождаться завершения команды, выполнив команду асинхронно. Вы делаете это, завершая команду с помощью &. (your-command arguments... &) Вы можете использовать управление заданиями для изменения команды, если таковая имеется, оболочка ждет. С встроенным disown вы можете отделить задания от своего терминала.

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

Встроенные оболочки, такие как cd, вообще не создают новый процесс, если только они не используются в конструкции, которая использует (см. здесь), например ( ) группировка и конвейеры. Вы можете
Shell встроили вывод одной команды в другую подоболочку с |.

Поскольку команда 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
ответ дан 22 May 2018 в 18:23

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

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

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

Даже если ваш терминал (возможно!) [D3] Корпуса и терминалы - это разные вещи. , а не физическая, тем не менее shell [ ! d4], такие как Ubuntu, назначают узлы устройства каждому из ваших терминалов, и вы можете проверить, какой терминал вы используете с помощью команды terminal . Обычно это /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 создает новую оболочку физический , используемый вами терминал не изменяется.

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

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

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

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

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

Оболочка встроена, как cd, не работает, t создать новый процесс вообще, если они не используются в конструкции, которая использует подоболочку (объяснено здесь), такую ​​как группировка ( ) и конвейеры. Вы можете сказать оболочке не дождаться завершения команды, выполнив команду асинхронно. Вы делаете это, завершая команду с помощью &. (your-command arguments... &) Вы можете использовать управление заданиями для изменения команды, если таковая имеется, оболочка ждет. С встроенным disown вы можете отделить задания от своего терминала.

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

Встроенные оболочки, такие как cd, вообще не создают новый процесс, если только они не используются в конструкции, которая использует (см. здесь), например ( ) группировка и конвейеры. Вы можете Shell встроили вывод одной команды в другую подоболочку с |.

Поскольку команда 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
ответ дан 18 July 2018 в 06:42

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

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