2013-07-31 37 views
1

我想连接到一个特定的SFTP服务器与org.springframework.integration.sftp.session.DefaultSftpSessionFactory与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服务器sftp.zzzz.com

另外FileZilla的连接没有任何问题。

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

}

回答

0

请打开'Improvement' JIRA Issue。目前,您将不得不继承(或克隆)DefaultSftpSessionFactoryDefaultSftpSession,覆盖工厂中的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问题(除了添加的子系统,我们应该使工厂更容易的子类。