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