首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与DefaultSftpSessionFactory的连接问题

与DefaultSftpSessionFactory的连接问题
EN

Stack Overflow用户
提问于 2013-07-31 11:12:57
回答 1查看 2.4K关注 0票数 2

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

连接在建立连接后立即丢失。

代码语言:javascript
复制
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。那部分是硬编码的。

有什么方法可以在这个库中使用不同的子系统吗?

非常感谢

在扩展了库()和它所使用的库(JSch)之后,仍然无法工作。即使改变了RequestSftp的来源如下,并取代了硬编码的子系统;

代码语言:javascript
复制
 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);   
} 

}

EN

回答 1

Stack Overflow用户

发布于 2013-07-31 12:52:43

请打开一个“改进”JIRA问题。目前,您必须对DefaultSftpSessionFactoryDefaultSftpSession进行子类(或克隆),在工厂中重写getSession()方法。不幸的是,会话中的connect()是包私有的,所以不能简单地覆盖它。

看起来你只需要改变这两行

代码语言:javascript
复制
SftpSession sftpSession = new SftpSession(jschSession);
sftpSession.connect();

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

其中subsystem将是MySftpSessionFactory上的一个属性,而connect(String subsystem)将类似于SftpSession上的connect()

但是,我注意到getSession()使用了其他一些私有方法(如initJschSession),因此只复制工厂并给它命名可能更容易。我不想这么说,但是现在它对子类不是很友好。请在JIRA问题中注意这一点(除了添加子系统之外,我们还应该使工厂更易于子类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17968777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档