使用JSCH框架通过跳转机访问其他节点

时间:2024-01-23 18:50:08

  之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务。在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API。但是看的云里雾里的。联想了下,端口转发的原理是否是把目标节点ip:port映射到localhost:port,然后通过localhost:port发送消息就可以抵达目标节点呢?

  带着这个推论,改造了下之前的代码。

原有代码通过jsch连接目标节点服务器这里就不多说了,自行百度,网上很多。

下面贴下改造之后的代码:

 1 /**
 2      * 获取连接
 3      * @param ip 跳转机host
 4      * @param userName 跳转机用户名
 5      * @param pwd 跳转机密码
 6      * @param port 跳转机端口
 7      * @return ChannelSftp 返回值
 8      * @throws JSchException 连接异常
 9      */
10     public static ChannelSftp connect(String ip, String userName, String pwd, int port) throws JSchException
11     {
12         if (port <= 0)
13         {
14             port = PORT;
15         }
16         Session sshSession = null;
17         JSch jsch = new JSch();
18         sshSession = jsch.getSession(userName, ip, port);
19         
20         sshSession.setPassword(pwd);
21         Properties sshConfig = new Properties();
22         sshConfig.put("StrictHostKeyChecking", "no");
23         sshConfig.put("PreferredAuthentications",
24                 "password,keyboard-interactive");
25         sshSession.setConfig(sshConfig);
26        
27         
28         sshSession.connect(TMOUT);//可设置超时时间  
29         //此处开始为端口映射到本地的部分
30         sshSession.setPortForwardingL(本地端口, 目标节点地址, 22);
31         //完成上诉映射之后,即可通过本地端口连接了
32         Session session = jsch.getSession("目标服务用户名", "127.0.0.1",本地端口);
33         Properties remoteCfg = new Properties();
34         remoteCfg.put("StrictHostKeyChecking", "no");
35         remoteCfg.put("PreferredAuthentications",
36                 "password,keyboard-interactive");
37         session.setConfig(remoteCfg);
38         session.setPassword("目标服务密码");
39         session.connect();
40         //后续如何可自行改变,网上运用很多
41         Channel channel = (Channel) session.openChannel("sftp");//创建sftp通信通道  
42         channel.connect();
43         ChannelSftp sftp = (ChannelSftp) channel;
44         
45         return sftp;
46     }
View Code

最后测试通过sftp访问目标节点的目录,成功