web-dev-qa-db-ja.com

sudoeditが一時ディレクトリに書き込むのはなぜですか?

私はsudoeditを使用してファイルを作成しました:

 $ sudoedit /etc/systemd/system/Apache2.service

しかし、ファイルを保存しようとすると、一時ディレクトリ(/ var/temp/blahblah)に書き込まれました。何が起こっている?システムディレクトリに保存しないのはなぜですか?

10
Tyler Durden

sudoeditの目的は、権限のないエディターを実行しながら、ユーザーが他の方法では許可されていなかったファイルを編集できるようにすることです。これを実現するために、sudoeditは編集するファイルを一時的な場所にコピーし、要求元のユーザーが書き込みできるようにして、構成されたエディターで開きます。これが、エディタが一時ディレクトリに無関係なファイル名を表示する理由です。エディターが終了すると、sudoeditは実際に変更が行われたかどうかを確認し、必要に応じて変更された一時ファイルを元の場所にコピーします。

22
Stephen Kitt

これは the Sudo manpage でうまく説明されています。 _-e_(sudoeditと同等)の説明は次のとおりです。

_-e_

_-e_(編集)オプションは、コマンドを実行する代わりに、ユーザーが1つ以上のファイルを編集したいことを示します。コマンドの代わりに、文字列 "sudoedit"がセキュリティポリシーを調べるときに使用されます。ユーザーがポリシーによって承認されている場合、次の手順が実行されます。

  1. 一時的なコピーは、編集されるファイルから作成され、所有者は呼び出し元のユーザーに設定されます。
  2. ポリシーで指定されたエディターが実行され、一時ファイルが編集されます。 sudoersポリシーは、_Sudo_EDITOR_、VISUALおよびEDITOR環境変数を(この順序で)使用します。 _Sudo_EDITOR_、VISUALEDITORのいずれも設定されていない場合、エディターのsudoers(5)オプションにリストされている最初のプログラムが使用されます。
  3. 変更されている場合、一時ファイルは元の場所にコピーされ、一時バージョンは削除されます。

指定したファイルが存在しない場合は作成されます。 Sudoによって実行されるほとんどのコマンドとは異なり、エディターは、呼び出し元のユーザーの環境を変更せずに実行されます。何らかの理由でSudoが編集済みのバージョンでファイルを更新できない場合、ユーザーに警告が表示され、編集済みのコピーは一時ファイルに残ります。

特に、3番目のステップに注意してください。編集の最後にファイルが変更された場合のみ、元のファイルが変更されます。したがって、ファイルを監視するプログラムがある場合、これは、(a)中間書き込みが取得されること、および(b)最後に変更を行わないことにした場合の不要なアクションを回避するのに役立ちます。

1
user321247