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

Posted

技术标签:

【中文标题】使用 Java 通过 SSH 隧道传输文件【英文标题】:Transfer file trough SSH tunnel with Java 【发布时间】:2012-03-05 12:53:31 【问题描述】:

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

我将在其中运行我的应用程序的客户端计算机(运行 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);

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

【问题讨论】:

【参考方案1】:

这与 your other question 的答案相同(您使用的是 shell 连接而不是文件传输):

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

如果它与 HTTP 一起工作,我想防火墙服务器也有一个 HTTP 代理正在运行,它将端口 80 上的请求转发到您的目标端口......当然,如果它也应该对 SSH 执行此操作本身就是一个 SSH 服务器。

如果您想从 JSch 进行两个连接,而不是进行本地端口转发然后连接到此转发端口,您可以使用我的 ProxySSH 类来查找 in the JSch wiki。

【讨论】:

这很不幸——看起来 SourceForge 摆脱了他们的 MediaWiki 功能(至少对于这个项目来说)。我会看看我是否在某个地方存储了这个类的某个版本。【参考方案2】:

使用local port forwarding,又名SSH tunnel,通过防火墙打开与服务器的 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");

【讨论】:

以上是关于使用 Java 通过 SSH 隧道传输文件的主要内容,如果未能解决你的问题,请参考以下文章

shell通过堡垒机传输文件到目标机器

Java中的简单SSH隧道[关闭]

连接开启传输加密(TLS)的AWS Redis

SSH 端口转发

通过 SSH 传输文件 [关闭]

SSH简介与用途