9

SFTP でリモート マシンからファイルを取得するために JSch を使用しています。ここにコードがあります

public class TestSFTPinJava {

 public static void main(String args[]) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "sftp.abc.com", 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword("password");
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftpChannel = (ChannelSftp) channel;
            System.out.println("Directory:" + sftpChannel.pwd());
            sftpChannel.cd("remoteDirectory/");
            System.out.println("Directory after cd:" + sftpChannel.pwd());
            sftpChannel.get("remote-data.txt");

            sftpChannel.put("C:\\Users\\mona\\Documents\\local-copy.txt");
            sftpChannel.exit();
            session.disconnect();
        } catch (JSchException e) {
            e.printStackTrace();  
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }
}

ここで、2 つの質問があります。

  • sftpChannel.get("remote-data.txt");例外をスローします:


    com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2297)
    にそのようなファイルはありません
    。 java:1020)
    com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:995)
    で TestSFTPinJava.main(TestSFTPinJava.java:29) で

  • ファイルを保存するローカル システムの場所を指定する方法がわかりません。 sftpChannel.put("C:\\Users\\mona\\Documents\\localCopy.txt");私には正しく見えません。

提案を手伝ってください、ありがとう!

4

3 に答える 3

6

あなたのポイント1に関しては、接続後のデフォルトのディレクトリがあなたが期待するものではないのではないかと思います. 絶対リモート パスを使用してみてください。sftpChannel.pwd()ファイルremote-data.txtがリモート マシンにあるディレクトリを返しますか?

あなたのポイント2に関して、 http: //grepcode.com/file/repo1.maven.org/maven2/com.jcraft/jsch/0.1.42/com/jcraft/jsch/ChannelSftp.java#290を見ると、そこにあることがわかりますの次のメソッドですChannelSftp

 public void put(String src, String dst)

実際には、ソースと宛先のファイル名の引数があります。

http://www.jcraft.com/jsch/examples/Sftp.javaにある Jsch sftp の例を既にご覧になっていると思います。

于 2011-08-24T19:26:40.503 に答える
2

アプリの簡単な例。リモートサーバーから (/tmp/qtmp から) ファイルを取得し、ローカルマシンの現在のパスに保存します

package connector;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class Fetcher {

    public void fetchFile(String username, String host, String passwd) throws JSchException, SftpException, IOException {
        JSch conn = new JSch();
        Session session = null;
        session = conn.getSession(username, host, 22);
        session.setPassword(passwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
        channel.connect();

        //change folder on the remote server
        channel.cd("/tmp/qtmp");

        InputStream in = channel.get("testScp");
        // set local file
        String lf = "OBJECT_FILE";
        FileOutputStream tergetFile = new FileOutputStream(lf);

        // read containts of remote file to local
        int c;
        while ( (c= in.read()) != -1 ) {
            tergetFile.write(c);
        } 

        in.close();
        tergetFile.close();

        channel.disconnect();
        session.disconnect();   

    }

}
于 2014-09-29T11:12:41.797 に答える
0

同様の問題がありました。すべてが正常なサーバーからいくつかのファイルを取得しようとしていましたが、常にこのエラーが発生していました:

sftpChannel.get("fil1.txt","file1.txt")

error message: 

2: No such file
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2198)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2215)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:913)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:873)
...

を使用して、ディレクトリのすべての要素を適切にリストしていました

java.util.Vector v1 = sftpChannel.ls(dir);

lsコマンドを使用してディレクトリの内容を読み取ることができたのは、私を混乱させたと思います。ファイルを取得/配置する場合は、最初に「cd」を使用して移動してください。

解決策は、次のコマンドを使用して、単純な cd コマンドを使用してファイルを含むディレクトリに移動することでした。

sftpChannel.cd(dir);

これが役に立てば幸いです、私はそれを理解するためにいつかかかりました。ジョジョ。

学んだ教訓:

1.- ls は、その中にいなくても、任意のディレクトリを読み取ることができます。2.-ファイルを取得して配置するには、cdを使用して、ファイルを含むディレクトリにいることを常に確認してください。

于 2016-05-11T20:48:37.723 に答える