Достъп до файл чрез Java със Samba JCIFS

Имам въпрос относно достъпа до файл със Samba JCIFS.

Така че има сървър, до който искам достъп, нека го наречем server.unv.edu и работната група е WKGRP.

Има дял в този сървър: \\server.unv.edu\pcb$

начинът, по който се опитвам да осъществя достъп до сървъра, е:

public class SMBAuthenticator extends NtlmAuthenticator {

private String username = "username";
private String password = "password";
private String domain = "smb://server.unv.edu/WKGRP/";

public SMBAuthenticator() {
    NtlmAuthenticator.setDefault(this);
}

и

public class SMBConnection {

public String urlString = "smb://server.unv.edu/pcb$/path/file.txt";
NtlmPasswordAuthentication auth;
SmbFile smbFile;

public SMBConnection() throws MalformedURLException{;
    //url = new URL(urlString);
    SMBAuthenticator authenticator = new SMBAuthenticator();
    auth = authenticator.getNtlmPasswordAuthentication();   
    smbFile = new SmbFile(urlString, auth);
}

public InputStream getSMBInputStream() throws IOException{
    return this.smbFile.getInputStream();
}

public InputStream getInputStream() throws IOException{
    InputStream is = this.getSMBInputStream();
    return is;
}
}

Но това не работи. Получих грешка от:

jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password.
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:544)
at jcifs.smb.SmbTransport.send(SmbTransport.java:661)
at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)
at jcifs.smb.SmbSession.send(SmbSession.java:218)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:929)
at jcifs.smb.SmbFile.connect(SmbFile.java:954)
at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
at jcifs.smb.SmbFile.open0(SmbFile.java:972)
at jcifs.smb.SmbFile.open(SmbFile.java:1006)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65)
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)
at edu.umd.lib.sambaConnection.SMBConnection.getSMBInputStream(SMBConnection.java:33)
at edu.umd.lib.sambaConnection.SMBConnection.getInputStream(SMBConnection.java:37)
at edu.umd.lib.sambaConnection.SambaConnectionTest.test(SambaConnectionTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Може ли някой да ми даде предложение или коректност на моя код, за да ми помогне да получа достъп до файла?


person Allan Jiang    schedule 14.10.2011    source източник
comment
Първо бих тествал кода спрямо локален файл (или споделяне, което току-що създадохте) и след това опитах с отдалечения сървър. Това, за да можете да се уверите, че вашият код е наред и не е нещо друго (като разрешения).   -  person jmend    schedule 20.04.2012


Отговори (2)


Вие правите това по-трудно, отколкото би трябвало да бъде. Моля, следвайте стъпките по-долу и се уверете, че споделената папка, която създавате, има достъп за запис за този потребител, който използвате.

  1. изтеглете jar файла http://jcifs.samba.org/ (има само един jar файл)
  2. копирайте и поставете кода по-долу с вашата информация за потребителско име, парола и споделена папка и това е всичко, от което се нуждаете

Пусках това на Linux и исках да пиша в кутия на Windows, така че искате да създадете споделена папка и да поставите името на споделената папка в променливата по-долу, ако не знаете как да създадете споделена папка на windows ... използвайте google както винаги

    String user = "your_user_name";
    String pass ="your_pass_word";

    String sharedFolder="shared";
    String path="smb://ip_address/"+sharedFolder+"/test.txt";
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass);
    SmbFile smbFile = new SmbFile(path,auth);
    SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
    smbfos.write("testing....and writing to a file".getBytes());
    System.out.println("completed ...nice !");
person grepit    schedule 19.10.2012
comment
Има ли начин да се провери дали удостоверяването е било успешно или не? Опитах с auth.equals(true), но изглежда не връща нищо, въпреки че удостоверяването беше успешно. - person Justin George; 24.02.2015
comment
Имам рутер с usb връзка. Свързах хард диск към него. Mac OS има директен достъп до него. Искам да осъществя достъп до него с Java, но не знам потребителското име и паролата. Как мога да го разбера? Папката например е тук: smb://air5750nas/KORAY/Diziler Но какво е паролата за потребителско име, която OSX използва? - person Koray Tugay; 26.02.2015
comment
Къде мога да намеря потребителя и да премина към Samba сървъра? - person AlexWhite; 31.03.2021

person    schedule
comment
Пакет com.wellsfargo... Наистина ли? Wells Fargo съгласен ли е да копирате/поставите това на обществено място? - person TT.; 16.08.2019