Remova arquivos de um diretório de propriedade raiz usando sudo com curingas

Remova arquivos de um diretório de propriedade raiz usando sudo com curingas

Digamos que eu tenha uma pasta /var/log/nginxprotegida (de propriedade do root e ninguém mais pode ler ou escrever nela). Mesmo usando o sudo, não consigo ficar sudo rm -f /var/log/nginx/ab*sem "Esse arquivo ou diretório não existe". Preciso realmente carregar um shell root para fazer isso ou existe alguma outra maneira?

Responder1

Causa

O shell interpreta e expande quaisquer caracteres glob (curingas), como o asterisco. Esta interpretação do comando acontece no shell atual (antes da sudoexecução do comando) que não possui permissão de leitura para o diretório. Como o shell atual não consegue encontrar arquivos que correspondam ao padrão glob, a expansão do nome do caminho não é executada e o shell passa rm, -fe /var/log/nginx/ab*(com um asterisco literal) como argumentos para o sudocomando.

O sudocomando, por sua vez, inicia o rmcomando que tenta remover um arquivo com caminho de /var/log/nginx/ab*(um asterisco é um caractere legal para um nome de arquivo Unix). Como esse arquivo não existe de fato, ele relata sua falha. Com GNU rm, esta mensagem de erro é explícita; ocompletoa mensagem de erro abaixo indica que o arquivo (único) que está sendo removido não existe:

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

Solução

A solução é lançar um novo shell como superusuário com as permissões necessárias para realizar a expansão do nome do arquivo:

sudo bash -c "rm -f /var/log/nginx/ab*"

O comando acima inicia um novo shell que é executado como root e a -copção é usada para passar o comando a ser executado pelo shell. Como o comando está entre aspas, o asterisco não é interpretado pelo shell atual e é passado como está para o novo shell raiz, permitindo expandir os nomes dos caminhos antes de iniciar o rmcomando.

Responder2

É um problema com os nomes dos arquivos ou possíveis espaços nos nomes dos arquivos.

Portanto, tente as seguintes soluções alternativas:

  1. Tente preceder --para indicar o fim das opções, por exemplo:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. Usar find:

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. Se você acha que seus arquivos estão protegidos no Linux, tente primeiro remover a proteção:

    chattr -i ab*
    

informação relacionada