Existe algum bom motivo para rodar o sudo su?

72

Para iniciar um shell de root em máquinas onde a conta root está desabilitada, você pode executar um dos seguintes:

  • sudo -i : executa um shell de login interativo (lê /root/.bashrc e /root/.profile )
  • sudo -s : executa um shell interativo sem login (lê /root/.bashrc )

No mundo do Ubuntu, muitas vezes vejo sudo su sugerido como uma maneira de obter um shell de root. Por que executar dois comandos separados quando um vai fazer? Tanto quanto eu posso dizer, sudo -i é equivalente a sudo su - e sudo -s é o mesmo que sudo su .

As únicas diferenças parecem ser (comparando sudo -i à esquerda e sudo su - à direita):

Ecomparandosudo-s(àesquerda)esudosu(àdireita):

As principais diferenças (ignorando as variáveis SUDO_foo e LS_COLORS ) parecem ser as variáveis do sistema XDG_foo nas versões sudo su .

Há algum caso em que essa diferença garanta o uso de um sudo su bastante deselegante? Posso dizer às pessoas com segurança (como sempre faço) que nunca há nenhum ponto em executar sudo su ou estou faltando alguma coisa?

    
por terdon 24.07.2015 / 16:16

2 respostas

55

Como você afirmou em sua pergunta, a principal diferença é o meio ambiente.

sudo su - vs. sudo -i

No caso de sudo su - , é um shell de login, então /etc/profile , .profile e .bashrc são executados e você se encontrará no diretório inicial do root com o ambiente do root.

sudo -i é quase igual a sudo su - A opção -i (simular login inicial) executa o shell especificado pela entrada do banco de dados de senha do usuário de destino como um shell de login. Isso significa que os arquivos de recursos específicos de login, como .profile , .bashrc ou .login , serão lidos e executados pelo shell.

sudo su vs. sudo -s

sudo su chama sudo com o comando su . O Bash é chamado como shell interativo de não-login. Portanto, bash apenas executa .bashrc . Você pode ver que depois de mudar para o root você ainda está no mesmo diretório:

user@host:~$ sudo su
root@host:/home/user#

sudo -s lê a variável $SHELL e executa o conteúdo. Se $SHELL contiver /bin/bash , invoca sudo /bin/bash , o que significa que /bin/bash é iniciado como shell de não-login, portanto, todos os arquivos de pontos não são executados, mas bash lê. bashrc do chamando usuário. Seu ambiente permanece o mesmo. Sua casa não será a casa da raiz. Então você é root, mas no ambiente do usuário chamador.

Conclusão

A -i bandeira foi adicionada a sudo em 2004 , para fornecer uma função semelhante a sudo su - , então sudo su - foi o modelo para sudo -i e pretendia funcionar como ele. Eu acho que não importa qual você usa, a menos que o ambiente não seja importante.

Adição

Um ponto básico que deve ser mencionado aqui é que sudo foi projetado para executar somente um único comando com privilégios mais altos e, em seguida, descartar esses privilégios para os originais. Nunca foi feito para realmente trocar o usuário e deixar abrir um shell de root. Com o passar do tempo, sudo foi expandido com esses mecanismos, porque as pessoas ficaram incomodadas com a razão de usar sudo na frente de cada comando.

Então o significado de sudo foi abusado. sudo foi criado para incentivar o usuário a minimizar o uso de privilégios de root.

O que temos agora é sudo cada vez mais popular. Está integrado em quase todas as distribuições de linux bem conhecidas. A ferramenta original para alternar para outra conta de usuário é su . Para uma veterana da velha escola, algo como sudo pode parecer desnecessário. Ele adiciona complexidade e se comporta com maior probabilidade aos mecanismos que conhecemos da os-family da Microsofts e, portanto, é contrário à filosofia de simplicidade dos sistemas * nix.

Eu não sou realmente um veterano, mas também na minha opinião sudo sempre foi um espinho ao meu lado, desde o momento em que foi introduzido e sempre trabalhei em torno do uso de sudo , se fosse possível. Estou muito relutante em usar sudo . Em todos os meus sistemas, a conta root está ativada. Mas as coisas mudam, talvez a hora chegue, quando su será preterido e sudo substituirá su completamente.

Portanto, acho que será o melhor para usar os mecanismos internos do sudo ( -s , -i ) em vez de depender de uma ferramenta antiga, como su .

    
por 24.07.2015 / 16:38
14

Para responder à sua pergunta diretamente: não, não há um bom motivo para fazer isso. Além disso, o sudo su produz duas entradas de log quando uma seria suficiente.

Eu vi muitas pessoas fazerem isso, e quando eu pergunto por que eles não executam apenas sudo -s , a resposta é que eles não sabem sobre o -s bandeira para sudo, e geralmente eles mudam depois que eu aponto.

No entanto, para sua lista de sudo -s e sudo -i , gostaria de adicionar mais uma opção, sudo -sE , que é uma espécie de substituto para su -m . sudo -sE preserva seu ambiente, incluindo o diretório inicial. Isso tem riscos se o seu diretório home estiver inseguro (no NFS). Mas em um ambiente onde muitas pessoas usam root, você não precisa concordar com o conteúdo do arquivo .bashrc da raiz. Meu .bashrc contém muitas especializações para o root, portanto, não consigo exatamente o mesmo ambiente que o root, mas pelo menos consigo exatamente o ambiente que quero.

    
por 24.07.2015 / 19:05