检查 samba 安装权限时 Java 是否完全兼容?
Is Java fully compatible when checking permissions on a samba mount?
我正在使用
Files.isWritable(file)
在我的 Java 应用程序中检查我是否有权在修改文件之前修改它。
这通常可以正常工作,但我有一位客户抱怨说,尽管他已经完全许可他的文件,但仍然无法正常工作。客户设置包括一个远程 linux 驱动器,通过 Samba 安装到他的 Windows 机器上,而我的软件是 运行 在 Windows 机器上。
事实证明,他已经为特定用户授予了对文件夹和文件的完全权限,而不是用户组或 linux 上的任何其他人。
如果他将 linux 的权限从 700 更改为 777 那么它就可以工作,但我不确定他是否应该这样做?
检查 samba 挂载权限时 Java 是否有问题
视情况而定。
UNIX 和 Windows 上的访问控制机制在传统上是不同的。以前,与 samba3 一样,您在这些权限之间有一个相当粗略的映射,这在较简单的情况下有效,但在较困难的情况下会出现问题。您可以找到许多处理这些特殊情况的教程、论坛帖子和邮件列表。
现在,情况变得更好了,因为有 NFSv4 风格的访问控制列表。优点有几个:
- 它就像一个接口:您对不同的系统具有相同的权限 "ideas",它们实现了自己的文件系统相关细节,这意味着您(或 Java)只需使用高级的东西。
- 它比旧的基本 UNIX 权限灵活得多,包含 创建新文件 或 创建新子目录 等内容,详细继承对于文件 and/or 目录,或拒绝和允许组合规则。
- 尽管名称不同,它不仅适用于 NFS 版本 4,还适用于当前的 Windows 权限、ZFS 上的 Solaris 10/illumos CIFS 实现和 Linux 系统上的 samba4(我相信) .
您通常使用 ACLFileAttributeView,如简短示例中所述:
// lookup "joe"
UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService()
.lookupPrincipalByName("joe");
// get view
AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class);
// create ACE to give "joe" read access
AclEntry entry = AclEntry.newBuilder()
.setType(AclEntryType.ALLOW)
.setPrincipal(joe)
.setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES)
.build();
// read ACL, insert ACE, re-write ACL
List<AclEntry> acl = view.getAcl();
acl.add(0, entry); // insert before any DENY entries
view.setAcl(acl);
在您的情况下,查询第二步中的视图以获得您想要检查的权限就足够了。详细的概览,我喜欢用这个documentation from Oracle - while the examples are from chmod
, the permissions themselves are the same in Java (but there also exists the shorter JavaDoc for them, AclEntryPermission Enums).
我正在使用
Files.isWritable(file)
在我的 Java 应用程序中检查我是否有权在修改文件之前修改它。
这通常可以正常工作,但我有一位客户抱怨说,尽管他已经完全许可他的文件,但仍然无法正常工作。客户设置包括一个远程 linux 驱动器,通过 Samba 安装到他的 Windows 机器上,而我的软件是 运行 在 Windows 机器上。
事实证明,他已经为特定用户授予了对文件夹和文件的完全权限,而不是用户组或 linux 上的任何其他人。
如果他将 linux 的权限从 700 更改为 777 那么它就可以工作,但我不确定他是否应该这样做?
检查 samba 挂载权限时 Java 是否有问题
视情况而定。
UNIX 和 Windows 上的访问控制机制在传统上是不同的。以前,与 samba3 一样,您在这些权限之间有一个相当粗略的映射,这在较简单的情况下有效,但在较困难的情况下会出现问题。您可以找到许多处理这些特殊情况的教程、论坛帖子和邮件列表。
现在,情况变得更好了,因为有 NFSv4 风格的访问控制列表。优点有几个:
- 它就像一个接口:您对不同的系统具有相同的权限 "ideas",它们实现了自己的文件系统相关细节,这意味着您(或 Java)只需使用高级的东西。
- 它比旧的基本 UNIX 权限灵活得多,包含 创建新文件 或 创建新子目录 等内容,详细继承对于文件 and/or 目录,或拒绝和允许组合规则。
- 尽管名称不同,它不仅适用于 NFS 版本 4,还适用于当前的 Windows 权限、ZFS 上的 Solaris 10/illumos CIFS 实现和 Linux 系统上的 samba4(我相信) .
您通常使用 ACLFileAttributeView,如简短示例中所述:
// lookup "joe"
UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService()
.lookupPrincipalByName("joe");
// get view
AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class);
// create ACE to give "joe" read access
AclEntry entry = AclEntry.newBuilder()
.setType(AclEntryType.ALLOW)
.setPrincipal(joe)
.setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES)
.build();
// read ACL, insert ACE, re-write ACL
List<AclEntry> acl = view.getAcl();
acl.add(0, entry); // insert before any DENY entries
view.setAcl(acl);
在您的情况下,查询第二步中的视图以获得您想要检查的权限就足够了。详细的概览,我喜欢用这个documentation from Oracle - while the examples are from chmod
, the permissions themselves are the same in Java (but there also exists the shorter JavaDoc for them, AclEntryPermission Enums).