
Tenho a seguinte dúvida. Em um tutorial relacionado a uma instalação de software que estou seguindo, digo que devo executar os seguintes comandos (estou fazendo isso em umsshshell, então esta lista de etapas termina com o exit
comando):
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 -s
parâmetro faz após sudo
o comando?
Pesquisando na web descobri que:
-s [comando] A opção -s (shell) executa o shell especificado pela variável de ambiente SHELL se ela estiver definida ou o shell conforme especificado no banco de dados de senhas. Se um comando for especificado, ele será passado ao shell para execução por meio da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado
Parece-me que sudo -s
execute um comando usando a variável de ambiente do shell.
Mas isso não está claro para mim: neste caso qual é o comando executado com a variável de ambiente? (só executa sudo -s
e não sudo -s [command]
).
Responder1
A resposta simples é que fornece um shell de root. É para isso que está sendo usado aqui. Há um bomcomparação técnica entre os métodos , su
e no Unix.SEsudo -i
sudo -s
sudo su
mas isso realmente não é relevante aqui. O código poderia ter usado qualquer um e teria funcionado.
A pepita de ajuda significa algumas coisas:
Está procurando um comando na
$SHELL
variável de ambiente. Se você correr,echo $SHELL
provavelmente verá/bin/bash
. Isso significa que você obterá uma instância root do Bash. Tenho certeza de que se você estivesse nisso,zsh
significaria que você obteria uma instância root dozsh
.Se
$SHELL
estiver vazio, ele retorna ao shell padrão definido/etc/passwd
para esse usuário.Se você fornecer um comando (por exemplo
sudo -s whoami
), ele estará em execução:sudo /bin/bash -c "whoami"
Se você não passar um comando, ele não passará um
-c
argumento, então você apenas obterá um shell interativo.
Já usei a frase “root” diversas vezes. Porpadrão sudo
trata-se de executar coisas como root, mas sudo
(e su) pode 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 isso sudo -s -u $USER
não lhes dá uma casca de raiz como prometi -s
acima.
E no meumais humildede opiniões, é realmente bobo se tornar root para apenas dois comandos, sem mencionar que isso pode fazer com que um usuário execute acidentalmente outros comandos como root. Se você deseja ou precisa executar algo como root, basta pré-mendar 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 obter um shell de root, exceto nos casos em que você tem muitos comandos para executar ... E mesmo assim, há scripts.
Responder2
sudo -s
executará um comando no diretório atual como um usuário normal 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 -s
em vez de prefixar o comando com ./
pode não economizar muito tempo.