rm -i alias não funciona com o sudo como root

2

Tenho notado em todos os meus servidores Ubuntu que o alias rm -i é ignorado quando você executa sudo rm * como root. Existe algo no sudo que está causando esse comportamento? Eu sei que você não precisa usar o sudo quando você está root no entanto, no caso de um Jr SA fazer isso, ele removeria o conteúdo do diretório. Também sabendo que rm no Ubuntu não preserva / isso pode significar um colapso total do sistema.

Exemplo como root:

johndoe@hostname:/tmp/foobar $ sudo su -
root@www3d:~# cd /tmp/foobar
root@hostname:/tmp/foobar# for i in 'a b c d e f g' ; do touch $i ; done
root@hostname:/tmp/foobar# sudo rm *
root@hostname:/tmp/foobar# for i in 'a b c d e f g' ; do touch $i ; done
root@hostname:/tmp/foobar# rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
rm: remove regular empty file 'c'? y
rm: remove regular empty file 'd'? y
rm: remove regular empty file 'e'? y
rm: remove regular empty file 'f'? y
rm: remove regular empty file 'g'? y
root@hostname:/tmp/foobar# for i in 'a b c' ; do touch $i ; done
root@hostname:/tmp/foobar# rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
rm: remove regular empty file 'c'? y
root@hostname:/tmp/foobar# for i in 'a b c' ; do touch $i ; done
root@hostname:/tmp/foobar# sudo rm *
root@hostname:/tmp/foobar# ls
root@hostname:/tmp/foobar# exit
logout

Exemplo como usuário:

johndoe@hostname:/tmp/foobar $ for i in 'a b c' ; do touch $i ; done
johndoe@hostname:/tmp/foobar $ rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
rm: remove regular empty file 'c'? y
johndoe@hostname:/tmp/foobar $ for i in 'a b c' ; do touch $i ; done
johndoe@hostname:/tmp/foobar $ sudo rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
rm: remove regular empty file 'c'? y
    
por user36225 01.12.2011 / 18:28

2 respostas

2

Existe um truque muito bom para resolver este problema. Use o alias para o sudo da seguinte forma.

alias sudo="sudo "
#Trailing space at the end.

Motivo da página de crédito no final da postagem:

  

Um espaço à direita no valor faz com que a próxima palavra seja verificada para o alias   substituição quando o alias é expandido

.

Exemplo

user@user-desktop:~/test$ for i in 'a b c d e f g' ; do touch $i ; done
(reverse-i-search)'al': un^Cias -a
user@user-desktop:~/test$ alias rm="rm -i"
user@user-desktop:~/test$ rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
r    m: remove regular empty file 'c'? y
rm: remove regular empty file 'd'? y
rm: remove regular empty file 'e'? y
rm: remove regular empty file 'f'? y
rm: remove regular empty file 'g'? y
user@user-desktop:~/test$ for i in 'a b c d e f g' ; do touch $i ; done
user@user-desktop:~/test$ alias sudo='sudo '
user@user-desktop:~/test$ sudo rm *
rm: remove regular empty file 'a'? y
rm: remove regular empty file 'b'? y
rm: remove regular empty file 'c'? y
rm: remove regular empty file 'd'? y
rm: remove regular empty file 'e'? y
rm: remove regular empty file 'f'? y
rm: remove regular empty file 'g'? y

Créditos: arch wiki

    
por Amey Jah 01.12.2011 / 18:44
3

Olhando para o manual sudo , vejo o seguinte:

   -i [command]
               The -i (simulate initial login) option runs the shell
               specified in the passwd(5) entry of the target user as a
               login shell.  This means that login-specific resource files
               such as .profile or .login will be read by the shell.  If a
               command is specified, it is passed to the shell for
               execution.  Otherwise, an interactive shell is executed.
               sudo attempts to change to that user's home directory
               before running the shell.  It also initializes the
               environment, leaving DISPLAY and TERM unchanged, setting
               HOME, MAIL, SHELL, USER, LOGNAME, and PATH, as well as the
               contents of /etc/environment on Linux and AIX systems.  All
               other environment variables are removed.

Ou seja, você não obtém as variáveis de ambiente de seu arquivo .bashrc (no qual as definições de alias de .bash_aliases são executadas), a menos que você use -i .

    
por jcollado 01.12.2011 / 18:52