sudoでリダイレクトをしたいとき
sudoでリダイレクトに失敗
- 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というオプションを付けると追記モードになります。