之前搞了套遠程訪問ssh進行操作的代碼,最近有需求,需要通過一台跳轉機才能訪問目標服務。在網上搜了半天,也沒找到比較好的例子,就自己翻閱了下JSCH的API。但是看的雲裡霧裡的。聯想了下,端口轉發的原理是否是把目標節點ip:port映射到localhost:port,然後通過localhost:port發送消息就可以抵達目標節點呢?
帶著這個推論,改造了下之前的代碼。
原有代碼通過jsch連接目標節點服務器這裡就不多說了,自行百度,網上很多。
下面貼下改造之後的代碼:
/** * 獲取連接* @param ip 跳轉機host * @param userName 跳轉機用戶名* @param pwd 跳轉機密碼* @param port 跳轉機端口* @return ChannelSftp 返回值* @throws JSchException 連接異常*/ public static ChannelSftp connect(String ip, String userName, String pwd, int port) throws JSchException { if (port <= 0) { port = PORT; } Session sshSession = null; JSch jsch = new JSch(); sshSession = jsch.getSession(userName, ip, port); sshSession.setPassword(pwd); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); sshConfig.put("PreferredAuthentications", "password,keyboard-interactive"); sshSession.setConfig(sshConfig); sshSession.connect(TMOUT);//可設置超時時間//此處開始為端口映射到本地的部分sshSession.setPortForwardingL(本地端口, 目標節點地址, 22); //完成上訴映射之後,即可通過本地端口連接了Session session = jsch.getSession("目標服務用戶名", "127.0.0.1",本地端口); Properties remoteCfg = new Properties(); remoteCfg.put("StrictHostKeyChecking", "no"); remoteCfg.put("PreferredAuthentications", "password,keyboard-interactive"); session.setConfig(remoteCfg); session.setPassword("目標服務密碼"); session.connect(); //後續如何可自行改變,網上運用很多Channel channel = (Channel) session.openChannel("sftp");//創建sftp通信通道channel.connect(); ChannelSftp sftp = (ChannelSftp) channel; return sftp; }最後測試通過sftp訪問目標節點的目錄,成功。
以上這篇使用JSCH框架通過跳轉機訪問其他節點的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。