Чи створює sudo su дитячий термінал?


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. Запуск 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створює нову оболонку, як дуже добре пояснює Ярон , термінал, який ви використовуєте, не змінюється.

Звичайно, є ще один спосіб зауважити, що термінал той самий: ви все одно пишете вхід тим самим і в тому самому місці, а читання виводиться так само і в тому самому місці.

Кілька технічних деталей

Більшість команд , які виконуються в оболонці - такі , як 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.