「sudo権限が必要なファイルにリダイレクトしようとしたら、Permission deniedになった」
この記事では、teeコマンドの基本的な使い方から、sudo権限でのファイル書き込み、ログ記録への活用まで、実務で役立つテクニックを解説します。
・tee は画面表示とファイル保存を同時に行うパイプ中継コマンド
・sudo tee は「sudo >」が使えない問題の定番の解決策
・-a(追記)と 2>&1 を組み合わせれば、完全な実行ログを残せる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
teeコマンドとは?
teeコマンドは、標準入力から受け取ったデータを「画面(標準出力)」と「ファイル」の両方に同時に出力するコマンドです。名前の由来は、配管のT字分岐(T-pipe)です。水が2方向に流れるように、データの流れを画面とファイルに分岐させます。
通常のリダイレクト(>)ではファイルに保存すると画面に表示されず、画面に表示するとファイルに残りません。teeを使えば、この「どちらか片方」の制約を解消できます。
基本的な使い方
1. 画面に表示しながらファイルに保存する
パイプ(|)でteeに渡すのが基本の形です。# lsの結果を画面に表示しつつ、filelist.txtに保存 ls -l | tee filelist.txt
2. ファイルに追記する(-a)
デフォルトではteeはファイルを上書きします。既存の内容を残して追記するには -a(append)オプションを使います。# 実行ログを追記していく echo "処理開始: $(date)" | tee -a /var/log/myapp.log some_command echo "処理完了: $(date)" | tee -a /var/log/myapp.log
3. 複数のファイルに同時出力する
teeにはファイル名を複数指定できます。# 3つのファイルに同時出力 df -h | tee disk1.log disk2.log disk3.log
応用・実務Tips
1. sudo権限が必要なファイルに書き込む(sudo tee)
これがteeの最も実用的な使い方の1つです。リダイレクト(>)はシェルが処理するため、sudo echoとしてもファイルへの書き込みにsudo権限が適用されません。
# これはPermission deniedになる sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf -bash: /etc/resolv.conf: Permission denied # sudo teeなら書き込める echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 画面出力を抑制 echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
# /etc/hostsに1行追記 echo "192.168.1.100 myserver" | sudo tee -a /etc/hosts
2. パイプラインの途中経過を確認する
複数のコマンドをパイプでつないだ処理で、途中の出力を確認しながら次に渡すことができます。# grepの結果を確認しつつ、wcで行数をカウント cat /var/log/messages | grep "error" | tee /tmp/errors.log | wc -l
3. スクリプトの実行ログを残す
スクリプト全体の出力をログに記録しつつ、画面でも確認する使い方です。# スクリプトの出力をすべてログに記録 ./deploy.sh 2>&1 | tee deploy_$(date +%Y%m%d).log
トラブルシュート・エラー対処
「Permission denied」が出た時の対処法
書き込み先のファイルに権限がない場合に発生します。$ echo "test" | tee /etc/myconfig tee: /etc/myconfig: Permission denied # sudo teeで解決 $ echo "test" | sudo tee /etc/myconfig
ファイルを意図せず上書きしてしまった場合
teeはデフォルトで上書きです。追記のつもりが -a を忘れてファイルを空にしてしまうことがあります。対策として、重要なファイルへの書き込み前にはバックアップを取る習慣をつけましょう。
# バックアップを取ってから書き込み cp /etc/hosts /etc/hosts.bak echo "192.168.1.100 myserver" | sudo tee -a /etc/hosts
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 画面表示しつつファイルに保存する | コマンド | tee ファイル名 |
| ファイルに追記する | コマンド | tee -a ファイル名 |
| 複数ファイルに同時出力する | コマンド | tee file1 file2 |
| sudo権限でファイルに書き込む | echo "内容" | sudo tee ファイル名 |
| sudo権限でファイルに追記する | echo "内容" | sudo tee -a ファイル名 |
| 画面出力を抑制してファイルのみに書く | コマンド | tee ファイル名 > /dev/null |
| 実行ログを記録する(エラー含む) | コマンド 2>&1 | tee log.txt |
サーバー作業の証跡を確実に残したい方へ
tee によるログ記録は、トラブル発生時に必ず役立つ運用の基本です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
