Com su
, você se torna outro 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ê é indistinguível de efetuar login como esse usuário. Não há como o sistema saber o que você faz enquanto faz su
com outro usuário as ações desse usuário quando ele faz login.
As coisas são muito diferentes com sudo
:
Os comandos que você executa sudo
executam como o usuário de destino - root por padrão, mas podem ser alterados com -u
- mas registram os comandos executados, 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 tem permissão para executar, por exemplo. Com su
, é tudo ou nada.
Esse recurso geralmente é usado para definir funções. Por exemplo, você pode definir um grupo de "backups" com permissão para execução dump
e tar
, cada um deles precisa de acesso root para fazer o backup adequado do disco do sistema.
Menciono isso aqui porque significa que você pode dar sudo
privilégios a alguém sem dar a eles sudo -s
ou sudo bash
habilidades. Eles têm apenas as permissões necessárias para realizar seu trabalho, enquanto su
executam todo o sistema. Porém, você deve ter cuidado com isso: se você der a alguém a capacidade de dizer sudo vi
, por exemplo, ela pode se livrar vi
e ter efetivamente o mesmo poder que com sudo -s
.
Como leva a senha do sudoer em vez da senha root, sudo
isola a permissão entre vários sudoers.
Isso resolve um problema administrativo com o su
qual é que, quando a senha root muda, todos aqueles que precisavam conhecê-la su
deveriam ser informados. sudo
permite que as senhas dos sudoers sejam alteradas independentemente. De fato, é comum bloquear com senha a conta do usuário root em um sistema sudo
para forçar a execução de todas as tarefas sysadmin sudo
. Em uma organização grande com muitos sudoers confiáveis, isso significa que quando um dos administradores do sistema sai, você não precisa alterar a senha root e distribuí-la aos administradores que permanecerem.
A principal diferença entre sudo bash
e sudo -s
é que -s
é mais curta e permite passar comandos para executar no shell padrão do usuário de duas maneiras:
Você pode dizer sudo -s some-command
qual é executado some-command
sob o seu shell. É basicamente uma abreviação de sudo $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ê pode usar isso com um heredoc para enviar vários comandos para uma única sudo
chamada, evitando a necessidade de digitar sudo
repetidamente.
Ambos os comportamentos são opcionais. Muito mais comumente, você cede -s
sozinho, por isso apenas executa o shell do usuário interativamente. Nesse modo, ele difere de sudo bash
que pode executar um shell diferente do que bash
, uma vez que parece primeiro na SHELL
variável de ambiente e, em seguida, 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 você obtém logo após o login, o que você deseja é sudo -i
uma adição relativamente recente ao sudo
. Grosso modo, sudo -i
é o sudo -s
que su -
é su
: redefine todas, exceto algumas variáveis-chave do ambiente, e envia de volta ao diretório inicial do usuário. Se você também não der comandos para executar sob esse shell via entrada padrão ou sudo -i some-command
, ele será executado como um shell de logon 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 sudo -s
. Por quê? 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 é a modificação SHELL
, mas também pode acontecer menos diretamente, como via PAGER
se você disser man foo
enquanto está abaixo sudo -s
.
Você pode dizer: "Se eles podem modificar PAGER
, eles podem modificar PATH
e, em seguida, 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 que também evita as armadilhas em todas as outras variáveis de ambiente suscetíveis. Você também se lembrou de verificar EDITOR
, por exemplo, antes de executar qualquer comando VCS ? Assim sudo -i
.
Como sudo -i
também altera o diretório de trabalho para o diretório inicial do usuário, você ainda pode querer usá sudo -s
-lo nas situações em que sabe que deseja permanecer no mesmo diretório em que estava cd
quando executou sudo
. Ainda é mais seguro sudo -i
e de cd
volta para onde você estava.
sudo su -
Desse modo, você não precisa da senha root e-
garante que o diretório pessoal esteja definido corretamente.