sudo でファイルへのテキスト書き込み

TL; DR

パイプで sudo tee しましょう。

$ cat <<EOS | sudo tee /root/script.txt
foo
bar
hoge
EOS

一般ユーザから sudo でコマンド実行していると、出力をファイルに書き込みたいときがあると思います。そういったとき、例えば次のように出力リダイレクトを使うのを真っ先に思いつくと思います。

$ sudo cat <<EOS >/root/script.txt
foo
bar
hoge
text
EOS

一件この出力リダイレクトは sudo で実行されるように見えますが、実際には実行ユーザの権限で書き込みを行おうとするので、当然ながら "Permission denied" を頂戴することになります。

ここで使うのが tee というコマンドで、これは入力を標準出力とファイルに同時出力というものですが、そのファイル出力を利用しようというわけです。

上記の例であれば、cat の実行自体には sudo は要らず、書込みを行う tee に sudo を付ける形になります。

$ cat <<EOS | sudo tee /root/script.txt
foo
bar
hoge
EOS

ちなみに、これを見つけるまでは次のようにして sudo cp して回避していました。

$ cat <<EOS >/tmp/script.txt
foo
bar
hoge
EOS
$ sudo cp /tmp/script.txt /root/

参考