Sudo echo 'text' >> /file.txt
のようなコマンドを実行すると、次のエラーで失敗します:
bash: /file.txt: Permission denied
リダイレクトが適用されるコマンドではなくシェルによって実行されるため、これは機能しません。ただし、シェルはrootとして実行されておらず、echo 'text'
のみが実行されています。
ファイルに書き込むためのroot権限が必要であるがデータを生成する必要がない場合の一般的なトリックは、tee
を使用することです。
echo 'text' | Sudo tee -a /file.txt
tee
もテキストをstdoutに出力します。シェルの追加(>>
)に似た動作になるようにミュートするには、stdoutを/dev/null
にルーティングします。
echo 'text' | Sudo tee -a /file.txt > /dev/null
データを生成するためにroot権限が必要な場合は、2つのSudo
コマンドを実行するか、Sudo
内でシェルを実行してそこにリダイレクトします(引用符には注意してください)。
Sudo echo 'text' | Sudo tee -a /file.txt
Sudo sh -c 'echo "text" >>/file.txt'
追加ではなく上書きするときに、>
演算子(set -o noclobber
)を使用して既存のファイルを切り捨てることをシェルが拒否している場合は、この保護が適用されないことに注意してください。 Sudo sh -c 'echo >/etc/passwd'
およびSudo tee /etc/passwd
は/etc/passwd
を上書きします。そのnoclobber
設定をsh
にも適用するには、Sudo sh -o noclobber -c 'echo >/etc/passwd'
が必要ですSudo
による。
ファイルを開き、コマンドSudo echo 'text'
の出力をファイルに追加するようにbashに指示しています。もちろん、bashは非ルートとして実行されるため、これは機能しません。対話的に、私は通常これを回避するためにSudo -s
を実行します(その後、シェルはrootとして実行され、ファイルを開くことができるため)。または、Sudo sh -c "echo 'text' >> /file.txt"
を実行することもできます。これも機能しますが、複雑な式がある場合に干渉する可能性のあるすべての補間/エスケープが少し面倒です。