Diferenças entre sudo e su no ambiente herdado

1
  1. Por que o comando executado por sudo herda o ambiente do processo de shell pai, enquanto o processo shell após sudo su para o usuário root não faz?

    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. O ambiente é herdado dos processos pai para filho?

  3. O processo do shell após sudo su para o usuário raiz é um processo filho do processo de shell do usuário anterior?

Obrigado.

    
por Tim 09.05.2015 / 00:27

2 respostas

3
  1. A expansão da variável é executada pelo seu shell interativo. Você está executando o comando sudo com os argumentos echo e tim . Se você quiser que a expansão aconteça no shell chamado por sudo , diga para executar um shell e passar a string echo $ME para esse shell:

    sudo sh -c 'echo $ME'
    

    sudo remove a maioria das variáveis do ambiente, porque elas podem ser um risco de segurança em algumas circunstâncias. Veja o manual e a configuração da sua máquina para detalhes. Com configurações típicas, a variável ME seria removida do ambiente, portanto, sudo sh -c 'echo $ME' não imprimia nada.

  2. O ambiente de um processo é uma cópia de seu pai, a menos que o pai tenha decidido alterá-lo. (Mais precisamente, o ambiente é passado para execve ; a maioria dos programas simplesmente passa pelo que quer que seja tinha.) Sudo é um dos programas que decide mudar o ambiente.

  3. Se você executar sudo su , isso executará um shell (porque você não passou um comando para su ). O pai desse processo de shell é o processo que chamou sudo , ou seja, o shell em que você executou o comando sudo su .

por 09.05.2015 / 03:13
5

A expansão da variável de ambiente é feita pelo shell, então o comando que você está executando é o "sudo echo tim". Isso tudo é feito antes do sudo ser executado.

    
por 09.05.2015 / 01:08