sudo su是否创建子终端?


Answers:


16

一旦执行sudo su或正在创建新的外壳。su user

执行exit(或Ctrl+ D)将退出新创建的外壳,并使您返回上一个外壳。

  1. 起点-bash shell在PID 25050上运行:

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
    
  2. 运行将sudo su创建一个新的bash进程,该进程在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. 退出sudo su并返回起点-bash shell在PID 25050上运行:

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

那么可以将其视为子弹吗?
Reeshabh Ranjan

1
@ReeshabhRanjan-是的
Yaron

17

相同的终端,不同的外壳。

从外壳程序运行的子进程(包括子外壳程序)会自动使用同一终端。这不是以sudo任何方式特定的,这通常是您从shell运行任何程序时的工作方式。

外壳和端子是不同的东西。一个是你用什么来在运行命令终端。Shell可以交互操作-它会提示您,给您一个命令,运行该命令或显示有关其为什么无法执行的错误,然后重复该过程,直到您退出该Shell。或者,它可以非交互式地运行脚本

即使您的终端是(可能是)模拟的,而不是物理的,但是像Unix这样的类Unix操作系统(如Ubuntu)仍将设备节点分配给每个终端,并且您可以通过tty命令检查正在使用的终端。它通常是/dev/pts/0/dev/pts/1/dev/pts/2等等,对于一个终端窗口SSH连接,或/dev/tty1/dev/tty2等等,对于虚拟控制台。真正的目的tty是告诉您从哪个终端(如果有)输入。有关详情,请参见下文。

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的解释sudo su创建了一个新的Shell ,您使用的终端也不会改变。

当然,还有另一种方法可以观察到终端是相同的:您仍在以相同的方式和位置写输入,并以相同的方式和位置读输出。

一些技术细节

大多数命令你在一个shell中运行-比如lscpmvrmtouchwcdudfsshsusudoshbash,和许多更多-导致子进程来创建。该子进程将您的shell作为其父进程,但是它是一个单独的程序。默认情况下,它与外壳连接到同一终端。

您的shell仍在运行,但是它在后台等待程序终止(或让您挂起它)。程序终止时,shell仍在运行,并且继续运行,提示您输入下一条命令。

这些是主要的例外:

尽管我不会真的认为这是子进程与父进程连接到同一终端的例外,但请注意,从终端中的shell运行的进程并不总是从该终端获取输入或将输出发送到该终端:

由于该tty命令仅检查其标准输入是哪个终端,因此您可以“愚弄”它:

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

或者,不太明显地:

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.