Apache Mina и JSch не могут установить домашний каталог

Я пытаюсь написать модульный тест с использованием Apache Mina и JSch, и я столкнулся с проблемой, которая, я уверен, связана с тем, как я настроил файловую систему на Mina.

Вот код установки Mina:

sshd = SshServer.setUpDefaultServer();
sshd.setPort(8002);

sshd.setFileSystemFactory(new NativeFileSystemFactory() {
  @Override
  public void setCreateHome(boolean createHome)
  {
    super.setCreateHome(true);
  }
  @Override
  public FileSystemView createFileSystemView(final Session session) {

    String userName = session.getUsername();
    // create home if does not exist
    String homeDirStr = "/home/testusr";                    
    File homeDir = new File(homeDirStr);

    if ((!homeDir.exists()) && (!homeDir.mkdirs())) {
      System.out.println("Cannot create user home :: " + homeDirStr);
    }

    return new NativeFileSystemView(session.getUsername(), false) {
      @Override
      public String getVirtualUserDir() {        
        return "/home/testusr";        
      }
    };
  };
});

sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
    userAuthFactories.add(new UserAuthNone.Factory());
    sshd.setUserAuthFactories(userAuthFactories);
sshd.setPublickeyAuthenticator(new PublickeyAuthenticator() {
    public boolean authenticate(String username, PublicKey key, ServerSession session) {
           return true;
       }
});
sshd.start();

Код JSch:

JSch jsch = new JSch();

String appPublicKey = "c:\\conf\\test_private";
jsch.addIdentity(new File(appPublicKey).getAbsolutePath());

com.jcraft.jsch.Session session = jsch.getSession("testusr","localhost", 8002);
session.setConfig("StrictHostKeyChecking", "no");
session.setTimeout(30000);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;

String filename = "c:\\temp\\test.tar.gz";
File f = new File(filename);
sftpChannel.put(new FileInputStream(f), "/home/testusr");

Исключение:

    4: 
    at com.jcraft.jsch.ChannelSftp.getHome(ChannelSftp.java:2403)
    at com.jcraft.jsch.ChannelSftp.getCwd(ChannelSftp.java:2412)
    at com.jcraft.jsch.ChannelSftp.remoteAbsolutePath(ChannelSftp.java:2904)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:517)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:492)
    at com.SftpServiceTest.sendFile(SftpServiceTest.java:183)
    at com.SftpServiceTest.main(SftpServiceTest.java:218)
Caused by: java.io.IOException: inputstream is closed
    at com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2871)
    at com.jcraft.jsch.ChannelSftp.header(ChannelSftp.java:2895)
    at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2315)
    at com.jcraft.jsch.ChannelSftp.getHome(ChannelSftp.java:2397)
    ... 6 more

Кажется, я не могу найти хороших примеров создания FileSystemView. Надеясь, что кто-то может мне помочь, я застрял на этом несколько дней!

Заранее спасибо.


person user3403657    schedule 10.03.2014    source источник


Ответы (3)


Вот как я закончил настройку Jsch и Mina в модульном тесте:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = { "classpath:context.xml" }) открытый класс SftpTaskletLetterTest расширяет AbstractAomTest {

@Autowired
private SftpTaskletLetter cut;

private SshServer sshd = null;

@Before
public void setUp() throws Exception {
    sshd = createAndStartSSHServer();
}

@After
public void tearDown() throws Exception {
    sshd.stop();
}

@Test
public void testPutAndGetFile() throws Exception {
    JSch jsch = new JSch();

    Hashtable<String, String> config = new Hashtable<>();
    JSch.setConfig(config);

    Session session = jsch.getSession("assentisftp", "127.0.0.1", 22);

    UserInfo ui = new MyUserInfo();
    session.setUserInfo(ui);
    session.connect();

    // Channel channel = session.openChannel("session"); // works
    Channel channel = session.openChannel("sftp");
    channel.connect();

    ChannelSftp sftpChannel = (ChannelSftp) channel;

    final String testFileContents = "some file contents";

    String uploadedFileName = "uploadFile";
    sftpChannel.put(new ByteArrayInputStream(testFileContents.getBytes()), uploadedFileName);

    String downloadedFileName = "downLoadFile";
    sftpChannel.get(uploadedFileName, downloadedFileName);

    File downloadedFile = new File(downloadedFileName);
    assertTrue(downloadedFile.exists());

    if (sftpChannel.isConnected()) {
        sftpChannel.exit();
    }

    if (session.isConnected()) {
        session.disconnect();
    }
}

public static SshServer createAndStartSSHServer() throws IOException {
    SshServer result = SshServer.setUpDefaultServer();
    result.setPort(22);
    result.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
    result.setPasswordAuthenticator(new PasswordAuthenticator() {
        public boolean authenticate(String username, String password, ServerSession session) {
            return "assentisftp".equals(username);
        }
    });
    result.setSubsystemFactories(Arrays.<NamedFactory<Command>> asList(new SftpSubsystem.Factory()));
    result.start();
    return result;
}

@Override
protected MandatorType getMandator() {
    return MandatorType.MAN;
}

public static class MyUserInfo implements UserInfo {

    @Override
    public String getPassphrase() {
        return "";
    }

    @Override
    public String getPassword() {
        return "";
    }

    @Override
    public boolean promptPassword(String message) {
        return true;
    }

    @Override
    public boolean promptPassphrase(String message) {
        return true;
    }

    @Override
    public boolean promptYesNo(String message) {
        return true;
    }

    @Override
    public void showMessage(String message) {
    }
}

}

person Urs Wiss    schedule 22.01.2015

Я думаю, что проблема в этой строке:

sftpChannel.put(new FileInputStream(f), "/home/testusr"); 
//missing remote file name 

Это должно работать:

sftpChannel.put(new FileInputStream(f), "test.tar.gz");

С Уважением

person Martin P.    schedule 09.05.2014

Я знаю, что это старый пост, но, возможно, это поможет кому-то.

У меня была такая же проблема. Я использовал jsch версии 0.5.0, и проблема заключалась в том, чтобы получить размер пути к файлу и преобразовать его в число с помощью String.format(). Я обновился до другой версии jsch, потому что в этой версии есть ошибка. После обновления все заработало.

person Robert Gabriel    schedule 14.02.2017