質問
必要なファイルを確実に削除したい。次のようなコードがあります
dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
の dir
そして file
値はデータベースから取得されます。絶対に走り出さないようにするにはどうすればよいですか rm -rf /
?
事前に確認すべきことは何ですか rm -rf
?
解決
-r
スイッチを使用しないでください。また、ファイル名にスペースがある可能性があります。
より良い代わりにPythonの os
のモジュール内の関数を使用します:
dirname = "/some/path/"
filename = "somefile.txt"
pathname = os.path.abspath(os.path.join(dirname, filename))
if pathname.startswith(dirname):
os.remove(pathname)
abspath
を有するパスを正規化し、それを比較しますターゲット・ディレクトリに対して「../../../etc/passwd」または類似のようなファイル名を回避します。
他のヒント
あなたは代わりに os.remove()
するを使用して検討するかもしれませんあなたがしようとしているものよりも少ない危険扱うます。
まず、私はあなたがそのようなものを扱うためのos.remove()
とos.rmdir()
機能を使用することをお勧めします。あなたは、よりポータブルなコードやコマンドのリターンをチェックするためのより少ない頭痛で終わるでしょう。
あなたが効果的に(あなただけの「/」をチェックしたくない場合があります)を削除しようとしているかどうか確認するには、生成されたパスに、いくつかの正規表現を使用するか、単にデータベース(によってあなたから返されたすべてのパスへのベースパスを追加することができますあなたは)...何をしている。
シェルのようなファイル操作を提供shutil
と呼ばれるモジュールがあります。あなたはそのディレクトリとその中のすべてのファイルとディレクトリを削除したい場合はshutil.rmtree
を使用します。
しかしそれはあなたがして速いかもしれRM産卵ファイルの膨大な数を削除しているので、もしPythonで実装されていますが、パスにスペースが含まれている場合に失敗します。
shutil.rmtree
使用してください。あなただけのファイルの使用を削除する場合:
dir = "/some/path/"
file = "somefile.txt"
cmd = os.path.join(dir, file)
shutil.rmtree(cmd)
あなたは、ディレクトリの使用を削除する場合:
dir = "/some/path/"
file = "somefile.txt"
shutil.rmtree(dir)
ファイルが書き込み保護されている場合は、あなたがこれを実行する前に、書き込み権限を持っていることを確認します。
あなたが言及したと仮定すると、 rm -rf はランダムではなく、まさに必要なコマンドです。なぜそれを呼び出さないのでしょうか?と呼ばれるシェルとの統合を強化するためのライブラリがあります。 しー.
from sh import rm
path_to_delete = '/some/path'
if os.path.exists(path_to_delete):
rm('-rf', path_to_delete)
PS あなたが root ではないことを確認するか、特に注意してユーザー入力を求めるようにしてください。そして、はい、単一のファイルが再帰的に削除されるのを避けるために、その人を燻製します ;)