Erstellt sudo su ein untergeordnetes Terminal?

9

Dies ist, was passiert ist, als ich ausgeführt habe, sudo sugefolgt vonexit

$ sudo su
# exit
exit
$ 

Der Befehl exit schließt meinen Terminalemulator nicht.

Ist es ein Kinderterminal?

Reeshabh Ranjan
quelle

Antworten:

15

Sobald Sie ausführen sudo suoder eine neue Shell erstellt wird.su user

Durch Ausführen exit(oder Ctrl+ D) wird die neu erstellte Shell beendet und Sie kehren zu Ihrer vorherigen Shell zurück.

  1. Startpunkt - Bash Shell läuft auf PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. Durch Ausführen sudo suwird ein neuer Bash-Prozess erstellt, der unter PID 25203 ausgeführt wird:

    $ 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. Beenden sudo suund Zurückkehren zum Startpunkt - Die Bash-Shell läuft unter PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
Yaron
quelle
Kann das also als Kinderhülle behandelt werden?
Reeshabh Ranjan
1
@ ReeshabhRanjan - ja
Yaron
17

Gleiches Terminal, andere Shell.

Untergeordnete Prozesse, die Sie von einer Shell aus ausführen, einschließlich untergeordneter Shells, verwenden dasselbe Terminal automatisch. Dies ist sudoin keiner Weise spezifisch - so funktioniert es im Allgemeinen, wenn Sie ein Programm von Ihrer Shell aus ausführen.

Muscheln und Terminals sind verschiedene Dinge. Mit einer Shell können Sie Befehle in einem Terminal ausführen . Eine Shell kann interaktiv arbeiten - sie gibt Ihnen eine Eingabeaufforderung, Sie geben ihr einen Befehl, sie führt den Befehl aus oder zeigt einen Fehler an, warum dies nicht möglich ist, und der Vorgang wird wiederholt, bis Sie die Shell beenden. Oder es kann nicht interaktiv arbeiten und ein Skript ausführen .

Auch wenn Ihr Terminal (wahrscheinlich!) Emuliert , nicht körperliche , dennoch Unix-ähnlichen Systemen wie Ubuntu assign Betriebsgeräteknoten zu jedem Ihrer Terminals, und Sie können überprüfen , was Terminal Sie mit dem verwendeten ttyBefehl. Es wird in der Regel /dev/pts/0, /dev/pts/1, /dev/pts/2, usw. , für ein Terminal - Fenster oder SSH - Verbindung , oder /dev/tty1, /dev/tty2, usw. , für virtuelle Konsolen . Was ttySie wirklich tun müssen, ist Ihnen zu sagen, von welchem ​​Terminal, falls vorhanden, Eingaben stammen. siehe unten für Details.

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

Sie können sehen, dass sich das von Ihnen verwendete Terminal nicht ändert , obwohl sudo sueine neue Shell erstellt wird, wie Yaron sehr gut erklärt .

Natürlich gibt es eine andere Möglichkeit, um festzustellen, dass das Terminal dasselbe ist: Sie schreiben die Eingabe immer noch auf dieselbe Weise und an derselben Stelle und lesen die Ausgabe auf dieselbe Weise und an derselben Stelle.

Ein paar technische Details

Die meisten Befehle ausführen Sie in einem Shell - wie ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, und viele mehr - bewirken , dass ein Kind - Prozess erstellt werden. Dieser untergeordnete Prozess hat Ihre Shell als übergeordnetes Element, ist jedoch ein separates Programm. Standardmäßig ist es mit demselben Terminal wie Ihre Shell verbunden.

Ihre Shell wird noch ausgeführt, wartet jedoch im Hintergrund darauf, dass das Programm beendet wird (oder dass Sie es anhalten ). Wenn das Programm beendet wird, wird die Shell weiterhin ausgeführt und der Betrieb wieder aufgenommen, sodass Sie zur Eingabe Ihres nächsten Befehls aufgefordert werden.

Dies sind die Hauptausnahmen:

Obwohl ich dies nicht wirklich als Ausnahme für untergeordnete Prozesse betrachten würde, die mit demselben Terminal wie das übergeordnete verbunden sind, beachten Sie, dass ein Prozess, den Sie von einer Shell in einem Terminal ausführen, nicht immer Eingaben von diesem Terminal entgegennimmt oder Ausgaben an dieses Terminal sendet ::

Da der ttyBefehl nur prüft, welches Terminal seine Standardeingabe ist, können Sie ihn "täuschen":

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

Oder weniger verschlagen:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Eliah Kagan
quelle