Questão 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - quando importa qual é usado, ou importa?


Quando estou fazendo algo que requer que o root seja digitado dezenas de vezes seguidas, prefiro alternar minha sessão para uma sessão raiz. Nos vários tutoriais e instruções que usei na Internet, vejo sudo su, sudo su -, sudo -i e sudo /bin/bash sendo usado para abrir uma sessão raiz, mas não estou claro sobre a diferença entre estes e quando ou se essa diferença é importante.

Alguém pode esclarecer isso para mim?


196
2017-11-12 23:30


origem


Você esqueceu de perguntar sobre sudo -s e sudo su. - Radu Rădeanu
Relacionado: Diferença entre "su", "sudo -s", "sudo -i" - Radu Rădeanu
Relacionado: Qual a diferença entre o comando 'sudo' e 'sudo sh'? - Radu Rădeanu
Relacionado: Qual é a diferença funcional entre sudo su e sudo -i? - Radu Rădeanu
@ RaduRădeanu Quando eu digitei a questão em que eu revisei as perguntas sugeridas e nenhuma delas realmente resolveu a minha pergunta completa. O mesmo é verdadeiro para as perguntas que você vinculou. Embora eles contenham muitas informações novas para mim, e agradeço a você por linkar para eles, eu os achei não tão completos quanto o caos do usuário de resposta abaixo, o que está muito mais de acordo com o que eu estava procurando. - Paul


Respostas:


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

su - O comando su é usado para alternar para outro usuário (s bruxa você ser), mas você também pode alternar para o usuário root invocando o comando sem nenhum parâmetro. su pede-lhe a senha do usuário para mudar, depois de digitar a senha que você mudou para o ambiente do usuário.

sudo - sudo destina-se a executar um único comando com privilégios de root. Mas ao contrário su ele solicita a senha do usuário atual. Esse usuário deve estar no arquivo sudoers (ou um grupo que esteja no arquivo sudoers). Por padrão, o Ubuntu "lembra" sua senha por 15 minutos, para que você não tenha que digitar sua senha todas as vezes.

bash - Uma interface de texto para interagir com o computador. É importante entender a diferença entre o login, não-login, shells interativos e não-interativos:

  • shell de login: Um shell de login registra você no sistema como um usuário especificado, necessário para isso é um nome de usuário e senha. Quando você bate ctrl+alt+F1 para fazer o login em um terminal virtual que você obter após o login bem-sucedido de um shell de login.
  • shell de não-login: Um shell que é executado sem o login, necessário para isso é um usuário atualmente conectado. Quando você abre um terminal gráfico no gnome, ele é um shell de não-login.
  • shell interativo: Um shell (login ou não login) onde você pode interativamente digitar ou interromper comandos. Por exemplo, um terminal gnome.
  • shell não interativo: Um (sub) shell que provavelmente é executado em um processo automatizado. Você não verá nem entrada nem saída.

sudo su Chamadas sudo com o comando su. O Bash é chamado como shell interativo de não-login. Então o bash só 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 su - Desta vez é 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 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 arquivos de recursos específicos de login, como .profile, .bashrc ou .login será lido e executado pelo shell.

sudo /bin/bash Isso significa que você chama sudo com o comando /bin/bash. /bin/bash é iniciado como shell não-login para que todos os arquivos-ponto não sejam executados, mas o próprio bash lê .bashrc do usuário chamador. 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.

sudo -slê o $SHELL variável e executa o conteúdo. E se $SHELL contém /bin/bash invoca sudo /bin/bash (Veja acima).

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

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

258
2017-11-13 09:43



Apenas um esclarecimento: sudo permite que um usuário permitido execute um comando como o superusuário ou outro usuário. De qualquer forma, +1 pelo seu esforço. - Radu Rădeanu
@chaos Obrigado por esta excelente resposta! Principalmente responde minhas perguntas, então eu fui em frente e marcou a pergunta respondida, mas eu não estou entendendo quando é desejável para executar um determinado shell. Eu realmente só uso o Ubuntu através da linha de comando e eu acho o meu uso mais comum para abrir um root sessão do usuário (vs. usando sudo) é quando estou fazendo algo que requer uso pesado de root privilégios, como ao instalar algo novo ou realizar uma grande reconfiguração. Eu tenho usado sudo /bin/bash, mas aparentemente esse método tem um mau rap por algum motivo que eu não entendo. - Paul
Além disso, é mais "correto" dizer que su significa usuário comutador, 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 irá assumir a conta raiz (super usuário). - oblivian
Chaos - "shopt -q login_shell && echo 'Shell de login' || echo 'Sem shell de login'" Estes tipos de sugestões eu vejo com frequência, mas por que fazer isso por tanto tempo? O operador && significa que se o código de saída 0 for "próximo comando" e os canais duplos (||) significarem mais (se não 0), faça este comando. Então, o que é basicamente dizer se o código de saída 0, em seguida, ecoar "Login Shell", se o código de saída 1 (falhar), em seguida, 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 significa sucesso, 1 ou mais meios falham. Então, se o eco é 0 = sucesso ... - oblivian
@Paulo: sudo -i é sugerido. Leia aqui: ubuntuforums.org/showthread.php?t=1817402 e aqui: unix.stackexchange.com/questions/98531/… - Marco Sulla