web-dev-qa-db-ja.com

編集後にファイルの所有権を維持するにはどうすればよいですか?

私の質問は this other one に似ていますが、新しく作成されたファイルについて質問する点が異なります。

私のUnixボックスでは、ユーザーalicebobおよびTomcatはグループTomcatに属しています。

Tomcatサーバーの構成ファイルは、ユーザーTomcatが所有し、グループTomcatにあります。

アリスとボブがファイルを編集できるように、このファイルの権限をグループごとに読み取りと書き込みができるように変更しました。

ただし、編集後、ファイルを最後に編集したユーザーがファイルを所有することに気付きました。

Q:権限を変更して、アリスとボブが所有権を変更せずにファイルを編集できるようにすることはできますか?

とにかく、ファイルを編集すると、所有権はどのように変わりますか?

11
Leonel

結果のユーザーファイルは、エディターの動作によって異なります。一部のエディターは、ファイルを切り捨て、(inodeを変更せずに)ファイルを上書きして保存します。一部の編集者は、ファイルの名前を別の名前に変更し(fileからfile~が通常です)、元の名前で新しいファイルを作成します。元のファイルを変更すると所有者は同じになり、新しいファイルを作成すると、新しいファイルは作成プロセスのUIDによって所有されます。

私がDebianで使用しているエディタのうち、nanojoe、およびnvivimvim-tinyの最小バージョン)は、インプレースで上書きします。私はvimとEmacsはおそらく彼らが何をするかで構成可能だと思いますが。


Stephenがアトミックアップデートについてコメントしています。インプレースでの再作成の問題は、ファイルが長さがゼロに切り捨てられてから書き込まれることです。すべてのデータが書き込まれる前に、別のプロセスがそれを開いて読み取る可能性があります。

file.newのように新しいバージョンを作成し、file.newの名前をfileに変更することで、アトミックな更新が行われます。バックアップファイルを残して、file.newを作成し、filefile~にリンクして、file.newfileに名前変更できます。名前を変更すると、名前でファイルにアクセスするすべてのプロセスが古いバージョンまたは新しいバージョンのいずれかを取得します。もちろん、開いているファイルハンドルは開いたままにしていたファイルを指し、ファイルの一貫したビューを提供します。


ファイルのアクセス許可の観点から、同じファイル(inode)に保存するには、ファイル自体(ただしディレクトリではない)への書き込みアクセスが必要です。ファイル名を変更して新しいファイルを作成するには、ディレクトリへの書き込みアクセスが必要です(ただし、元のファイルには適用されません)。

(名前の変更と再作成は、誰かが共有ディレクトリでファイルを作成または変更したが、グループにそのファイルへの書き込みアクセス権を与えるのを忘れた場合に、ファイルのアクセス許可を修正する方法でもあります。)

17
ilkkachu

説明ilkkach のように、使用されているエディターが保存時に新しいファイルを作成する場合、所有者を制御する方法はありませんファイルの。あなたがおそらく本当に気にしていることは、Tomcatがファイルを読み取り可能な状態に保つことです。これは、グループがTomcat(およびグループによって読み取り可能)であることを確認することで実行でき、親にsetgidビットを設定することで新しいファイルに適用できますディレクトリ

chmod g+s .

したがって、bobがファイルを再作成するエディターを使用してファイルを編集した場合、編集されたファイルはbob:Tomcatが所有することになり、Tomcatは引き続きファイルを読み取ることができます(通常のumask少なくとも)。親ディレクトリがTomcatグループによって書き込み可能である限り、そのグループ内のすべてのユーザーがディレクトリ内のファイルを編集できます(ファイルを再作成する場合のみ)。

ただし、プロセスの変更を検討することをお勧めします。 Tomcatによって読み取られた場所にあるファイルを直接編集してはいけません。理想的には、ファイルはある種のVCSで保守され、別のプロセス(おそらく自動化)によって展開されます。そうすれば、これらすべての所有権の問題を回避できます...

13
Stephen Kitt