Apakah sudo su membuat terminal anak?

9

Inilah yang terjadi ketika saya dieksekusi sudo sudiikuti olehexit

$ sudo su
# exit
exit
$ 

Perintah keluar tidak menutup emulator terminal saya.

Apakah ini terminal anak?

Reeshabh Ranjan
sumber

Jawaban:

15

Setelah Anda mengeksekusi sudo suatau shell baru sedang dibuat.su user

Eksekusi exit(atau Ctrl+ D) akan keluar dari shell yang baru dibuat dan akan mengembalikan Anda ke shell sebelumnya.

  1. Titik awal - bash shell dijalankan pada PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
    
  2. Menjalankan sudo sumenciptakan proses bash baru yang berjalan pada 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. Keluar sudo sudan kembali ke titik awal - bash shell berjalan pada PID 25050:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $
    
Yaron
sumber
Jadi, bisakah itu diperlakukan sebagai cangkang anak?
Reeshabh Ranjan
1
@ReeshabhRanjan - ya
Yaron
17

Terminal yang sama, shell yang berbeda.

Proses anak yang Anda jalankan dari shell, termasuk shell anak, menggunakan terminal yang sama secara otomatis. Ini tidak spesifik untuk sudocara apa pun - ini umumnya cara kerjanya ketika Anda menjalankan program apa pun dari shell Anda.

Kerang dan terminal adalah hal yang berbeda. Sebuah shell adalah apa yang Anda gunakan untuk menjalankan perintah dalam terminal . Shell dapat beroperasi secara interaktif - ia memberi Anda prompt, Anda memberikannya perintah, menjalankan perintah atau menunjukkan kesalahan tentang mengapa ia tidak bisa, dan proses berulang sampai Anda keluar dari shell. Atau dapat beroperasi secara nonaktif, menjalankan skrip .

Meskipun terminal Anda (mungkin!) Dicontoh , bukan fisik , sistem operasi mirip Unix seperti Ubuntu menetapkan node perangkat ke masing-masing terminal Anda, dan Anda dapat memeriksa terminal apa yang Anda gunakan dengan ttyperintah. Ini biasanya akan /dev/pts/0, /dev/pts/1, /dev/pts/2, dll , untuk jendela terminal atau koneksi SSH , atau /dev/tty1, /dev/tty2, dll , untuk konsol virtual . Sebenarnya apa yang harus ttydilakukan adalah memberi tahu Anda dari terminal mana, jika ada, input diambil; lihat di bawah untuk detailnya.

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

Anda dapat melihat itu, meskipun sudo sumembuat shell baru seperti yang dijelaskan Yaron dengan sangat baik , terminal yang Anda gunakan tidak berubah.

Tentu saja, ada cara lain untuk mengamati bahwa terminalnya sama: Anda masih menulis input dengan cara yang sama dan di tempat yang sama, dan membaca output dengan cara yang sama dan di tempat yang sama.

Beberapa detail teknis

Sebagian besar perintah yang dijalankan dalam shell - seperti ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, dan banyak lagi - menyebabkan proses anak yang akan dibuat. Proses anak ini memiliki shell Anda sebagai induknya tetapi merupakan program yang terpisah. Secara default, ini terhubung ke terminal yang sama dengan shell Anda.

Shell Anda masih berjalan, tetapi menunggu di latar belakang program untuk menghentikan (atau Anda untuk menangguhkannya ). Ketika program berakhir, shell masih berjalan dan melanjutkan operasi, meminta Anda untuk perintah Anda berikutnya.

Ini adalah pengecualian utama:

Meskipun saya tidak akan benar-benar menganggap ini pengecualian untuk proses anak yang terhubung ke terminal yang sama dengan orang tua mereka, perhatikan bahwa proses yang Anda jalankan dari shell di terminal tidak akan selalu mengambil input dari terminal itu atau mengirim output ke terminal itu :

Karena ttyperintah hanya memeriksa terminal mana input standarnya, Anda dapat "membodohinya":

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

Atau, yang kurang jelas:

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