web-dev-qa-db-ja.com

リダイレクトせずにファイルに書き込みますか?

特別なファイルを作成し、それに魔法のクッキーを書き込む必要がある通常のコンパイル済みアプリケーションを書いています。アプリケーションから直接ファイルを書き込むことはできません。システムセキュリティモデルでは、トリックを実行するために昇格された権限でヘルパーツールを起動する必要があります。ヘルパーツールに任意の数の引数を指定できます。次に、ヘルパーツールとして機能し、ファイルを作成する非常に単純なシステムコマンドを選択します。このようなもの:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

単純なtouchは、Cookieをファイルに書き込む必要があるため、カットしません。シェルラッパーなしの単純なechoは、ファイルを書き込むためにリダイレクトが必要なため機能しません。このような簡単なタスクを実行するために、root権限でシェルを呼び出すのは快適ではありません。ファイルを書き込むために呼び出すことができる本当にシンプルで制約のあるシステムコマンドはありますか?

13
zoul

これはどう:

echo -n 'magic' | Sudo tee /some/where/file > /dev/null

確かにこれにはリダイレクトがありますが、シェルではなくルートとしてのみ実行されます。で動作します dd of=...も。

11
stribika

出力リダイレクトなし、パイプなし、ただし「ここに文字列」あり:

dd of=/some/where/file <<<'magic'
9
Rainer Perske

もう1つの考慮事項があります。それは、マジッククッキーの値を他のユーザーが監視できるため、コマンドラインに設定したくないということです。プログラムの存続期間が短い場合でも(プログラムがコマンドライン文字列をゼロにする場合を含む)、攻撃の機会があります。だから、理論的な:

_writestringtofile 'magic' /some/where/file
_

危険なアプローチです。したがって、@ stribikaの提案を支持します。一時ファイルに値を書き込み、適切な場所にコピーします。安全な関数を使用して一時ファイル(mkstemp())を作成し、競合状態が発生しないようにしてください。

5
mattdm

spongefrom moreutils-標準入力を吸収し、ファイルに書き込みます。

echo -n 'magic' | sponge /some/where/file

シェルリダイレクトとは異なり、spongeは、出力ファイルを書き込む前にすべての入力を吸収します。可能な場合、spongeは、一時ファイルの名前を変更して、アトミックに出力ファイルを作成または更新します。

参照 詳細

0
Ilya Murav'jov