1. ホーム
  2. python

[解決済み] os.system()コールをエスケープするには?

2022-06-15 06:29:15

質問

os.system()を使うとき、コマンドのパラメータとして渡されるファイル名や他の引数をエスケープすることがしばしば必要です。 どうすればよいでしょうか。 できれば、複数のオペレーティングシステム/シェルで動作するものですが、特にbashのためのものです。

私は現在、次のようにしていますが、このためのライブラリ関数、または少なくともよりエレガントで堅牢な、そして効率的なオプションがあるに違いないと確信しています。

def sh_escape(s):
   return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")

os.system("cat %s | grep something | sort > %s" 
          % (sh_escape(in_filename), 
             sh_escape(out_filename)))

編集する 私は引用符を使用するという単純な答えを受け入れました、なぜ私はそれを考えなかったのか分からない; 私は'と"が少し異なる動作をするWindowsから来たからでしょう。

セキュリティに関して、私はその懸念を理解していますが、この場合、私は os.system() が提供する迅速で簡単なソリューションに興味があり、文字列のソースはユーザーが生成したものではない、または少なくとも信頼できるユーザー (私) によって入力されたものです。

どのように解決するのですか?

これは私が使っているものです。

def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"

シェルは常に引用符で囲まれたファイル名を受け取り、 それを問題のプログラムに渡す前に周囲の引用符を削除する。注目すべきは、これは空白やその他の厄介なシェルのメタ文字を含むファイル名の問題を回避することです。

更新 : Python 3.3 以降を使用している場合は shlex.quote を使用してください。