Czy sudo su tworzy terminal potomny?

9

To, co się stało, kiedy wykonywane sudo sunastępnieexit

$ sudo su
# exit
exit
$ 

Polecenie exit nie zamyka mojego emulatora terminala.

Czy to terminal potomny?

Reeshabh Ranjan
źródło

Odpowiedzi:

16

Po uruchomieniu sudo sulub tworzeniu nowej powłoki.su user

Wykonanie exit(lub Ctrl+ D) spowoduje zamknięcie nowo utworzonej powłoki i powrót do poprzedniej powłoki.

  1. Punkt początkowy - powłoka bash działa na PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. Uruchamianie sudo sutworzy nowy proces bash, który działa na 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. Wyjście sudo sui powrót do punktu początkowego - powłoka bash działa na PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
Yaron
źródło
Czy to może być traktowane jak skorupa dziecka?
Reeshabh Ranjan
1
@ReeshabhRanjan - tak
Yaron
17

Ten sam terminal, inna powłoka.

Procesy potomne uruchamiane z powłoki, w tym powłoki potomne, używają automatycznie tego samego terminala. Nie jest to sudow żaden sposób specyficzne - na ogół działa to po uruchomieniu dowolnego programu z powłoki.

Powłoki i terminale to różne rzeczy. Powłoka jest to, czego używasz do uruchamiania poleceń w terminalu . Powłoka może działać interaktywnie - wyświetla monit, wydaje polecenie, uruchamia polecenie lub wyświetla komunikat o błędzie, dlaczego nie może, a proces powtarza się, dopóki nie opuścisz powłoki. Lub może działać nieinteraktywnie, uruchamiając skrypt .

Nawet jeśli terminal jest (prawdopodobnie!) Emulowane , nie fizyczny , niemniej uniksowych systemów operacyjnych takich jak Ubuntu Przypisywanie urządzeń węzłów do każdego z terminali, i można sprawdzić co zacisk korzystania z ttypolecenia. Zwykle będzie to /dev/pts/0, /dev/pts/1, /dev/pts/2, itd. , Na oknie terminala lub połączenia SSH lub /dev/tty1, /dev/tty2, itp , na wirtualnych konsolach . Naprawdę to, co ttyrobi jest powiedzieć, który zacisk ewentualne wejście jest wzięte z; szczegóły poniżej.

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

Widać, że chociaż sudo sutworzy nową powłokę, jak bardzo dobrze wyjaśnia Yaron , terminal, którego używasz, nie zmienia się.

Oczywiście istnieje inny sposób zaobserwowania, że ​​terminal jest taki sam: nadal piszesz dane wejściowe w ten sam sposób i w tym samym miejscu, i odczytujesz dane wyjściowe w ten sam sposób i w tym samym miejscu.

Kilka szczegółów technicznych

Większość poleceń uruchomić w powłoce - takie jak ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, i wiele więcej - spowodować proces dziecko ma zostać utworzony. Ten proces potomny ma powłokę jako swojego rodzica, ale jest to osobny program. Domyślnie jest podłączony do tego samego terminala co twoja powłoka.

Twoja powłoka nadal działa, ale w tle czeka na zakończenie programu (lub na jego zawieszenie ). Po zakończeniu programu powłoka nadal działa i wznawia działanie, monitując o następne polecenie.

Oto główne wyjątki:

Chociaż tak naprawdę nie uważałbym tego za wyjątek dla procesów potomnych podłączonych do tego samego terminala co ich rodzic, zauważ, że proces uruchamiany z powłoki w terminalu nie zawsze będzie pobierał dane z tego terminala lub wysyłał dane wyjściowe do tego terminala :

Ponieważ ttypolecenie sprawdza tylko, który terminal jest jego standardowym wejściem, możesz go oszukać:

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

Lub mniej przebiegle:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Eliah Kagan
źródło