
書き込み権限なしでファイルを変更しようとすると、次のエラーメッセージが表示されます。
> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Sudoingはコマンドをrootとして実行するので役に立ちませんが、シェルはstdoutリダイレクトとファイルを開くことをユーザーが行った方法で処理します。
> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo
rootでシェルを開き、そのようにファイルを操作するだけでなく、書き込み権限のないファイルにstdoutをリダイレクトする簡単な方法はありますか?
> sudo su
# echo test > /tmp/foo
答え1
はい、使用してくださいtee
。echo test > /tmp/foo
echo test | sudo tee /tmp/foo
>>
()を追加することもできます。
echo test | sudo tee -a /tmp/foo
答え2
ファイルの内容をシェルリダイレクト演算子の出力echo
に置き換えます。>
echo test | sudo dd of=/tmp/foo
切り捨てなしでファイルに書き込むには(最初はseek
出力に別のオフセットを使用できますが)(1<>
Bourneシェル演算子に似ています):
echo test | sudo dd of=/tmp/foo conv=notrunc
GNUを使用してファイルに追加するには(例>>
:)dd
:
echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc
既存のファイルが破損しないようdd
にするには(POSIXシェルのように)GNUを参照し、その逆(既存のファイルのみを更新する場合)も参照してください。conv=excl
set -o noclobber
conv=nocreat
答え3
tee
おそらく最善の選択でしょう。しかし、状況によっては、次のようにしても十分です。
sudo sh -c 'echo test > /tmp/foo'
答え4
sponge
moreutils パッケージで使用されます。標準出力に書き込まないという利点があります。
echo test | sudo sponge /tmp/foo
-a
ファイルを上書きするのではなくファイルに追加するには、このオプションを使用します。