Evita que um arquivo seja apagado mesmo depois de rm -f

5

Eu costumo ficar no StackOverflow, mas acho que neste tópico vocês são muito mais especialistas aqui.

Portanto, o exercício de hoje é estranho, eu tenho que escrever um script.sh e fazer o que eu puder para evitar que test.txt seja deletado, mas o problema é que a última linha tem

rm -f test.txt

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

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

    
por ItsASecret 27.07.2013 / 23:09

2 respostas

9

No Linux, você pode usar o sinalizador imutável usando chattr para obter somente leitura em nível de sistema de arquivos (requer permissões apropriadas). Eu não uso o OS X e não sei se tem algo semelhante, mas você pode conseguir "depois que o script for executado, test.txt ainda existe" usando:

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

rm -f test.txt

Esse script renomeia test.txt para test.bak e renomeia quando o script é encerrado (após rm -f test.txt ). Isso não é verdadeiramente somente leitura, mas a menos que você kill -KILL do seu script, ele deve preservar seus dados pelo menos.

Idéia alternativa, se você insistir em ter 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 transforma rm em 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 comando alias reprovado para alias rm para o true interno que não faz nada (mas returing um verdadeiro código de saída):

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

rm -f test.txt

Alternativa que remove rm do ambiente (supondo que não haja rm embutido):

#!/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 altera $PATH usando um programa stub rm (usando /tmp como 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 mais informações sobre built-ins, execute help <built-in> para detalhes. Por exemplo:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

Para outros comandos, use man rm ou procure na página de manual, man bash .

    
por 27.07.2013 / 23:15
2

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 deve fazer isso em um diretório temporário criado para essa finalidade; você não deseja remover a permissão de gravação em seu diretório pessoal, por exemplo, embora seja fácil recuperá-lo com chmod +w .

    
por 28.07.2013 / 00:00