之前搞了套远程访问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 }
最后测试通过sftp访问目标节点的目录,成功