sudoを付けたリダイレクトは失敗する

一般ユーザーで/etc配下などroot権限が必要なファイルにリダイレクト(>)で書き込もうとすると、sudoを付けても失敗する。

$ echo newcontent > /etc/protected.conf
bash: /etc/protected.conf: Permission denied

$ sudo echo newcontent > /etc/protected.conf
bash: /etc/protected.conf: Permission denied

リダイレクトはシェル自身がファイルを開く処理であり、sudoはその後ろのechoコマンドにしか適用されない。ファイルを開く時点ではまだ一般ユーザーの権限のままのため、権限エラーになる。

sudo teeで書き込む

sudoをteeコマンドに対して付けると、ファイルを開く処理自体がroot権限で行われるため書き込める。

コマンド | sudo tee ファイルパス
$ echo newcontent | sudo tee /etc/protected.conf
newcontent
$ cat /etc/protected.conf
newcontent

パイプの左側echoは一般ユーザーのまま実行されるが、右側のteeコマンドがsudoによってroot権限で実行され、ファイルを開いて書き込む。

標準出力への表示が不要な場合

sudo teeは画面にも内容を表示するため、不要であれば標準出力を/dev/nullにリダイレクトする方法と組み合わせられる。

$ echo newcontent | sudo tee /etc/protected.conf > /dev/null

参考: teeコマンドで標準出力を捨ててファイルにだけ保存する