之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务。在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API。但是看的云里雾里的。联想了下,端口转发的原理是否是把目标节点ip:端口映射到localhost:港口,然后通过localhost:港口发送消息就可以抵达目标节点呢?
带着这个推论,改造了下之前的代码。
原有代码通过jsch连接目标节点服务器这里就不多说了,自行百度,网上很多。
/* * *获取连接 * @param ip跳转机主机 * @param用户名跳转机用户名 * @param pwd跳转机密码 * @param端口跳转机端口 * @return ChannelSftp返回值 * @throws JSchException连接异常 */公共静态ChannelSftp连接(ip的字符串,字符串的用户名,字符串pwd, int端口)抛出JSchException { 如果(端口& lt;=0) { 端口=端口; } 会话sshSession=零; JSch JSch=new JSch (); sshSession=jsch。getSession(用户名、ip、端口); sshSession.setPassword (pwd); sshConfig=new属性(); sshConfig。把(“StrictHostKeyChecking”、“不”); sshConfig.put (“PreferredAuthentications”, “密码,keyboard-interactive”); sshSession.setConfig (sshConfig); sshSession.connect (TMOUT);//可设置超时时间//此处开始为端口映射到本地的部分 sshSession。setPortForwardingL(本地端口,目标节点地址,22);//完成上诉映射之后,即可通过本地端口连接了 会话=jsch会话。getSession(“目标服务用户名”、“127.0.0.1”,本地端口); remoteCfg=new属性(); remoteCfg。把(“StrictHostKeyChecking”、“不”); remoteCfg.put (“PreferredAuthentications”, “密码,keyboard-interactive”); session.setConfig (remoteCfg); session.setPassword(“目标服务密码”); session.connect ();//后续如何可自行改变,网上运用很多 频道频道=(频道)session.openChannel (sftp);//创建sftp通信通道 channel.connect (); ChannelSftp sftp=(ChannelSftp)通道; 返回sftp; }
最后测试通过sftp访问目标节点的目录,成功。
以上这篇使用JSCH框架通过跳转机访问其他节点的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。