无法使用 jcifs 连接到 samba 服务器

Can't connect to samba server with jcifs

我正在尝试将一些文件从我的本地计算机复制到与我的计算机连接在同一网络中的 samba 服务器 Java。

如果我尝试通过浏览器登录或在 Ubuntu 网络设备文件夹中打开它没有问题,但是通过 Java 我似乎无法成功登录。

这是我的代码:

public static void function() throws MalformedURLException, SmbException {
    String urlToBackUpFile = "smb://dlink-5e6490//Volume_1/newfolder/file.zip";
    NtlmPasswordAuthentication auth = new **NtlmPasswordAuthentication("192.168.1.8", "admin", null);**
    SmbFile dir = new SmbFile(urlToBackUpFile, auth);
    SmbFile dest = new SmbFile("file:///home/username/file.zip");
    dir.copyTo(dest);
}

我总是得到两个错误之一。

如果我只在用户名和密码字段中插入域和 null,我会收到此错误:

Exception in thread "main" jcifs.smb.SmbException: The network name cannot be found. at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:563) at jcifs.smb.SmbTransport.send(SmbTransport.java:663) at jcifs.smb.SmbSession.send(SmbSession.java:238) at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176) at jcifs.smb.SmbFile.doConnect(SmbFile.java:911) at jcifs.smb.SmbFile.connect(SmbFile.java:957) at jcifs.smb.SmbFile.connect0(SmbFile.java:880) at jcifs.smb.SmbFile.copyTo(SmbFile.java:2304) at javaapplication2.JavaApplication2.function(JavaApplication2.java:40) at javaapplication2.JavaApplication2.main(JavaApplication2.java:48) Java Result: 1

但是,如果我尝试将值 "admin" 插入到用户名和 null 到密码(管理员帐户没有密码)它给了我这个错误:

Exception in thread "main" jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password. at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:406) at jcifs.smb.SmbSession.send(SmbSession.java:218) at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176) at jcifs.smb.SmbFile.doConnect(SmbFile.java:911) at jcifs.smb.SmbFile.connect(SmbFile.java:957) at jcifs.smb.SmbFile.connect0(SmbFile.java:880) at jcifs.smb.SmbFile.copyTo(SmbFile.java:2303) at javaapplication2.JavaApplication2.function(JavaApplication2.java:40) at javaapplication2.JavaApplication2.main(JavaApplication2.java:48) Java Result: 1

我在 NtlmPasswordAuthentication 行中尝试了各种组合,例如...

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("192.168.1.8", null, null);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("192.168.1.8", "admin", null);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("192.168.1.8", "admin", "");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://dlink-5e6490/", null, null);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://dlink-5e6490/", "admin", null);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("smb://dlink-5e6490/", "admin", "");

...但似乎没有任何效果。

有谁知道问题出在哪里?

为了完成这项任务,我最终使用了 Linux 命令:

String command = "mount -o password=\"" + serverPassword + "\" -t cifs //192.168.1.8/Volume_1 /mnt/files/";

String[] cmd = {"/bin/bash", "-c", ("echo " + sudoPassword + "| sudo -S " + command)};

Runtime.getRuntime().exec(cmd);

不建议以这种方式使用 sudo,但这是我设法让它工作的唯一方法。