su vs sudo -s vs sudo -i vs sudo bash

89

Qual é a diferença entre os seguintes comandos:

su
sudo -s
sudo -i
sudo bash

Eu sei, pois supreciso saber a senha do root e sudopreciso estar no sudoersarquivo, mas uma vez executado, o que é diferença?

Eu sei que há uma diferença entre sue sudo -sporque meu diretório pessoal é /rootdepois da execução su, mas meu diretório pessoal ainda é /home/mynameposterior sudo -s. Mas suspeito que isso seja apenas um sintoma de uma diferença subjacente que estou perdendo.

Snitse
fonte
3
Prefiro usar sudo su - Desse modo, você não precisa da senha root e -garante que o diretório pessoal esteja definido corretamente.
Jens Timmerman

Respostas:

114

Com su, você se torna outro usuário - root por padrão, mas potencialmente outro usuário. Se você disser su -, seu ambiente também será substituído pelo ambiente de login desse usuário, de modo que o que você vê é indistinguível de efetuar login como esse usuário. Não há como o sistema saber o que você faz enquanto faz sucom outro usuário as ações desse usuário quando ele faz login.

As coisas são muito diferentes com sudo:

  • Os comandos que você executa sudo executam como o usuário de destino - root por padrão, mas podem ser alterados com -u- mas registram os comandos executados, marcando-os com seu nome de usuário para que a culpa possa ser atribuída posteriormente. :)

  • sudoé muito flexível. Você pode limitar os comandos que um determinado usuário ou grupo de usuários tem permissão para executar, por exemplo. Com su, é tudo ou nada.

    Esse recurso geralmente é usado para definir funções. Por exemplo, você pode definir um grupo de "backups" com permissão para execução dumpe tar, cada um deles precisa de acesso root para fazer o backup adequado do disco do sistema.

    Menciono isso aqui porque significa que você pode dar sudoprivilégios a alguém sem dar a eles sudo -sou sudo bashhabilidades. Eles têm apenas as permissões necessárias para realizar seu trabalho, enquanto suexecutam todo o sistema. Porém, você deve ter cuidado com isso: se você der a alguém a capacidade de dizer sudo vi, por exemplo, ela pode se livrar vie ter efetivamente o mesmo poder que com sudo -s.

  • Como leva a senha do sudoer em vez da senha root, sudoisola a permissão entre vários sudoers.

    Isso resolve um problema administrativo com o suqual é que, quando a senha root muda, todos aqueles que precisavam conhecê-la sudeveriam ser informados. sudopermite que as senhas dos sudoers sejam alteradas independentemente. De fato, é comum bloquear com senha a conta do usuário root em um sistema sudopara forçar a execução de todas as tarefas sysadmin sudo. Em uma organização grande com muitos sudoers confiáveis, isso significa que quando um dos administradores do sistema sai, você não precisa alterar a senha root e distribuí-la aos administradores que permanecerem.

A principal diferença entre sudo bashe sudo -sé que -sé mais curta e permite passar comandos para executar no shell padrão do usuário de duas maneiras:

  1. Você pode dizer sudo -s some-commandqual é executado some-commandsob o seu shell. É basicamente uma abreviação de sudo $SHELL -c some-command.

  2. Em vez disso, você pode passar os comandos para a entrada padrão do shell, como sudo -s < my-shell-script. Você pode usar isso com um heredoc para enviar vários comandos para uma única sudochamada, evitando a necessidade de digitar sudorepetidamente.

Ambos os comportamentos são opcionais. Muito mais comumente, você cede -ssozinho, por isso apenas executa o shell do usuário interativamente. Nesse modo, ele difere de sudo bashque pode executar um shell diferente do que bash, uma vez que parece primeiro na SHELLvariável de ambiente e, em seguida, se não estiver definido, na configuração do shell de login do usuário, normalmente em /etc/passwd.

O shell executado sudo -sherda seu ambiente de usuário atual. Se o que você realmente deseja é um ambiente limpo, como você obtém logo após o login, o que você deseja é sudo -iuma adição relativamente recente ao sudo. Grosso modo, sudo -ié o sudo -sque su -é su: redefine todas, exceto algumas variáveis-chave do ambiente, e envia de volta ao diretório inicial do usuário. Se você também não der comandos para executar sob esse shell via entrada padrão ou sudo -i some-command, ele será executado como um shell de logon interativo, para que os scripts de inicialização do shell do usuário (por exemplo .bash_profile) sejam executados novamente.

Tudo isso torna sudo -iconsideravelmente mais seguro que sudo -s. Por quê? Porque se alguém puder modificar seu ambiente antes sudo -s, poderá causar a execução de comandos não intencionais. O caso mais óbvio é a modificação SHELL, mas também pode acontecer menos diretamente, como via PAGERse você disser man fooenquanto está abaixo sudo -s.

Você pode dizer: "Se eles podem modificar PAGER, eles podem modificar PATHe, em seguida, podem simplesmente substituir um sudoprograma maligno ", mas alguém suficientemente paranóico pode dizer /usr/bin/sudo /bin/bashpara evitar essa armadilha. Você provavelmente não é tão paranóico que também evita as armadilhas em todas as outras variáveis ​​de ambiente suscetíveis. Você também se lembrou de verificar EDITOR, por exemplo, antes de executar qualquer comando VCS ? Assim sudo -i.

Como sudo -itambém altera o diretório de trabalho para o diretório inicial do usuário, você ainda pode querer usá sudo -s-lo nas situações em que sabe que deseja permanecer no mesmo diretório em que estava cdquando executou sudo. Ainda é mais seguro sudo -ie de cdvolta para onde você estava.

Warren Young
fonte
2
O que você quer dizer com 'shell out of vi'?
crisron
11
@crisron: De dentro vi, digite :she pressione Enter. Agora você está em um sub-shell, com todos os privilégios do viprocesso que gerou esse shell. Se viestiver executando com privilégios de root, o shell também. Ou, você pode executar algo diferente de um shell via :!cmd, ler a saída de um comando no buffer de edição via :r !cmdetc. Se todos estiverem bloqueados, os Makefiledestinos são scripts de shell e o Vim possui o :makecomando, o que efetivamente permite executar shell arbitrário scripts de dentro do editor. As possibilidades de travessuras são imensas demais para que essa caixa de comentários seja mantida.
Warren Young.
2
se alguém pode colocar uma farsa no bash no seu caminho, então alguém pode colocar um sudo falso no seu caminho. para ser realmente certo você tem que invocar sudo usando o caminho completo:/usr/bin/sudo
Lesmana
1
@lesmana: Abordei isso em uma edição; basicamente, PATHnão é o único problema.
21815 Warren Young
6
Ótima explicação; grande dor de cabeça ao lê-lo.
Lobo1 /
27

De um post do ubuntuforums que fiz há um tempo:

Considere o seguinte experimento:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Aqui estão as diferenças que encontrei:

Com sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Com sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Observe a diferença em $HOME. Ser root e ter $HOMEdefinido a casa do usuário normal pode causar problemas. Por exemplo, se você executar um aplicativo gráfico, o usuário normal ~/.Xauthoritypoderá ser substituído pelo root. Isso causa problemas normais ao usuário posteriormente, como não conseguir executar certos aplicativos gráficos por meio do cron.

Para resumir:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games provavelmente definido por /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

A linha inferior sudo -ié o comando apropriado para executar quando você deseja um shell raiz que não seja contaminado pelo ambiente do usuário.

unutbu
fonte
1
A quantidade de 'contaminação do ambiente' depende da configuração sudo(nos /etc/sudoersarquivos e nos arquivos relacionados) também. Definições de configuração, como always_set_home, env_reset, env_keep, env_checke env_reset, e estes podem variar dependendo do usuário e de comando. Consulte a seção 'Ambiente de comando' e a seção SUDOERS OPTIONS da página de manual sudoers (5) .
Curt J. Sampson
Pessoalmente, aceito sudo -Hsquando quero um ambiente não contaminado pelas minhas configurações, porque uso o zsh e todas as contas de aplicativos que talvez esteja mudando para usar o bash. Isso permite que um certo número de variáveis ​​de ambiente passe sem ser resolvido, mas normalmente acho que as que são importantes são sobrescritas por /etc/profile.d/*.
Ed Grimm
7

su( S bruxa u Ser ou s ubstitute u ser) permite alternar usuário. subasicamente inicia outra instância do shell com os privilégios do usuário pretendido. Por padrão, ele muda para o rootusuário, se quisermos mudar para um usuário específico, precisamos passar o usuário da seguinte forma:

$ su bob  # switches to bob (requires bob's password)

su -significa que as variáveis ​​de ambiente serão redefinidas para raiz e susignifica variáveis ​​de ambiente como usuário antigo.

por exemplo: diretório inicial da raiz, se você usar, su -ou diretório inicial do usuário antigo, se você usar su.

sudo ( s uper u Ser não ) é um utilitário de linha de comando que permite aos usuários executar programas com os privilégios de outro usuário de segurança, por padrão é superusuário ou seja root. Ele usa um arquivo de configuração /etc/sudoersque lista quais usuários têm direitos para ações específicas

sudo deve ser lido como / ˈsuːduː / . sintaxe, sudo commandisto é, que você usa e execute este comando.

  • sué equivalente sudo -ie simula um login na conta raiz. Seu diretório de trabalho será /root, e ele lerá o root, .profileetc. O prompt mudará de $ para #, indicando que você tem acesso root.

  • sudo -s lança um shell como root, mas não altera seu diretório de trabalho.

  • sudo bash onde bashé o comando para executar sudo. Este comando é executado bashcomo um super usuário.

  • Usando sudopode ser registrado tudo o que alguém faz.
  • O uso sudoevita que um usuário precise saber a senha root.
  • Usando sudopodemos limitar os comandos têm permissão para executar.
Premraj
fonte