'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - quando importa o que é usado ou importa?

254

Quando estou fazendo algo que exige que o root seja digitado dezenas de vezes seguidas, prefiro mudar minha sessão para uma sessão raiz. Nos vários tutoriais e instruções que tenho usado na Internet, vejo sudo su, sudo su -, sudo -ie sudo /bin/bashque está sendo usado para abrir uma sessão de raiz, mas eu não estou claro sobre a diferença entre estes e quando ou se o que importa diferença.

Alguém pode esclarecer isso para mim?

Paulo
fonte
11
Você esqueceu de perguntar sobre sudo -se sudo su.
Radu Rădeanu
3
@ RaduRădeanu Quando digitei a pergunta, revi as perguntas sugeridas e nenhuma delas realmente abordou minha pergunta completa. O mesmo vale para as perguntas às quais você vinculou. Embora eles contenham muitas informações novas para mim, e obrigado por vincular a elas, achei-as não tão completas quanto a resposta que o caos do usuário abaixo fornece, o que está muito mais alinhado com o que eu estava procurando.
Paul

Respostas:

325

Para explicar isso, você precisa saber o que os programas fazem:

  • su- O comando sué usado para alternar para outro usuário ( s bruxa u ser), mas você também pode mudar para o usuário root, invocando o comando sem parâmetros. susolicita a senha do usuário para alternar, depois de digitar a senha que você alternou para o ambiente do usuário.
  • sudo- sudodestina-se a executar um único comando com privilégios de root. Mas, ao contrário su, solicita a senha do usuário atual. Esse usuário deve estar no arquivo sudoers (ou em um grupo que esteja no arquivo sudoers). Por padrão, o Ubuntu "lembra" sua senha por 15 minutos, para que você não precise digitar sua senha todas as vezes.
  • bash- Uma interface de texto para interagir com o computador. É importante entender a diferença entre shells de login, não login, interativos e não interativos:

Tipos de conchas:

  • shell de login : um shell de login efetua o login no sistema como um usuário especificado, necessário para que este seja um nome de usuário e senha. Quando você pressiona ctrl+ alt+ F1para efetuar login em um terminal virtual, obtém após o login bem-sucedido um shell de login.
  • shell sem login : um shell que é executado sem efetuar login, necessário para que este seja um usuário conectado no momento. Quando você abre um terminal gráfico no gnome, é um shell que não é de login.
  • shell interativo : um shell (logon ou não logon) no qual você pode digitar ou interromper interativamente os comandos. Por exemplo, um terminal gnomo.
  • shell não interativo : um (sub) shell que provavelmente é executado a partir de um processo automatizado. Você não verá entrada nem saída.

Portanto, os casos são:

  • sudo suChama sudocom o comando su. O Bash é chamado como shell interativo sem logon. Portanto, o bash é executado apenas .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 su -Desta vez, é um shell de login, portanto /etc/profile, .profilee .bashrcé executado e você se encontrará no diretório inicial do root com o ambiente do root.

  • sudo -iÉ quase o mesmo que 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, .bashrcou .loginserão lidos e executados pelo shell.

  • sudo /bin/bashIsso significa que você chama sudocom o comando /bin/bash. /bin/bashé iniciado como um shell sem logon para que todos os arquivos de ponto não sejam executados, mas o bash lê .bashrco usuário que está chamando. Seu ambiente permanece o mesmo. Sua casa não será a casa da raiz. Então você é root, mas no ambiente do usuário que está chamando.

  • sudo -slê a $SHELLvariável e executa o conteúdo. Se o $SHELLcontiver /bin/bashchama sudo /bin/bash(veja acima).

Verifica:

Para verificar se você está em um shell de logon ou não (funciona apenas no bash porque shopté um comando interno):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
caos
fonte
18
Apenas um esclarecimento: sudopermite que um usuário permitido execute um comando como superusuário ou outro usuário . Enfim, +1 pelo seu esforço.
Radu Rădeanu 13/11
2
@chaos Obrigado por esta excelente resposta! Ele responde principalmente às minhas perguntas, então fui em frente e marquei a pergunta como respondida, mas não estou entendendo quando é desejável executar um shell específico. Eu realmente só uso o Ubuntu através da linha de comando e acho que o meu uso mais comum para abrir uma rootsessão de usuário (vs. usar sudo) é quando estou fazendo algo que requer uso pesado de rootprivilégios, como ao instalar algo novo ou executar uma grande reconfiguração . Estou usando sudo /bin/bash, mas aparentemente esse método tem uma má reputação por algum motivo que não entendo.
Paul
2
Além disso, é mais "correto" dizer que su significa usuário do switch, em vez de superusuário. Ou seja, execute um script php: su www-data /usr/share/script.php ou apenas su www-data para shell interativo. Mas su sem qualquer nome de usuário assumirá a conta raiz (superusuário).
oblivian
Caos - "shopt -q login_shell && echo 'Shell de logon' || echo 'Sem shell de logon'" "Esse tipo de sugestão eu vejo frequentemente, mas por que demora tanto? O operador && significa que, se o código de saída 0, em seguida, "executa o próximo comando" e os tubos duplos (||) significam mais (se não for 0), execute este comando. Então, o que é basicamente dizer se o código de saída 0 faz eco ao "Shell de Login", se o código de saída 1 (falha) e o eco "No login". Por que não apenas "shopt -q login_shell; echo $?" $? significa o código de resultado / saída do comando anterior. Na maioria, se nem todos os programas 0 significam sucesso, 1 ou mais significa falhar. Portanto, se o eco for 0 = sucesso ... #
211 oblivian
2
@ Paul: sudo -ié sugerido. Leia aqui: ubuntuforums.org/showthread.php?t=1817402 e aqui: unix.stackexchange.com/questions/98531/...
Marco Sulla
0

Para procurar diferenças, você pode influenciar o ambiente resultante entre diferentes invocações.

Você pode encontrar algumas diferenças "pequenas" em algumas variáveis ​​críticas:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

ou alguma diferença em ~ /. manipulação de dotfiles ( ~/.config).

Considere também a propriedade de arquivos de log baseados em $ HOME ( ~/.xsession.errors, etc ...) ou cookies xauth ( ~/.Xauthority) que os comandos geram.

Experimente estes comandos:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)


hute37
fonte