使用Java通过SSH隧道传输文件

使用Java通过SSH隧道传输文件,java,ssh,jsch,ssh-tunnel,proxytunnel,Java,Ssh,Jsch,Ssh Tunnel,Proxytunnel,我需要使用SSH/SFTPconnection从远程计算机获取一些文件,但问题如下: 运行应用程序的客户端计算机(运行Windows)连接到一个网络,在该网络中,我可以看到远程服务器(第二台计算机,运行Unix,在同一网络中)。我可以使用它进行SSH连接,但是包含文件(运行Unix)的计算机不在该网络中,我只能通过第二台计算机中打开的动态隧道SSH与该计算机连接,在那里我通常使用PuTTY配置此连接,然后我可以访问远程文件 下图表示架构(防火墙就像第二台机器) 我需要自动完成这项工作,所以我用

我需要使用SSH/SFTPconnection从远程计算机获取一些文件,但问题如下:

运行应用程序的客户端计算机(运行Windows)连接到一个网络,在该网络中,我可以看到远程服务器(第二台计算机,运行Unix,在同一网络中)。我可以使用它进行SSH连接,但是包含文件(运行Unix)的计算机不在该网络中,我只能通过第二台计算机中打开的动态隧道SSH与该计算机连接,在那里我通常使用PuTTY配置此连接,然后我可以访问远程文件

下图表示架构(防火墙就像第二台机器)

我需要自动完成这项工作,所以我用Java和JSch库做了一些测试,下面是一些代码:

/* Direccion y puerto del host local */
String host = "localhost";
int lport = 5040;

/* Direccion y puerto del host remoto*/
String rhost = "localhost";
int rport = 80;

/* Usuario y password para conectarse al servidor ssh*/
String user = "test";
String pwd = "test";

JSch jsch=new JSch();

Session session=jsch.getSession(user, host, 22);
session.setPassword("test");

Properties config = new Properties();
config.put("StrictHostKeyChecking","no");
session.setConfig(config);
session.connect();

int assinged_port=session.setPortForwardingL(lport, rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);

我得到了连接,但是当我使用object
session运行命令时,答案是来自第二台机器,而不是我预期的第三台机器,我想知道,是否有另一个库可以帮助实现这一点,或者我使用了错误的JSch。

答案与(使用shell连接而不是文件传输时):

将正确的主机名设置为
rhost
,即从防火墙服务器看到的目标服务器的名称

如果它与HTTP一起工作,我假设防火墙服务器也有一个HTTP代理在运行,它将端口80上的请求转发到您的目标端口……当然,如果SSH本身也是SSH服务器,它就不能这样做

如果您想从JSch进行两个连接,而不是先进行本地端口转发,然后再连接到此转发端口,您可以使用my
ProxySh
类来查找。

使用,也称为an,通过防火墙打开到服务器的SSH/SFTP连接。然后您可以从本地计算机直接将文件下载到服务器:

Session firewallSession = jsch.getSession("firewall_username", "firewall", 22);
// ...
firewallSession.connect();

int forwardedPort = 2222; // any port number which is not in use on the local machine
firewallSession.setPortForwardingL(forwardedPort, "server", 22);

Session session = jsch.getSession("server_usernam", "localhost", forwardedPort);
// ...
session.connect();

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

channelSftp.get("/remote/path/on/server/file.txt", "C:\\local\\path\\file.txt");

这是不幸的——看起来SourceForge放弃了MediaWiki功能(至少在这个项目中是这样)。我将看看是否在某个地方存储了这个类的某个版本。