与DefaultSftpSessionFactory的SFTP连接问题

时间:2013-07-31 11:12:57

标签: spring sftp spring-integration jsch

我正在尝试使用org.springframework.integration.sftp.session.DefaultSftpSessionFactory连接到一个特定的SFTP服务器。

建立连接后,连接就会丢失。

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-server 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);   
} 

}

1 个答案:

答案 0 :(得分:0)

请打开'Improvement' JIRA Issue。目前,您必须子类化(或克隆)DefaultSftpSessionFactoryDefaultSftpSession,从而覆盖工厂中的getSession()方法。不幸的是,会话中的connect()是包私有的,所以你不能简单地覆盖它。

看起来你只需改变这两行

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

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

subsystemMySftpSessionFactory上的属性,而connect(String subsystem)与SftpSession上的connect()类似。

但是,我注意到getSession()使用了其他一些私有方法(例如initJschSession),因此可能更容易复制工厂并为其命名。我讨厌建议,但现在对子类化不是很友好。请在JIRA问题中记下它(除了添加子系统之外,我们应该使工厂更容易进行子类化。