
Hoje notei uma diferença interessante entre executar um comando usando sudo ou como root.
Usar sudo rm -rf /opt/nextcloud/*
não excluirá pastas
vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud nextcloud-16.0.4
Quando eu me torno root e executo o comando, as pastas são excluídas
vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~#
Por que é isso? Qual é a maneira correta de excluir as pastas usando o sudo?
Responder1
O comando sudo rm -rf /opt/nextcloud/*
é interpretado pelo shell em execução como seu usuário normal. O shell tenta se expandir *
antes sudo
mesmo de ser executado. Se por algum motivo *
não puder ser expandido, o comando será:
- ou
sudo rm -rf /opt/nextcloud/*
wheresudo
(e thenrm
) fica/opt/nextcloud/*
literalmente com o literal*
e nenhuma expansão adicional ocorre; este é o comportamento POSIX;/opt/nextcloud/*
obviamente não existe. - ou
sudo rm -rf
em algumas circunstâncias (por exemplo, no Bash quando anullglob
opção está definida).
Existem outras possibilidades (por exemplo, comparar failglob
no Bash), mas elas parecem não corresponder ao seu caso.
Em qualquer caso, a -f
opção rm
torna-se relevante. Isso significa
-f
Não solicite confirmação. Não grave mensagens de diagnóstico nem modifique o status de saída no caso de operandos sem arquivo ou no caso de operandos inexistentes. […]
(fonte)
Efetivamente, você forneceu um "operando que não existe" ou "nenhum operando de arquivo", então o comando não fez nada e foi bem-sucedido silenciosamente.
Minha hipótese é que o shell não elevado não pôde ser expandido /opt/nextcloud/*
porque o usuário comum não tem permissões de leitura no /opt/nextcloud/
. Outra possibilidade é que você cometeu um erro de digitação /opt/nextcloud/*
e não percebeu porque não havia nenhuma mensagem de erro. Não houve mensagem de erro porque é assim que rm -f
funciona.
sudo ls /opt/nextcloud/
não envolve expansão pelo shell. O comando é executado ls
como root. O ls
próprio teve acesso ao diretório especificado e seu conteúdo, portanto funcionou.
Depois que sudo su -
você estava em um shell rodando como root. Este shell foi capaz de se expandir /opt/nextcloud/*
, então rm -rf /opt/nextcloud/*
funcionou como você esperava.