Проблема с SFTP-соединением с DefaultSftpSessionFactory

Я пытаюсь подключиться к одному конкретному SFTP-серверу с помощью org.springframework.integration.sftp.session.DefaultSftpSessionFactory.

Соединение теряется сразу после установления соединения.

Caused by: com.jcraft.jsch.JSchException: failed to send channel request
    at com.jcraft.jsch.Request.write(Request.java:65)
    at com.jcraft.jsch.RequestSftp.request(RequestSftp.java:47)
    at com.jcraft.jsch.ChannelSftp.start(ChannelSftp.java:217)
    at com.jcraft.jsch.Channel.connect(Channel.java:208)
    at com.jcraft.jsch.Channel.connect(Channel.java:145)
    at 

С одной и той же библиотекой я без проблем подключаюсь к нескольким разным SFTP-серверам.

Затем я попытался подключиться из командной строки с помощью команды ниже, но потерпел неудачу.

sftp -oIdentityFile=sftp_user_rsa -oUser=sftp_user sftp.zzzz.com

После нескольких попыток с разными параметрами я подключился после указания подсистемы.

sftp -oIdentityFile=sftp_user_rsa -oUser=sftp_user -s/usr/libexec/sftp-сервер sftp.zzzz.com

Также filezilla подключается без проблем.

Под капотом DefaultSftpSessionFactory используется канал sftp и настройка подсистемы на sftp. Эта часть жестко закодирована.

Есть ли способ использовать другую подсистему с этой библиотекой?

Большое спасибо


После расширения библиотеки (интеграция Spring SFTP) и используемой библиотеки (JSch) все еще не работает. Даже при изменении RequestSftp из исходного кода следующим образом и замене жестко запрограммированной подсистемы;

 public class RequestSftp extends Request{   
     RequestSftp(){
     setReply(true);   
 }   
 public void request(Session session, Channel channel) throws Exception{
     super.request(session, channel);

     Buffer buf=new Buffer();
     Packet packet=new Packet(buf);
     packet.reset();
     buf.putByte((byte)Session.SSH_MSG_CHANNEL_REQUEST);
     buf.putInt(channel.getRecipient());
     buf.putString(Util.str2byte("subsystem"));
     buf.putByte((byte)(waitForReply() ? 1 : 0));
     buf.putString(Util.str2byte("the-new-subsystem"));
     write(packet);   
} 

}


person user2637582    schedule 31.07.2013    source источник


Ответы (1)


Пожалуйста, откройте "Улучшение" JIRA Issue. В настоящее время вам придется создать подкласс (или клонировать) DefaultSftpSessionFactory и DefaultSftpSession, переопределив метод getSession() в фабрике. К сожалению, connect() в сеансе является закрытым для пакета, поэтому вы не можете просто переопределить его.

Похоже, вам просто нужно изменить эти две строки

SftpSession sftpSession = new SftpSession(jschSession);
sftpSession.connect();

MySftpSession sftpSession = new MySftpSession(jschSession);
sftpSession.connect(subsystem);

Где subsystem будет свойством MySftpSessionFactory, а connect(String subsystem) будет похоже на connect() в SftpSession.

Однако я заметил, что getSession() использует некоторые другие закрытые методы (такие как initJschSession), поэтому может быть проще просто скопировать фабрику и дать ей новое имя. Ненавижу это предлагать, но сейчас это не очень удобно для создания подклассов. Пожалуйста, отметьте это в выпуске JIRA (помимо добавления подсистемы, мы должны упростить подкласс фабрики.

person Gary Russell    schedule 31.07.2013