sudo vi を使用して root が所有するファイルを更新できるのに、sudo echo "Thing" >> file を使用して行を追加できないのはなぜですか?

sudo vi を使用して root が所有するファイルを更新できるのに、sudo echo "Thing" >> file を使用して行を追加できないのはなぜですか?

別の Web サイトから Web サイトを自動的に移行するスクリプトで、/etc/httpd/conf.d/vhosts.conf ファイルに Includes を追加できるようにしたいと思います。

ただし、echo を使用してファイルの末尾に文字列を追加しようとすると、次のようになります。

$ sudo echo "Include thing" >> /etc/httpd/conf.d/vhosts.conf
-bash: /etc/httpd/conf.d/vhosts.conf: Permission denied

それでも、vi /etc/httpd/conf.d/vhosts.conf にアクセスし、行を追加して :wq でファイルを保存し、閉じることはできます。

何が足りないのでしょうか?

答え1

Sudo は、呼び出すプロセスを昇格しますが、リダイレクト、グロブなどの現在のシェルの処理は昇格しません。

ファイルのリダイレクト>> /etc/httpd/conf.d/vhosts.confは、現在シェルは、現在の権限で引き続き実行されています。

このようなことを試してみてはいかがでしょうか。

sudo bash -c 'echo "Include thing" >> /etc/httpd/conf.d/vhosts.conf'

または

echo "Include thing" | sudo tee -a /etc/httpd/conf.d/vhosts.conf

関連情報