Qual é a diferença entre os seguintes comandos:
su
sudo -s
sudo -i
sudo bash
Eu sei que su
preciso saber a senha do root e que sudo
preciso estar no sudoers
arquivo, mas depois de executado qual a diferença?
Eu sei que há uma diferença entre su
e sudo -s
porque meu diretório inicial está /root
depois da execução su
, mas meu diretório inicial ainda está /home/myname
depois sudo -s
. Mas suspeito que isso seja apenas um sintoma de uma diferença subjacente que estou perdendo.
Responder1
Com su
vocêtornar-seoutro usuário — root por padrão, mas potencialmente outro usuário. Se você disser su -
, seu ambiente também será substituído pelo ambiente de login desse usuário, de modo que o que você vê seja indistinguível do login desse usuário. Não há como o sistema saber o que você faz enquanto su
faz outro usuário a partir das ações desse usuário quando ele faz login.
As coisas são muito diferentes com sudo
:
Comandos que você executa
sudo
executarcomo o usuário alvo - root por padrão, mas alterável com-u
- mas registra os comandos que você executa, marcando-os com seu nome de usuário para que a culpa possa ser atribuída posteriormente. :)sudo
é muito flexível. Você pode limitar os comandos que um determinado usuário ou grupo de usuários pode executar, por exemplo. Comsu
, é tudo ou nada.Esse recurso normalmente é usado para definir funções. Por exemplo, você pode definir um grupo de "backups" com permissão para execução
dump
etar
, cada um dos quais precisa de acesso root para fazer backup adequado do disco do sistema.Menciono isso aqui porque significa que você pode dar
sudo
privilégios a alguém sem dar-lhessudo -s
ousudo bash
habilidades. Eles têm apenas as permissões necessárias para realizar seu trabalho, enquantosu
executam todo o sistema. Porém, você precisa ter cuidado com isso: se você der a alguém a capacidade de dizersudo vi
, por exemplo, ele poderá desembolsarvi
e ter efetivamente o mesmo poder que comsudo -s
.Como ele usa a senha do sudoer em vez da senha do root,
sudo
isola a permissão entre vários sudoers.Isso resolve um problema administrativo do
su
, que é que quando a senha do root muda, todos aqueles que precisavam saber para usá-lasu
tinham que ser avisados.sudo
permite que as senhas dos sudoers sejam alteradas de forma independente. Na verdade, é comum bloquear com senha a conta do usuário root em um sistema parasudo
forçar todas as tarefas do administrador de sistema a serem realizadas viasudo
. Em uma grande organização com muitos sudoers confiáveis, isso significa que quando um dos administradores de sistema sai, você não precisa alterar a senha root e distribuí-la aos administradores que permanecerem.
As principais diferenças entre sudo bash
e sudo -s
são:
-s
é mais curto quebash
Você pode
sudo -s some-command
executarsome-command
no shell padrão, mas com privilégios de superusuário. É basicamente uma abreviação desudo $SHELL -c some-command
.Em vez disso, você pode passar os comandos para a entrada padrão do shell, como
sudo -s < my-shell-script
. Você poderia usar isso com umheredocenviar vários comandos para uma únicasudo
chamada, evitando a necessidade de digitarsudo
repetidamente.Mesmo sem esses argumentos de comando extras,
sudo -s
ainda difere desudo bash
porque pode executar um shell diferente dobash
, já que olha primeiro naSHELL
variável de ambiente e, se não estiver definido, na configuração do shell de login do usuário, normalmente em/etc/passwd
.
O shell executado sudo -s
herda seu ambiente de usuário atual. Se o que você realmente deseja é um ambiente limpo, como o obtido logo após o login, o que você deseja é sudo -i
uma adição relativamente recente ao sudo
. Grosso modo, sudo -i
é sudo -s
como su -
está su
: redefine todas as principais variáveis de ambiente, exceto algumas, e envia você de volta ao diretório inicial do usuário. Se você também não fornecer comandos para executar nesse shell por meio de entrada padrão ou sudo -i some-command
, ele executará esse shell como um shell de login interativo, para que os scripts de inicialização do shell do usuário (por exemplo, .bash_profile
) sejam executados novamente.
Tudo isso torna sudo -i
consideravelmente mais seguro que o sudo -s
. Por que? Porque se alguém puder modificar seu ambiente antes sudo -s
, poderá causar a execução de comandos não intencionais. O caso mais óbvio é modificar SHELL
, mas também pode acontecer de forma menos direta, como via PAGER
se você disser man foo
while under sudo -s
.
Você pode dizer: "Se eles podem modificar PAGER
, eles podem modificar PATH
, e então podem simplesmente substituir um sudo
programa maligno", mas alguém suficientemente paranóico pode dizer /usr/bin/sudo /bin/bash
para evitar essa armadilha. Você provavelmente não é tão paranóico a ponto de evitar as armadilhas em todos osoutrovariáveis de ambiente suscetíveis, no entanto. Você também se lembrou de verificar EDITOR
, por exemplo, antes de executar qualquerVCcomando? Por isso sudo -i
.
Como sudo -i
também altera seu diretório de trabalho para o diretório inicial do usuário, você ainda pode querer usar sudo -s
para aquelas situações em que sabe que deseja permanecer no mesmo diretório em que estava cd
quando executou sudo
. Ainda é mais seguro ir sudo -i
e cd
voltar para onde você estava.
Outra variante de tudo isso que você às vezes vê é sudo su
, que é aproximadamente equivalente a sudo -s
. Da mesma forma, sudo su -
é funcionalmente bastante próximo de sudo -i
. Como sudo
e su
são comandos concorrentes, é um pouco estranho combiná-los assim, então recomendo que você use os sudo
sinalizadores.
Responder2
De umpostagem no ubuntuforumEu fiz há um tempo:
Considere o seguinte experimento:
applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s
Aqui estão as diferenças que encontrei:
Com sudo -s
:
HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc
Com sudo su
:
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc
Observe a diferença em $HOME
. Ser root e configurar $HOME
a casa normal do usuário pode causar problemas. Por exemplo, se você executar um aplicativo gráfico, o usuário normal ~/.Xauthority
poderá ser substituído pelo root. Isso causa problemas normais ao usuário posteriormente, como não conseguir executar determinados aplicativos gráficos por meio do cron.
Para resumir:
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
provavelmente definido por/etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
O resultado final é sudo -i
o comando adequado a ser executado quando você deseja um shell root que não seja contaminado pelo ambiente do usuário.
Responder3
su
(ébruxavocêser ouésubstitutovocêser) permite trocar de usuário. su
basicamente inicia outra instância do shell com os privilégios do usuário pretendido. Por padrão, ele muda você para o root
usuário, se quisermos mudar de usuário específico, precisamos passar o usuário da seguinte forma:
$ su bob # switches to bob (requires bob's password)
su -
significa que as variáveis de ambiente serão redefinidas para root e su
significa que as variáveis de ambiente são do usuário antigo.
por exemplo: diretório inicial do root se você usar su -
ou diretório inicial do usuário antigo se você usar su
.
sudo (ésuperiorvocêSerfazer) é um utilitário de linha de comando que permite aos usuários executar programas com os privilégios de segurança de outro usuário; por padrão, é superusuário, ou seja, root
. Ele usa um arquivo de configuração /etc/sudoers
que lista quais usuários têm direitos para ações específicas
sudo deve ser lido como/ˈsuːduː/. sintaxe sudo command
, ou sejaébruxavocêser efazereste comando.
su
é equivalentesudo -i
e simula um login na conta root. Seu diretório de trabalho será/root
, e ele lerá o root,.profile
etc. O prompt mudará de $ para #, indicando que você tem acesso root.sudo -s
inicia um shell como root, mas não altera seu diretório de trabalho.sudo bash
ondebash
está o comando para executarsudo
. Este comando é executadobash
como superusuário.- Usando
sudo
pode ser registrado tudo o que alguém faz. - O uso
sudo
evita que um usuário precise saber a senha root. - Usando
sudo
podemos limitar os comandos que podem ser executados.