web-dev-qa-db-ja.com

sudoを使用してrootが所有するファイルにテキストを挿入する方法は?

重複の可能性:
書き込み権限のないファイルにstdoutをリダイレクトしています

Sudo echo 'text' >> /file.txtのようなコマンドを実行すると、次のエラーで失敗します:

bash: /file.txt: Permission denied
48
tshepang

リダイレクトが適用されるコマンドではなくシェルによって実行されるため、これは機能しません。ただし、シェルは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"を実行することもできます。これも機能しますが、複雑な式がある場合に干渉する可能性のあるすべての補間/エスケープが少し面倒です。

8
Thomas Themel