java跳板执行ssh命令方式
作者:princeAladdin
本文分享了在Java中使用跳板机执行SSH命令的方法,并推荐了一些Maven依赖,希望这些信息对大家有所帮助
java跳板执行ssh命令
maven依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.6</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.5.6</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.lang.invoke.MethodHandles; public class SSHJumpServerUtil { private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); public static String executeCommandWithJumpServer(String jumpHost, String jumpUser, String jumpPassword, int jumpPort, String targetHost, String targetUser, String targetPassword, int targetPort, String command) { String excuteResult = null; try { JSch jsch = new JSch(); // 创建跳板会话 Session jumpSession = jsch.getSession(jumpUser, jumpHost, jumpPort); jumpSession.setPassword(jumpPassword); jumpSession.setConfig("StrictHostKeyChecking", "no"); jumpSession.connect(); // 创建跳板通道 int forwardedPort = 10022; // 本地转发端口 jumpSession.setPortForwardingL(forwardedPort, targetHost, targetPort); // 创建目标服务器会话 Session targetSession = jsch.getSession(targetUser, "localhost", forwardedPort); targetSession.setPassword(targetPassword); targetSession.setConfig("StrictHostKeyChecking", "no"); targetSession.connect(); // 执行命令 ChannelExec channelExec = (ChannelExec) targetSession.openChannel("exec"); channelExec.setCommand(command); InputStream in = channelExec.getInputStream(); channelExec.connect(); // 读取命令输出 byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; excuteResult = new String(tmp, 0, i); } if (channelExec.isClosed()) { if (in.available() > 0) continue; LOGGER.debug("exit-status: " + channelExec.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { ee.printStackTrace(); } } // 关闭通道和会话 channelExec.disconnect(); targetSession.disconnect(); jumpSession.disconnect(); } catch (JSchException | IOException e) { LOGGER.error("跳板连接服务器执行异常",e); } return excuteResult; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。