Exclusão de arquivo usando o comando rm
-
20-09-2019 - |
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
?
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;)