To, co się stało, kiedy wykonywane sudo su
następnieexit
$ sudo su
# exit
exit
$
Polecenie exit nie zamyka mojego emulatora terminala.
Czy to terminal potomny?
To, co się stało, kiedy wykonywane sudo su
następnieexit
$ sudo su
# exit
exit
$
Polecenie exit nie zamyka mojego emulatora terminala.
Czy to terminal potomny?
Odpowiedzi:
Po uruchomieniu sudo su
lub 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.
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
Uruchamianie sudo su
tworzy 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
Wyjście sudo su
i 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
$
Procesy potomne uruchamiane z powłoki, w tym powłoki potomne, używają automatycznie tego samego terminala. Nie jest to sudo
w ż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 tty
polecenia. 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 tty
robi 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 su
tworzy 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.
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:
cd
ogóle nie tworzą nowego procesu, chyba że są używane w konstrukcji, która wykorzystuje podpowłokę ( wyjaśnioną tutaj ), taką jak (
)
grupowanie i potoki .&
. ( your-command arguments... &
)disown
wbudowanego polecenia , można odłączyć zadania z terminalu.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 :
<
, >
i >>
operatorów.|
.Ponieważ tty
polecenie 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