Remover arquivos de um diretório de propriedade da raiz usando o sudo com curingas

2

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

    
por ffxsam 01.10.2015 / 03:02

2 respostas

6

Causa

O shell interpreta e expande todos os caracteres glob (curingas), como o asterisco. Essa interpretação do comando acontece no shell atual (antes da execução do comando sudo ), que não tem permissão de leitura para o diretório. Como o shell atual não pode encontrar arquivos que correspondam ao padrão glob, a expansão do nome de caminho não é executada e o shell passa rm , -f e /var/log/nginx/ab* (com um asterisco literal) como os argumentos para o sudo comando.

O comando sudo , por sua vez, inicia o comando rm , que tenta remover um arquivo com um caminho de /var/log/nginx/ab* (um asterisco é um caractere legal para um nome de arquivo Unix). Como esse arquivo não existe, ele informa sua falha. Com o GNU rm , esta mensagem de erro é explícita; a mensagem de erro completa 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 o superusuário com as permissões necessárias para executar 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 opção -c é usada para passar o comando a ser executado pelo shell. Como o comando é citado, o asterisco não é interpretado pelo shell atual e é passado como está para o novo shell raiz, permitindo que ele expanda os nomes dos caminhos antes de iniciar o comando rm .

    
por 01.10.2015 / 10:59
1

É um problema com seus nomes de arquivos ou espaços possíveis em seus nomes de arquivos.

Portanto, tente as seguintes soluções alternativas:

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

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

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

    chattr -i ab*
    
por 01.10.2015 / 11:15