rm prompt ao excluir arquivos não-graváveis

1

Isso é sobre o GNU rm . A página de informações diz:

Otherwise, if a file is unwritable, standard input is a terminal, and the -f or --force option is not given, or the -i or --interactive=always option is given, rm prompts the user for whether to remove the file. If the response is not affirmative, the file is skipped.

  • Este GNU é apenas?

  • Ao usar rm como root, isso não acontece no meu sistema. Isso é um comportamento normal? Não consigo encontrá-lo documentado em qualquer lugar.

  • Qual é a razão para esse comportamento? Isso só aumenta a confusão dos usuários, que tendem a pensar que você precisa ter permissões de gravação para um arquivo para excluí-lo. Isso os faz pensar que rm chmods o arquivo. Mas rm também pode excluir o arquivo se não for o proprietário.

por wolf-revo-cats 09.04.2016 / 08:56

3 respostas

2

Como você fez três perguntas separadas, responderei separadamente.

Sua primeira pergunta:

Is this GNU only?

Não tenho certeza se é apenas GNU . Parece ser uma característica do rm do GNU Coreutils que também é encontrada em pelo menos alguma outra documentação rm . Por exemplo, de acordo com algumas documentação antiga no opengroup.org para POSIX rm :

  1. If file is not of type directory, the -f option is not specified, and either the permissions of file do not permit writing and the standard input is a terminal or the -i option is specified, rm shall write a prompt to the standard error and read a line from the standard input. If the response is not affirmative, rm shall do nothing more with the current file and go on to any remaining files.

Soa familiar? Ele está muito próximo da documentação do GNU rm que você mencionou na sua pergunta.

Sua segunda pergunta:

When using rm as root this does not happen on my system. Is this normal behavior? I can't find it documented anywhere.

Se você quer dizer que executar rm sem flags como root não avisa ao tentar remover um "unwritable file", então sim, este é um comportamento normal para o GNU Coreutils 8.23 (e provavelmente quase todas as outras versões do GNU Coreutils). Não parece haver nenhuma documentação para isso, mas se você entrar em a fonte para rm (você precisa alternar entre vários arquivos para juntar tudo), isso mostra que executar rm somefile de um terminal como usuário root removerá somefile sem um prompt, mesmo que seja protegido contra gravação .

Sua terceira pergunta:

What's the rationale for this behavior? It only increases the confusion of users, who tend to think that you need to have write permissions for a file to delete it. It makes them think that rm chmods the file. But rm can also delete the file if one isn't the owner.

Se você quer dizer por que um usuário pode excluir um arquivo protegido contra gravação que não possui, esse comportamento tem menos a ver com rm e mais a ver com permissões do sistema de arquivos. Veja linuxdevcenter.com , cyberciti.biz , e Wikipedia , que afirmam coletivamente (mais ou menos):

Usually, on most filesystems, deleting a file requires write permission on the parent directory (and execute permission, in order to enter the directory in the first place), but you need not have permission on the file itself. Note that, confusingly for beginners, permissions on the file itself are irrelevant. However, GNU rm asks for confirmation if a write-protected file is to be deleted, unless the -f option is used.

A ênfase ousada é minha. É assim que o Linux e outros SOs parecidos com Unix lidam com exclusões de arquivos com base em permissões de arquivos.

    
por 09.04.2016 / 10:29
2

usuário simples

Você pode querer proteger um arquivo da sua própria exclusão / modificação. Uma maneira rápida é chmod 000 foo (ou chmod -w foo ). No entanto, isso não tem utilidade se você escolher excluí-lo sem vontade.

Então o comando rm irá informá-lo (como não-raiz), se este for o caso, é por isso que há um pedido de confirmação.

raiz

quando executado como root, especialmente durante procedimentos batch / automatic,

  1. você deveria saber o que está fazendo.
  2. muitos shell podem ser interrompidos se a confirmação for solicitada.

como conseqüência, o arquivo é excluído "on sight".

confirmação

a confirmação pode ser solicitada ( -i ) ou desativada ( -f )

  • -i é o padrão para o usuário simples.
  • -f é o padrão para a raiz.
por 09.04.2016 / 10:00
1

Is this GNU only?

Não. Esse comportamento rm é de cerca de 40 anos e foi padronizado .

What's the rationale for this behavior?

Na página de manuais da 1ª edição para rm :

Removal of a file requires write permission in its directory, but neither read nor write permission on the file itself.

BUGS
rm probably should ask whether a read--only file is really to be removed.

A implicação, eu acho, é que se um usuário quisesse proteger um arquivo contra escrita acidental alterando seu modo para ser somente leitura, então valeria a pena tentar protegê-lo da exclusão acidental.

O arquivo TUHS está sem as man pages da segunda edição e a fonte rm, mas o página man da 3ª edição para rm mostra que isso foi tratado:

If there is no write permission to a file designated to be removed, rm will print the file name, its mode and then read a line from the standard input. If the line begins with 'y', the file is removed, otherwise it is not. The optional argument -f prevents the above interaction.

O Unix e a maioria de seus comandos acabaram tendo padronizado , e é por isso que o rm se comporta dessa maneira hoje.

When using rm as root this does not happen on my system. Is this normal behavior?

Não a princípio, mas é um comportamento normal agora.

O código-fonte mais antigo que posso encontrar é de V5 :

    if(getuid() == buf->uid)
        b = 0200; else
        b = 2;
    if((buf->mode & b) == 0)    {
        printf("%s: %o mode ", arg, buf->mode);
        i = b = getchar();
        i = b;
        while(b != '\n' && b != '
    if (access(arg, 02)<0) {
        printf("rm: %s %o mode ", arg, buf.st_mode&0777);
        if(!yes())
            return;
    }
') b = getchar(); if(i != 'y') return; }

que mostra a verificação de capacidade de gravação em busca do sinalizador permissão de gravação por proprietário se o usuário que está executando rm possuir o arquivo, caso contrário a permissão de gravação por outros .

Em V7 , rm era mudou para usar o recém-adicionado acesso chamada do sistema:

    if(getuid() == buf->uid)
        b = 0200; else
        b = 2;
    if((buf->mode & b) == 0)    {
        printf("%s: %o mode ", arg, buf->mode);
        i = b = getchar();
        i = b;
        while(b != '\n' && b != '
    if (access(arg, 02)<0) {
        printf("rm: %s %o mode ", arg, buf.st_mode&0777);
        if(!yes())
            return;
    }
') b = getchar(); if(i != 'y') return; }

Como access considera que o root tem acesso de gravação a qualquer arquivo (a menos que esteja em um sistema de arquivos somente leitura), rm normalmente não pedirá confirmação quando for executado pelo root.

    
por 09.04.2016 / 14:26

Tags