Diferença entre excluir pastas usando sudo ou como root

Diferença entre excluir pastas usando sudo ou como root

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 sudomesmo de ser executado. Se por algum motivo *não puder ser expandido, o comando será:

  • ou sudo rm -rf /opt/nextcloud/*where sudo(e then rm) 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 -rfem algumas circunstâncias (por exemplo, no Bash quando a nullglobopção está definida).

Existem outras possibilidades (por exemplo, comparar failglobno Bash), mas elas parecem não corresponder ao seu caso.

Em qualquer caso, a -fopção rmtorna-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 -ffunciona.

sudo ls /opt/nextcloud/não envolve expansão pelo shell. O comando é executado lscomo root. O lspró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.

informação relacionada