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

148

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 -sopção (shell) executa o shell especificado pela variável de ambiente SHELL se estiver definido ou o shell conforme especificado em passwd (5). Se um comando for especificado, ele será passado para o shell para execução. Caso contrário, um shell interativo é executado.

sudo -i desaparecer descrição no manual

Smile.Hunter
fonte
7
Além disso, não use o su userlogin de shells não confiáveis, mas su - user. Veja unix.stackexchange.com/q/7013/8250
Lekensteyn
@Lekensteyn uau, ótimo exemplo. thx para o LOL :)
törzsmókus
1
lembre-se sempre do antigo mandamento: não reivindicar o nome da raiz em vão!
törzsmókus 30/01
Não estou dizendo que sudo -ié ruim, mas certamente você pode f *** coisas usá-lo
Kolob Canyon
Quase duplicado: askubuntu.com/questions/376199/...
Reinier pós

Respostas:

118

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

su (que significa "usuário substituto" ou "alternar usuário") - faz exatamente isso, 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 root. Se houver vários usuários em sua máquina que precisam executar comandos como root, todos eles precisam saber a senha root - observe que será a mesma senha. Se você precisar revogar as permissões de administrador de um dos usuários, precisará alterar a senha de root e informar somente às pessoas que precisam manter o acesso - desarrumado.

sudo (hmm ... qual é o mnemônico? Superusuário-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 (executar comandos como root, etc.) Quando chamado, solicita a senha do usuário que o iniciou - para garantir que a pessoa no terminal é realmente o mesmo "joe" que está listado 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 no Debian, o rootusuário não tem uma senha definida - ou seja, não é possível fazer login diretamente como root.

Além disso, /etc/sudoerspermite especificar algumas opções adicionais - ou seja, o usuário X só pode executar o programa Y etc.

A sudo sucombinação usada com frequência funciona da seguinte maneira: primeiro sudosolicita sua senha e, se você puder fazer isso, chama o próximo comando ( su) como superusuário. Como sué invocado por root, não é necessário inserir a senha do usuário de destino. Portanto, sudo supermite abrir um shell como outro usuário (incluindo root), se você tiver acesso de superusuário pelo /etc/sudoersarquivo.

Sergey
fonte
2
Eu nunca vi sucomo "alternar usuário", mas sempre como superusuário; o comportamento padrão sem o nome de usuário de outra pessoa (embora faça sentido). Da wikipedia : "O comando su, também conhecido como superusuário [1] desde 1974, também foi chamado de" usuário substituto "," usuário falso "ou" usuário definido "porque permite alterar a conta associada ao atual terminal (janela). "
precisa saber é o seguinte
5
@dr jimbob: você está certo, mas estou descobrindo que "mudar de usuário" é meio que descreve melhor o que faz - embora, historicamente, represente "super usuário". Eu também estou encantado ao descobrir que o artigo wikipedia é muito semelhante à minha resposta - Eu nunca vi o artigo antes de :)
Sergey
11
O significado oficial de "su" é "usuário substituto". Veja: "man su".
Anjo O'Sphere
1
@ AngelO'Sphere: Curiosamente, a página de manual do Ubuntu não menciona "substituto". A página de manual em gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) realmente diz "su: Execute um comando com ID de usuário e grupo substituto". Acho gnu.org é uma fonte canônica :)
Sergey
1
Que tal sudo su?
Kaz Wolfe 15/10
59

sudopermite executar comandos em sua própria conta de usuário com privilégios de root. supermite alternar usuário para que você efetue login como root.

sudo -sexecuta um shell com privilégios de root. sudo -itambém adquire o ambiente do usuário raiz.

Para ver a diferença entre sue sudo -s, faça cd ~e pwddepois de cada um deles. No primeiro caso, você estará no diretório inicial do root, porque é o root. No segundo caso, você estará em seu próprio diretório pessoal, porque possui privilégios de root.

Há mais discussão sobre essa pergunta exata aqui .

Mike Scott
fonte
20
"você é você mesmo com privilégios de root" não é o que está realmente acontecendo :) Na verdade, não é possível ser "você mesmo com privilégios de root" - seja você root ou você mesmo. Tente digitar whoami nos dois casos. O fato de os cd ~resultados serem diferentes é resultado do sudo -s não definir a variável de ambiente $ HOME.
Sergey
1
@ Emery, whoami que diz ser 'root' porque você está executando o cmd 'whoami' como se o tivesse subjugado, tão temporariamente (pela duração desse comando) você parece ser o usuário root, mas ainda pode não ter o acesso root de acordo com o arquivo sudoers.
Octopus
1
@ Octopus: o que eu estava tentando dizer é que, no Unix, um processo pode ter apenas um UID e esse UID determina as permissões do processo. Você não pode ser "você mesmo com privilégios de root", um programa é executado com o seu UID ou com o UID do root (0).
Sergey
5
Em relação a "você ainda pode não ter acesso root completo de acordo com o arquivo sudoers": o sudoersarquivo controla quem pode executar qual comando como outro usuário, mas isso acontece antes da execução do comando. No entanto, uma vez que você teve permissão para iniciar um processo como, digamos, root - o processo em execução possui o UID do root e tem acesso total ao sistema, não há como o sudo restringir isso. Novamente, você sempre é você mesmo ou raiz, não há "meio e meio". Portanto, se o sudoersarquivo permitir que você execute o shell como root - as permissões nesse shell seriam indistinguíveis de um shell raiz "normal".
Sergey
36

Esta resposta é um engano da minha resposta em um engodo desta pergunta , coloque aqui a resposta canônica para que as pessoas possam encontrá-la!

A principal diferença entre sudo -ie sudo -sé:

  • sudo -ifornece o ambiente raiz, ou seja, o seu ~/.bashrcé ignorado.
  • sudo -sfornece o ambiente do usuário, para que você ~/.bashrcseja respeitado.

Aqui está um exemplo, você pode ver que eu tenho um aplicativo lslno meu ~/.bin/diretório que é acessível via, sudo -smas não acessível sudo -i. Observe também que o prompt do Bash muda da mesma forma que com, sudo -imas 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 -sseja conveniente para fornecer o ambiente que você está familiarizado, recomendo o usosudo -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 por malware, como uma linha desonesta .bashrc.
dotancohen
fonte
Notei que o sudo -s não parece processar o / etc / profile, ou qualquer coisa que eu tenha no /etc/profile.d/ .. alguma idéia do porquê?
meffect 23/02
@dotancohen - O que você quer dizer com sudo -sfornece um ambiente com o qual o usuário está familiarizado?
Motivado
@dotancohen - O comando sudo -s já fornece dicas visuais, então estou curioso para saber por que o sudo -i é uma opção melhor.
Motivado
9

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

sudosolicita 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 pertencentes aos grupos "admin" ou "sudo" podem usar o sudo).

sudo -slança um shell como root, mas não altera seu diretório de trabalho. sudo -isimula um login na conta root: seu diretório de trabalho será /roote o root, .profileetc., será originado como se estivesse no login.

Marius Gedminas
fonte
1
para tornar a resposta mais completa: sudo -sé quase igual a su($ HOME é diferente) e sudo -ié igual asu -
DJCrashdummy
@DJCrashdummy - Por que você diz quase igual a? O que está diferente?
Motivado
2

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

Por exemplo, se eu estiver reparando meu sistema a partir de um CD / USB ativo, geralmente montarei meu disco rígido e outras coisas necessárias chrootno 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 depois uso sudoconforme apropriado.

Scott Severance
fonte
0
  • su Solicita a senha do root, torna-se root, abre um shell interativo sem login.
  • su - Solicita a senha do root, torna-se root, abre um shell de login interativo.

  • sudo -s Pergunta suas senhas, torna-se root, abre um shell interativo sem login.
  • sudo -i Pergunta suas senhas, torna-se root, abre um shell de login interativo.

A melhor prática é usar esses dois.


  • sudo suSolicita sua senha, torna-se root por um segundo e roda sucomo root`.
  • sudo su -Solicita sua senha, torna-se root por um segundo e executa su -como root.

Portanto, neste caso, você está executando o suuso sudoe não precisa saber a senha real do root. Os resultados são os mesmos que sue su -.

Ravexina
fonte
Qual é a diferença entre shell de login e não-login?
Pilot6
1
Outra pergunta?
Ravexina 12/08