我想连接到SMB服务器并浏览其文件,并且对于给定路径,能够检索具有名称和权限的文件和文件夹列表。
我需要支持所有SMB方言,并且能够从我的代码中完成。
代码大致如下:
smbClient.connect(serverInfo);
info = smbClient.getShare(shareName);
for(File file : info.getFiles) {
List<permission> permissions = file.getPermissions();
//do something
}
我尝试了一些选项,例如smbj,impacket,nmap,samba,但这些选项似乎都不符合我的要求。
有没有办法实现上述目标,使用Java,Python或任何可以从我的Java代码调用的Linux CLI?
答案 0 :(得分:2)
我想它可以帮助你改进jcifs-ng。
SingletonContext context = SingletonContext.getInstance();
CIFSContext testCtx = context.withCredentials(
new NtlmPasswordAuthentication(
context, domain, fileSystemInfo.getUsername(), fileSystemInfo.getPassword()
)
);
SmbFile smbFile = new SmbFile(fullPath.replace('\', '/'), testCtx);
if (!smbFile.exists())
{
smbFile.mkdirs();
}
smbFile.close();
//选项2 - SMB1和CIFS:
python
from matlab.engine import pythonengine
pythonengine.find_matlab()
答案 1 :(得分:0)
如果您运行的是Windows并且运行该程序的用户可以访问共享,则只需使用java.nio即可。 Java.nio允许您访问SMB共享。
Path path = Paths.get(<SharedFile>);
AclFileAttributeView aclAttribute = Files.getFileAttributeView(path, AclFileAttributeView.class);
然后,您可以使用aclAttribute.getAcls();
来获取用户及其权限。
答案 2 :(得分:0)
我认为没有任何开源Java库可以满足您的所有需求。
“Visuality Systems”有一个名为jNQ的非开源库
此库支持所有SMB方言(SMB1至SMB3.1.1)
在链接中有一个用于浏览的代码示例(您可以获取列表中每个文件的安全描述符):
PasswordCredentials cr = new PasswordCredentials("userName", "password", "domain");
Mount mt = new Mount("IpAddress","ShareName", cr);
Directory dir = new Directory(mt, "dir1");
Directory.Entry entry;
System.out.println(DIR + " scan:");
do {
entry = dir.next();
if (null != entry)
System.out.println(entry.name + " : size = " + entry.info.eof);
} while (entry != null);
答案 3 :(得分:0)
我们遇到了同样的问题,并且发现jcifs-ng最能满足我们使用java的要求(我们仅在v1和v2上测试它,但最新版本也支持v3)。 您的代码如下:
Configuration config = new PropertyConfiguration(new Properties());
CIFSContext context = new BaseContext(config);
context = context.withCredentials(new NtlmPasswordAuthentication(null, domain, userName, password));
String share = "smb://HOSTNAME/SHARENAME/";
try (SmbFile share = new SmbFile(url, context)) {
for (SmbFile file : share.listFiles()) {
ACE[] groups = file.getSecurity();
// Do something..
}
}
ACE是一个访问控制条目,它是一个控制或监视对象访问的元素(简称,权限)。
请注意,最新版本可能还没有在Maven或Gradle上,因此您必须自己克隆存储库并自行构建。