Impedir que um arquivo seja excluído mesmo após rm -f

Impedir que um arquivo seja excluído mesmo após rm -f

Eu costumo ficar no StackOverflow mas acho que nesse assunto vocês são muito mais especialistas aqui.

Então o exercício de hoje é estranho, tenho que escrever um script.she nele fazer o que posso para evitar test.txtque seja deletado mas o problema é que a última linhatemser

rm -f test.txt

Eu realmente não sei muito sobre shell (geralmente faço c/objective-c), então peguei um livro, não terminei, mas ainda não tenho ideia de como fazer isso.

Pensei em permissões, mas o script receberá todas as permissões quando testado, então não é uma opção ... (não sei se isso importa, mas o script será executado no OS X).

Responder1

No Linux, você pode usar o sinalizador imutável chattrpara obter somente leitura no nível do sistema de arquivos (no entanto, requer permissões apropriadas). Não uso OS X e não sei se tem algo parecido, mas você poderia conseguir "depois que o script for executado, test.txtainda existe" usando:

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

Este script é renomeado test.txte test.bakrenomeado novamente quando o script é encerrado (depois de rm -f test.txt). Isso não é realmente somente leitura, mas, a menos que você use kill -KILLseu script, ele deve preservar pelo menos seus dados.

Idéia alternativa, se você insiste em incluir essa linha, por que não sair mais cedo?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

Alternativa que se transforma rmem uma função que não faz nada:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

Semelhante ao método de função acima, mas usando o aliascomando obsoleto para alias rmao trueintegrado que não faz nada (mas retorna um código de saída verdadeiro):

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

Alternativa que retira rmdo ambiente (supondo que não haja rmembutido):

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

Outro que muda $PATHusando um rmprograma stub (usando /tmpcomo caminho de pesquisa):

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

Para obter mais informações sobre recursos integrados, execute help <built-in>para obter detalhes. Por exemplo:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

Para outros comandos, use man rmou consulte a página de manual, man bash.

Responder2

A remoção de um arquivo requer permissão de gravação no diretório que o contém.

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

Você provavelmente deveria fazer isso em um diretório temporário criado para esse propósito; você não deseja remover a permissão de gravação em seu diretório pessoal, por exemplo, embora seja fácil de recuperar comchmod +w .

informação relacionada