Pergunta

Quero ter certeza de excluir os arquivos necessários. Eu tenho código algo como

dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)

o dir e file Os valores são buscados a partir de um banco de dados. Como posso ter certeza de que nunca acabo correndo rm -rf /?

Que coisas devo verificar antes de fazer rm -rf?

Foi útil?

Solução

Não use o -r alterne se você deseja apenas remover um único arquivo. Além disso, pode haver espaços no nome do arquivo.

Melhor usar as funções no Python os módulo em vez disso:

dirname = "/some/path/"
filename = "somefile.txt"
pathname = os.path.abspath(os.path.join(dirname, filename))
if pathname.startswith(dirname):
   os.remove(pathname)

Normalizando o caminho com abspath E compará -lo com o diretório de destino evita nomes de arquivos como "../../../etc/passwd" ou similar.

Outras dicas

Você pode considerar usar os.remove() Em vez disso, já que é muito menos perigoso do que você está tentando.

Primeiro, sugiro que você use o os.remove() e os.rmdir() Funções para trabalhar com coisas assim. Você acabará com mais código portátil e menos dor de cabeça para verificar o retorno do comando.

Para verificar o que você está efetivamente tentando remover (talvez não queira verificar "/"), você pode usar algumas expressões regulares no caminho gerado ou apenas adicionar um caminho base a todos os caminhos retornados do seu banco de dados (dependendo do que você é fazendo ...).

Há um módulo chamado shutil que fornece manipulação de arquivo semelhante a uma concha. Se você deseja excluir um diretório e todos os arquivos e diretórios nele, use shutil.rmtree.

No entanto, ele é implementado no Python; portanto, se você estiver excluindo um grande número de arquivos, a Spaw RM poderá ser mais rápida, mas falhará se o caminho tiver um espaço nele.

Usar shutil.rmtree Como diz Dave Kirby. Se você deseja excluir o uso justo do arquivo:

dir = "/some/path/" 
file = "somefile.txt" 
cmd = os.path.join(dir, file) 
shutil.rmtree(cmd) 

Se você deseja excluir o uso do diretório:

dir = "/some/path/" 
file = "somefile.txt"  
shutil.rmtree(dir) 

Se os arquivos estiverem gravações protegidas, verifique se você tem permissões de gravação antes de executar isso.

Assumindo que você mencionou rm -rf Não é apenas aleatório, mas é exatamente o comando que você precisa, por que não apenas chamá -lo? Há um LIB que permite uma maior integração com a concha chamada sh.

from sh import rm

path_to_delete = '/some/path'
if os.path.exists(path_to_delete):
    rm('-rf', path_to_delete)

PS Certifique -se de que você não esteja raiz e/ou peça que a entrada do usuário seja mais cautelosa. E, sim, fuma o homem para evitar a exclusão de um único arquivo recursivamente;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top