web-dev-qa-db-ja.com

LinuxでJava.nio.Filesを使用してファイル所有者グループを変更する

Linuxサーバーがあり、サーバー上の複数のWebサイトに対してJavaで画像サイズ変更ジョブを実行しています。WebサイトファイルはさまざまなOSユーザー/グループによって所有されています。新しく作成されたサムネイル/プレビューは次のとおりです。サイズ変更ジョブを実行しているユーザーが所有しています。サイズ変更プログラムで新しく作成されたプレビュー/サムネールのファイル所有者を変更する方法を調べていたところ、次のことがわかりました。

Java.nio.file.Files.setOwner(Path path, UserPrincipal owner);

これは、Windowsの場合は本当に問題を解決しますが、Linuxファイルには所有者としてユーザーとグループがあるため、少し問題があります。残念ながら、与えられた方法はファイルのユーザー所有権を変更するだけのようです。グループの所有権は、my Javaサイズ変更ジョブを実行しているユーザーのグループに残ります。

Webサイトはさまざまなグループによって所有されているため、サイズ変更ジョブのユーザーを1つのグループに追加することはできません。また、ProcessBuilderを使用したシステムコールを回避し、ファイルに対してchownを実行したいと思います。

作成されたファイル(プレビュー/サムネイル)はWebサイトからアクセスでき、グループの所有権を変更することはミッションクリティカルではありませんが、できるだけクリーンにしたかったことを指摘する必要があります。

Javaのみを使用してLinuxでファイルのグループ所有権を変更する方法についての提案はありますか?

15
Peter Ilfrich

私を正しい方向に向けてくれたジム・ギャリソンに感謝します。ここに、私にとって問題を最終的に解決したコードがあります。

ファイルのグループ所有者を取得します

File originalFile = new File("original.jpg"); // just as an example
GroupPrincipal group = Files.readAttributes(originalFile.toPath(), PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS).group();

ファイルのグループ所有者を設定します

File targetFile = new File("target.jpg");
Files.getFileAttributeView(targetFile.toPath(), PosixFileAttributeView.class, LinkOption.NOFOLLOW_LINKS).setGroup(group);
24
Peter Ilfrich

私は完全な解決策を逃しました、ここに来ます(他の答えとコメントの組み合わせ):

Path p = your file's Path;
String group = "GROUP_NAME";
UserPrincipalLookupService lookupService = FileSystems.getDefault()
            .getUserPrincipalLookupService();
GroupPrincipal group = lookupService.lookupPrincipalByGroupName(group);
Files.getFileAttributeView(p, PosixFileAttributeView.class,
            LinkOption.NOFOLLOW_LINKS).setGroup(group);

ファイルの所有者のみがそのグループを変更でき、彼がメンバーであるグループにのみ変更できることに注意してください...

14
adler

パッケージを見てくださいJava.nio.file.attributesおよびclassPosixFilePermissions。ここで、グループのアクセス許可を操作できます。

3
Jim Garrison