teeで生成された保護されたファイルの書き込み操作をキャンセルする方法は?

teeで生成された保護されたファイルの書き込み操作をキャンセルする方法は?

書き込み禁止ファイルと書き込み禁止ファイルで動作することを確認したい小さなプログラムがあります。そのため、echo $text > $fileorを使用する代わりにandを別々にecho $text >> $file使用する必要がありました。使用時に権限を変更しても、ファイルに使用するたびに次のメッセージが表示されます。echo $text | sudo tee $fileecho $text | sudo tee --append $filesudo teerm

$ ls
someFile writeProtectedFile
$ rm someFile
$ ls
writeProtectedFile
$ rm writeProtectedFile
rm remove write-protected regular file 'writeProtectedFile'? yes
$ ls

それから私はジレンマのための可能な解決策を見つけるためにオンラインを遅らせました。無効な権限または変更された権限セットの2つが見つかりました。を実行して権限を簡単に変更できるので、権限の大文字と小文字の区別が正しくないことがわかりますsudo chmod xxx filename。これで権限の変更が成功します。次に、ファイルのプロパティに問題があると仮定してファイルを実行し、ディレクトリ内の他のすべてのファイルと同じようにlsattr出力しました。-------------e--

修正する

私が使用する理由teeは、保護されたファイルに書き込むためにテキストをエコーすることです。しかし、副作用で保護された一般的なファイルにも書くこともあります...私の目標は実際には同様のことですが、sudo echo "whatever" >> /etc/someFileこれはうまくいきません。で解決策を見つけましたecho "whatever" | sudo tee /etc/someFile

答え1

存在しないファイルを引数としてコマンドteeに渡すと、出力が書き込まれる前にファイルが生成されます。コマンドの前に を付けると、sudoシェルにteeコマンドを として実行するように要求しますroot。その結果、生成されたファイルはteeコマンドを開始したユーザーが所有するため、root他のユーザーは読み取り専用になります。実行して合計列を表示するls -lと、それを直接確認できます。usergroup

$ rm -f writeProtectedFile # Removing the file in case it already exists
$ echo $text | sudo tee writeProtectedFile
yourtext
$ ls -l
total 4
-rw-r--r-- 1 root root 9 22.07.2015 14:26 writeProtectedFile

この問題を克服するためのいくつかのオプションがあります。

  • teeファイルの作成を要求する前に、標準ユーザーとしてファイルを生成します。teeこれにより--append、所有権を変更せずに切り取るか、単に切り取ります。

    $ touch writeProtectedFile # creates the file as standard user
    $ echo $text | sudo tee writeProtectedFile
    $ rm writeProtectedFile
    
  • ファイルを削除する前にファイルの所有権を変更してください。

    $ echo $text | sudo tee writeProtectedFile
    $ sudo chown $(whoami) writeProtectedFile # `whoami` returns the current user name
    $ rm writeProtectedFile
    
  • rmファイルが書き込み禁止であることを無視するように指示するには、次のようにします-f, --force

    $ echo $text | sudo tee writeProtectedFile
    $ rm --force writeProtectedFile
    

答え2

作成中のファイルが にある場合、/etcそのファイルは削除できません。つまり、一般ユーザーなら次のようにします。

$ sudo touch /etc/foobar
$ rm /etc/foobar

動作しますtouchが、ディレクトリへの書き込み権限がrmないため失敗します。/etc

オペレーティングシステムのカーネルレベルでは、ファイルの書き込み権限は削除(または名前変更/移動)とは関係ありません。書き込み禁止ファイルを削除するように求められるのは、rmプログラムに組み込まれているアプリケーションレベルの機能にすぎません。yプロンプトで話すときに最初に権限を変更せずにファイルを消去するには、オペレーティングrmシステム(おそらくこの機能)を呼び出します。unlink(ファイルを所有していないので権限を変更することもできません!)

ただし、ディレクトリの内容を変更する操作(ファイルの追加または削除など)には、ディレクトリへの書き込み権限が必要です。

要約すると、ここでやるべきことは次のとおりです。

$ sudo rm -f /etc/foobar

sudo必要な書き込み権限を持ち、プロンプトを表示したくない場合は、ルートである必要が/etcあり-fますrm

答え3

あなたはあなたの目標が次のように言った。

sudo echo "whatever" >> /etc/someFile

ただし、リダイレクトとともに>>ルート権限も提供されます。この選択肢を考えてみましたか?

sudo sh -c "echo 'whatever' >> /etc/someFile"

sudo sh遅延を試みる代わりに、シェル変数(存在する場合)が呼び出し前に補間されるように、式の周囲に二重引用符を使用していますsh。これは、ほとんどのsudo環境を縮小して一部の変数が存在しない可能性があり、他の変数にはリセットがある可能性があるためです。たとえば、$$呼び出し元のpidがsh

関連情報