Ich versuche mit der JCRAFT-Version 0.1.52 eine Verbindung zum SFTP-Standort über SSH Jump-Host-Proxy herzustellen. Aber die " -Verbindung wird durch Ausnahme von Fremdhost " in meinem Code geschlossen. Ich habe eine gute Zeit damit verbracht, sich Dokumentation zu befassen, aber nicht herauszufinden, was das Problem < /p>
ist2016-11-18 14:53:14,091 44977 [main] ERROR c.w.v.r.ftp.JschSftpConnect -
- com.jcraft.jsch.JSchException: connection is closed by foreign host
at com.jcraft.jsch.Session.connect(Session.java:269)
at com.jcraft.jsch.Session.connect(Session.java:183)
at com.x.y.ftp.JschSftpConnect.connect(JschSftpConnect.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
< /code>
Es gibt kein Problem mit privaten Schlüssel, da ich über den Befehl UNIX mit dem SFTP -Server eine Verbindung herstellen kann. < /p>
sftp -o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
-i /path/to/host/private-key-file
-o 'ProxyCommand=ssh
-o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
-i /path/to/jumphost/private-key-file
-l jumphostuser jump.host.com nc sftp.host.com 22'
< /code>
Hier ist der Code, den ich ausführe < /li>
< /ol>
Der Code: < /p>
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
import org.apache.commons.lang3.exception.ExceptionUtils;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Proxy;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SocketFactory;
public class JschSftpConnect {
public static void main(String args[]) {
String sftpHostKeyFilePath = "/path/to/host/private-key-file";
String sftpHost="sftp.host.com";
String sftpUser="user";
String proxyHostName="jump.host.com";
String proxyKeyPath ="/path/to/jumphost/private-key-file";
String proxyUserName="jumphostuser";
log.debug("Executing JSCH code.....");
try {
JSch jsch = new JSch();
Path path = FileSystems.getDefault().getPath(sftpHostKeyFilePath);
byte[] filearray = Files.readAllBytes(path);
jsch.addIdentity("ID", filearray, null, null);
Session session = jsch.getSession(sftpUser, sftpHost, 22);
Properties props = new Properties();
props.put("StrictHostKeyChecking", "no");
session.setConfig(props);
String command = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "
+ localKeyFileDirectoryName + proxyKey + " -l " + proxyUserName + " " + proxyHostName
+ " nc %h %p";
session.setProxy(new JumpHostProxyCommand(command));
log.debug("Connecting session .......................");
session.connect();
log.debug("Session openend .......................");
Channel ch = session.openChannel("sftp");
ch.connect();
log.debug("SFTP channel connected .......................");
ChannelSftp channelSftp = (ChannelSftp) ch;
channelSftp.cd("/");
log.debug("Working directory is / .......................");
byte[] buffer = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(channelSftp.get("/some_file_.psv"));
File newFile = new File("some_file_.psv");
OutputStream os = new FileOutputStream(newFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
int readCount;
// System.out.println("Getting: " + theLine);
while ((readCount = bis.read(buffer)) > 0) {
// System.out.println("Writing: ");
bos.write(buffer, 0, readCount);
}
log.debug("File should have been written / .......................");
while (session != null) {
System.out.println("Killing the session");
session.disconnect();
bis.close();
bos.close();
System.exit(0);
}
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
}
}
}
class JumpHostProxyCommand implements Proxy {
String command;
Process p = null;
InputStream in = null;
OutputStream out = null;
public JumpHostProxyCommand(String command) {
this.command = command;
}
public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws Exception {
String cmd = command.replace("%h", host);
cmd = cmd.replace("%p", new Integer(port).toString());
p = Runtime.getRuntime().exec(cmd);
log.debug("Process returned by proxy command {} , {}", command, p);
in = p.getInputStream();
log.debug("Input stream returned by proxy {}", in);
out = p.getOutputStream();
log.debug("Output stream returned by proxy {}", out);
}
public Socket getSocket() {
return null;
}
public InputStream getInputStream() {
return in;
}
public OutputStream getOutputStream() {
return out;
}
public void close() {
try {
if (p != null) {
p.getErrorStream().close();
p.getOutputStream().close();
p.getInputStream().close();
p.destroy();
p = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
< /code>
Ich würde es wirklich zu schätzen wissen, ob jemand helfen könnte. Danke!
Mit JCRAFT JSCH nicht in der Lage, eine Verbindung zu SFTP herzustellen ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post