我想连接到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来实现上述目标?
我们也遇到了同样的问题,并找到了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上,所以您必须克隆回购并自己构建它。
我不认为有任何开源Java库支持您所需要的一切。
有一个名为jNQ的非开源库,名为“Visuality Systems”
此库支持所有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);
我想它可以帮助你提高jcifs ng。
**// Option 1 - SMB2 and SMB3:**
Properties prop = new Properties();
prop.put( "jcifs.smb.client.enableSMB2", "true");
prop.put( "jcifs.smb.client.disableSMB1", "false");
prop.put( "jcifs.traceResources", "true" );
Configuration config = new PropertyConfiguration(prop);
CIFSContext baseContext = new BaseContext(config);
CIFSContext contextWithCred = baseContext.withCredentials(new NtlmPasswordAuthentication(baseContext, domain, fileSystemInfo.getUsername(), fileSystemInfo.getPassword()));
SmbFile share = new SmbFile(fullPath.replace('\', '/'), contextWithCred);
if (!share.exists())
{
share.mkdirs();
}
share.close();
//选项2-SMB1和CIFS:
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();
我必须更新一个旧的文件共享软件,该软件使用JCIFS for Windows Server 2012。出于安全目的,我们必须禁用SMB 1.0/CIFS兼容性。有人知道可以在Java中使用的变通方法或修复程序或JCIFS的替代方案吗?
我在/mnt/SMB/下挂载了一个SMB共享文件夹,我可以访问这些文件。当我使用命令卸载此共享文件夹时:
我有一台Windows CE 5.0计算机,该计算机具有文件的smb共享。 此文件是由批处理脚本创建的,该脚本将另一个exe的stderr重定向到该文件:。 考虑到在运行时,我无法在Windows CE计算机上使用打开,这一操作非常有效。如果我尝试,NotepadCE将显示一个共享冲突错误。 同一文件可以由其smb共享同时读取,不会出现任何问题。 是否有一种方法可以使Windows CE计算机上的
我正在寻找从连接到共享的Windows计算机导出SMB/CIFS共享的ACL(不要与NTFS ACL混淆)的方法。到目前为止,我可以在共享的高级安全属性中看到权限,但除了AutoIT怪物之外,无法导出或解析它们。 我想以我可以解析的格式获取这些信息,无论是CSV、JSON、XML等。 我已经检查了这个问题,该问题建议使用Powershell的:使用Powershell检索远程文件共享“共享权限”,
我在使用Docker容器时遇到了一个有点烦人的问题(我使用的是Ubuntu,所以没有像VMWare或b2d这样的虚拟化)。我已经构建了我的映像,并且有一个正在运行的容器,其中有一个来自主机的共享(装入)目录和一个来自主机的共享(装入)文件。以下是命令的全文: 注意:许多用于编辑文件的工具,包括vi和sed--in-place可能会导致inode更改。从Docker V1.1.0开始,这将产生一个错
问题内容: 我有一个提供文件(包括文件名)的绝对路径的文件。我只想获取文件名。最简单的方法是什么? 必须尽可能地笼统,因为我无法事先知道该URL是什么。我不能简单地创建一个URL对象并使用-尽管所有可能的情况都是理想的- 因为它不一定是前缀,它可以是c:/或类似的东西。 问题答案: 要么 请注意,第一个解决方案取决于系统。它仅考虑系统的路径分隔符。因此,如果您的代码在Unix系统上运行并接收Win