Quais são as diferenças entre “su”, “sudo -s”, “sudo -i”, “sudo su”?

133

Eu já li no manual, mas não vejo diferença ...

su - altere o ID do usuário ou torne-se superusuário

sudo -s [command]

A opção -s (shell) executa o shell especificado pela variável de ambiente SHELL se estiver definida ou o shell conforme especificado em passwd (5). Se um                    comando é especificado, ele é passado para o shell para execução. Caso contrário, um shell interativo é executado.

sudo -i desaparece a descrição no manual

    
por Smile.Hunter 22.10.2011 / 08:11

5 respostas

111

A principal diferença entre esses comandos está na maneira como eles restringem o acesso às suas funções.

su (que significa "usuário substituto" ou "alternar usuário") - faz exatamente isso, ele inicia outra instância do shell com privilégios do usuário de destino. Para garantir que você tenha os direitos para fazer isso, ele solicita a senha do usuário de destino . Então, para se tornar root, você precisa saber a senha do root. Se houver vários usuários em sua máquina que precisem executar comandos como root, todos eles precisarão saber a senha do root - note que ela será a mesma senha. Se você precisar revogar as permissões de administrador de um dos usuários, precisará alterar a senha do root e informá-la apenas para as pessoas que precisam manter o acesso - confuso.

sudo (hmm ... qual é o mnemônico? Super-User-DO?) é completamente diferente. Ele usa um arquivo de configuração (/ etc / sudoers) que lista quais usuários têm direitos para ações específicas (execute comandos como root, etc.) Quando chamado, ele solicita a senha do usuário que o iniciou - para garantir que a pessoa no terminal seja realmente a mesma "joe" listada em /etc/sudoers . Para revogar privilégios de administrador de uma pessoa, você só precisa editar o arquivo de configuração (ou remover o usuário de um grupo listado nessa configuração). Isso resulta em um gerenciamento muito mais limpo de privilégios.

Como resultado disso, em muitos sistemas baseados em Debian root user não possui um conjunto de senhas - ou seja, não é possível fazer login como root diretamente.

Além disso, /etc/sudoers permite especificar algumas opções adicionais - por exemplo, o usuário X só pode executar o programa Y etc.

A combinação sudo su usada com frequência funciona da seguinte maneira: primeiro sudo solicita a sua senha e, se tiver permissão para fazer isso, invoca o próximo comando ( su ) como um superusuário. Como su é invocado por root , não é necessário inserir a senha do usuário de destino. Portanto, sudo su permite que você abra um shell como outro usuário (incluindo root), se você tiver permissão para acessar superusuários pelo arquivo /etc/sudoers .

    
por Sergey 22.10.2011 / 09:21
48

sudo permite que você execute comandos em sua própria conta de usuário com privilégios de root. su permite alternar o usuário para que você esteja realmente logado como root.

sudo -s executa um shell com privilégios de root. sudo -i também adquire o ambiente do usuário raiz.

Para ver a diferença entre su e sudo -s , do cd ~ e, em seguida, pwd após cada um deles. No primeiro caso, você estará no diretório inicial do root, porque você é root. No segundo caso, você estará em seu próprio diretório pessoal, porque você está com privilégios de root.

Há mais discussões sobre essa questão exata aqui .

    
por Mike Scott 22.10.2011 / 08:28
27

Esta resposta é uma cópia da minha resposta em um bobo desta questão , coloque aqui a resposta canônica para que as pessoas possam encontrá-la!

A principal diferença entre sudo -i e sudo -s é:

  • sudo -i fornece o ambiente raiz, ou seja, seu ~/.bashrc é ignorado.
  • sudo -s oferece o ambiente do usuário, portanto, seu ~/.bashrc é respeitado.

Aqui está um exemplo, você pode ver que eu tenho um aplicativo lsl no meu diretório ~/.bin/ , que é acessível via sudo -s , mas não acessível com sudo -i . Note também que o prompt do Bash muda como será com sudo -i , mas não com sudo -s :

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Embora sudo -s seja conveniente para oferecer o ambiente com o qual você está familiarizado, recomendo o uso de sudo -i por dois motivos:

  1. O lembrete visual de que você está em uma sessão 'raiz'.
  2. É muito menos provável que o ambiente raiz seja envenenado com malware, como uma linha não autorizada em .bashrc .
por dotancohen 08.11.2014 / 15:07
6

su pede a senha do usuário "root".

sudo pede sua própria senha (e também verifica se você tem permissão para executar comandos como root, que é configurado através de /etc/sudoers - por padrão, todas as contas de usuário que pertencem ao grupo "admin" são permitidas usar o sudo).

sudo -s inicia um shell como root, mas não altera seu diretório de trabalho. sudo -i simula um login na conta root: seu diretório de trabalho será /root , e o .profile etc. do root será originado como se fosse um login.

    
por Marius Gedminas 22.10.2011 / 21:38
2

No Ubuntu ou em um sistema relacionado, não encontro muita utilidade para su no sentido tradicional do superusuário. sudo lida com esse caso muito melhor. No entanto, su é ótimo para se tornar outro usuário em situações únicas em que a configuração de sudoers seria tola.

Por exemplo, se eu estiver consertando meu sistema de um live CD / USB, geralmente montarei meu disco rígido e outras coisas necessárias e chroot no sistema. Nesse caso, meu primeiro comando é geralmente:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

Dessa forma, estou operando não como root, mas como meu usuário normal, e então uso sudo conforme apropriado.

    
por Scott Severance 26.10.2011 / 09:23