1

で特定の 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-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);   
} 

}

4

1 に答える 1

0

「改善」JIRA 課題を開いてください。現在、ファクトリのメソッドをオーバーライドして、 DefaultSftpSessionFactoryandをサブクラス化 (またはクローン) する必要があります。残念ながら、セッション内はパッケージ プライベートであるため、単純にオーバーライドすることはできません。DefaultSftpSessiongetSession()connect()

これらの2行を変更するだけでよいようです

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

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

どこsubsystemにプロパティがMySftpSessionFactoryあり、SftpSessionconnect(String subsystem)に似ています。connect()

getSession()ただし、は他のプライベート メソッド ( など)を使用していることに気付いたinitJschSessionので、ファクトリをコピーして新しい名前を付ける方が簡単かもしれません。私はそれを提案したくありませんが、現時点ではサブクラス化にはあまり適していません。JIRA の問題にメモしておいてください (サブシステムを追加するだけでなく、ファクトリをサブクラス化しやすくする必要があります。

于 2013-07-31T12:52:43.007 に答える