使用JSCH架構通過跳轉機訪問其他節點,jsch跳轉
之前搞了套遠端存取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 JSchException11 {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訪問目標節點的目錄,成功