Sudo su bir çocuk terminali oluşturuyor mu?


Yanıtlar:


16

Bir kez yürüttüğünüzde sudo suveya yeni bir kabuk oluşturuluyor.su user

exit(Veya Ctrl+ D) yürütülmesi yeni oluşturulan kabuktan çıkar ve sizi önceki kabuğunuza döndürür.

  1. Başlangıç ​​noktası - bash kabuğu PID 25050'de çalışıyor:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. Running sudo su, PID 25203 üzerinde çalışan yeni bir bash işlemi oluşturur:

    $ 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. Çıkış sudo sunoktasından çıkıp başlangıç ​​noktasına geri dönme - bash kabuğu PID 25050'de çalışıyor:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $

Peki bu bir çocuk kabuğu gibi muamele edilebilir mi?
Reeshabh Ranjan

1
@ReshabhRanjan - yes
Yaron

17

Aynı terminal, farklı kabuk.

Kabuklardan çalıştırdığınız alt süreçler, alt kabuklar da dahil olmak üzere, aynı terminali otomatik olarak kullanır. Bu sudohiçbir şekilde spesifik değildir - kabuğunuzdan herhangi bir program çalıştırdığınızda bu genellikle böyle çalışır.

Kabuklar ve terminaller farklı şeylerdir. Bir kabuk bir komutları çalıştırmak için kullandığınız terminali . Kabuk etkileşimli olarak çalışabilir - size bir komut istemi verir, ona bir komut verir, komutu çalıştırır veya neden yapılamadığına dair bir hata gösterir ve kabuktan çıkıncaya kadar işlem tekrarlanır. Veya etkileşimli olarak çalışarak bir komut dosyası çalıştırabilir .

Terminaliniz taklit edilmiş olsa da (muhtemelen!) Ubuntu gibi Unix benzeri işletim sistemleri fiziksel değil , her bir terminalinize cihaz düğümleri atar ve komutla hangi terminali kullandığınızı kontrol edebilirsiniz . Genellikle olacak , , , vb bir için, terminal penceresinde veya SSH bağlantısı veya , , vb için, sanal konsolları . Gerçekten ne yaparsa, hangi terminalin (eğer varsa) girdinin alındığını söylemek ; ayrıntılar için aşağıya bakın.tty/dev/pts/0/dev/pts/1/dev/pts/2/dev/tty1/dev/tty2tty

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

Yaron'un çok iyi açıkladığı gibisudo su yeni bir kabuk oluştursa da , kullandığınız terminalin değişmediğini görebilirsiniz.

Tabii ki, terminalin aynı olduğunu gözlemlemenin başka bir yolu var: girişi aynı şekilde ve aynı yerde yazıyorsunuz ve çıktıyı aynı şekilde ve aynı yerde okuyorsunuz.

Birkaç teknik detay

Çoğu komutlar Kabuk'ta çalıştırmak - örneğin ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, ve birçok daha fazlası - neden çocuk süreç oluşturulacak. Bu alt süreç kabuğunuzu üst öğesi olarak kullanır ancak ayrı bir programdır. Varsayılan olarak, kabuğunuzla aynı terminale bağlıdır .

Kabuğunuz hala çalışıyor, ancak programın sonlandırılmasını (veya askıya almanızı ) arka planda bekliyor . Program sona erdiğinde, kabuk hala çalışmaya devam eder ve çalışmaya devam ederek bir sonraki komutunuzu ister.

Bunlar büyük istisnalar:

Gerçekten bu çocuk süreçler ebeveynlerinin, not olarak aynı terminaline bağlı olan bir istisnası dikkate olmaz olsa bir terminalde bir kabuk çalıştırmak bir süreç olacağı değil her zaman terminale o terminal veya gönderme çıkışından girdi alarak olmak :

Yana ttystandart girdidir terminali hangi komut sadece denetler, bunu "aptal" olabilir:

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

Veya daha az hırsla:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.