可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am using JSch for retrieving a file from a remote machine by SFTP. Here is the code
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(); } } }
Now, I have two questions:
sftpChannel.get("remote-data.txt");
throws an exception:
no such file
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2297)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:1750)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1020)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:995)
at TestSFTPinJava.main(TestSFTPinJava.java:29)
I am not sure how to specify the location in my local system where the file will be saved. sftpChannel.put("C:\\Users\\mona\\Documents\\localCopy.txt");
does not look right to me.
Please help with suggestions, Thanks!
回答1:
Concerning your point 1, I suspect that the default directory after connecting is not what you expect. Try using an absolute remote path. Does sftpChannel.pwd()
return the directory the file remote-data.txt
is in on the remote machine ?
Concerning your point 2, looking at http://grepcode.com/file/repo1.maven.org/maven2/com.jcraft/jsch/0.1.42/com/jcraft/jsch/ChannelSftp.java#290 one sees that there is the following method in ChannelSftp
:
public void put(String src, String dst)
which indeed has a source and destination file name argument.
I guess you had already a look the Jsch sftp example at http://www.jcraft.com/jsch/examples/Sftp.java ?
回答2:
Simple example of app. I get file from remote server (from /tmp/qtmp) and save it in local machine in the current path
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(); } }
回答3:
i had a similar issue, i was trying to get some files from a server where everything was fine, but i was getting always this error:
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) ...
I was listing properly all the elements of the directory by using
java.util.Vector v1 = sftpChannel.ls(dir);
I think that was that confused me, that i was able to read the content of the directory by using the ls command, when you want to get / put files make sure you move first by using "cd".
The solution was to use the next command to move to the directory that contains my files using a simple cd command:
sftpChannel.cd(dir);
Hope this helps, i took my sometime to figure it out. jojo.
Lessons learned:
1.- ls can read any directory no matter if you are not inside of it. 2.- To get and put files always make sure you are in the directory that contains the files by using cd.