Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

sudoでリダイレクトをしたいとき

sudoでリダイレクトに失敗

@yutakikuchi_です。

  • UNIX/Linuxコマンドラインで実行した結果をファイルにリダイレクトしたい時があります。(例えばPHPのバッチを実行した時に処理のログとエラーログをファイルに書き込んでおきたい。)
  • ユーザに実行権限がないディレクトリのファイルに対してリダイレクトでデータを書き込みたいとき、sudo をつけても失敗します。
  • 次はリダイレクトが失敗する例です。zsh: permission deniedと怒られます。
$ sudo echo 'redirect' >> /var/test/hoge.txt  
zsh: permission denied: /var/test/hoge.txt

うまくいく方法

以下に方法を書きます。私が知る限りでは2つ方法があります。

回避策1 : shのオプションに-cを付ける

man sudoを見てみます。そうすると以下のように実行せよという記述がありました。-cとして実行したいコマンドを""でくくるみたいです。

To make a usage listing of the directories in the /home partition.
Note that this runs the commands in a sub-shell to make the cd and file
redirection work.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

上で失敗したコマンドをこの方法でやってみます。

$ sudo sh -c "echo 'redirect' >> /var/test/hoge.txt"
$ less /var/test/hoge.txt
redirect

問題なく書き込まれました。

回避策2 : teeを使う

パイプ(|)とteeを使う事でリダイレクトを実行する事ができます。

$ echo 'redirect redirect' | sudo tee -a /var/test/hoge.txt
redirect redirect
$ less /var/test/hoge.txt
redirect
redirect redirect

※teeは-aというオプションを付けると追記モードになります。