继承环境下sudo和su的区别

继承环境下sudo和su的区别
  1. 为什么命令可以sudo从父shell进程继承环境来运行,而sudo suroot用户之后的shell进程却不能?

    t@ocean:/tmp$ export ME=tim
    t@ocean:/tmp$ sudo echo $ME
    tim
    
    t@ocean:/tmp$ sudo su
    root@ocean:/tmp# echo $ME
    
    root@ocean:/tmp# exit
    
  2. 环境是从父进程继承到子进程的吗?

  3. sudo suroot用户之后的shell进程是前一个用户的shell进程的子进程吗?

谢谢。

答案1

环境变量扩展是由 shell 完成的,因此您实际运行的命令是“sudo echo tim”。这一切都是在 sudo 运行之前完成的。

答案2

  1. 变量扩展由交互式 shell 执行。您正在运行sudo带有参数echo和 的命令tim。如果您希望在由 调用的 shell 中进行扩展sudo,请告诉它运行 shell 并将字符串传递echo $ME给该 shell:

    sudo sh -c 'echo $ME'
    

    sudo从环境中删除大多数变量,因为它们在某些情况下可能会带来安全风险。有关详细信息,请参阅手册和机器的配置。使用典型的配置,变量ME将从环境中删除,因此sudo sh -c 'echo $ME'不会打印任何内容。

  2. 进程的环境是其父进程的副本,除非父进程决定更改它。 (更准确地说,环境被传递给execve;大多数程序只是通过它们所拥有的一切。)Sudo 是决定改变环境的程序之一。

  3. 如果您运行sudo su,则会运行 shell(因为您没有将命令传递给su)。该 shell 进程的父进程是调用的进程sudo,即运行命令的 shell sudo su

相关内容