O que o comando 'sudo -s' faz e como é usado neste exemplo?

8

Eu tenho a seguinte dúvida. Em um tutorial relacionado a uma instalação de software que estou seguindo, diga que tenho que executar os seguintes comandos (estou fazendo isso em um shell ssh , portanto, esta lista de etapas termina com o exitcomando):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Minhas dúvidas são:

O que exatamente o -sparâmetro faz após o sudocomando?

Pesquisando na web, descobri que:

–S [comando] A opção –s (shell) executa o shell especificado pela variável de ambiente SHELL se estiver definido ou o shell conforme especificado no banco de dados de senhas. Se um comando for especificado, ele será passado para o shell para execução através da opção –c do shell. Se nenhum comando for especificado, um shell interativo será executado

Parece-me que sudo -sexecutar um comando usando a variável de ambiente do shell.

Mas isso não está claro para mim: nesse caso, qual é o comando executado com a variável de ambiente? (apenas executa sudo -se não sudo -s [command]).

AndreaNobili
fonte

Respostas:

7

A resposta simples é que ele fornece um shell raiz. É para isso que está sendo usado aqui. Há uma boa comparação técnica entre o su, sudo -i, sudo -se sudo sumétodos sobre Unix.SE mas isso não é realmente relevante aqui. O código poderia ter usado qualquer um e teria funcionado.

A pepita de ajuda significa algumas coisas:

  • Ele está procurando um comando na $SHELLvariável de ambiente. Se você correr, echo $SHELLprovavelmente verá /bin/bash. Isso significa que você obterá uma instância raiz do Bash. Eu tenho certeza que se você estivesse zshnele, você obteria uma instância raiz de zsh.

  • Se $SHELLestiver vazio, ele retornará ao shell padrão definido /etc/passwdpara esse usuário.

  • Se você fornecer um comando (por exemplo sudo -s whoami), ele está em execução:sudo /bin/bash -c "whoami"

  • Se você não passa um comando, ele não passa um -cargumento, então você obtém um shell interativo.

Eu usei a frase "root" várias vezes. Por padrão, sudo trata-se de executar coisas como root, mas sudo(e su) podem executar coisas como outros usuários (se você tiver permissão para fazê-lo). Só estou afirmando isso para os pedantes que gritarão que sudo -s -u $USERnão lhes dão uma casca de raiz, como prometi -sacima.


E, na minha opinião mais humilde , é realmente bobo se tornar root por apenas dois comandos, sem mencionar que isso pode deixar um usuário acidentalmente executando outros comandos como root. Se você deseja ou precisa executar algo como root, basta premir o comando com sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Eu duvidaria de qualquer tutorial que sugerisse a obtenção de um shell raiz, exceto nos casos em que você tem um monte de comandos para executar ... E mesmo assim, há scripts.

Oli
fonte
Explicação perfeita. Agora está tudo mais claro. Uma última dúvida. Se eu pré-anexar o sudo a todos os comandos anteriores, obterá o mesmo resultado final? é verdade ou estou faltando alguma coisa?
precisa saber é o seguinte
@Oli, você está 100% correto sobre o Zsh, "sudo -s" faz login no shell "root" como "root" e não como superusuário.
RCF
@AndreaNobili Sim, sudoé para isso que geralmente é; executando um comando como root sem precisar efetuar login manualmente como root.
Oli
Para sua informação, postei uma resposta abaixo da sua e minha opinião sudo -sé drasticamente diferente por causa do meu conhecimento limitado e da situação por acidente. Ainda assim, você pode ler minha resposta "humilde" e possivelmente atualizar sua resposta de meia década.
WinEunuuchs2Unix 4/19/19
0

sudo -sexecutará um comando no diretório atual como um usuário comum faria. Por exemplo:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

É claro que usar em -svez de prefixar o comando ./pode não poupar muito tempo.

WinEunuuchs2Unix
fonte