如何使用Java实现ssh命令登录主机执行shell命令
创始人
2024-12-24 15:21:48
0次

1、SSH命令

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

实际工作中,我们经常使用客户端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主机上,执行一些操作命令。

如何使用Java语言实现SSH 连接主机,并执行Shell命令呢?

2、Java 实现 SSH命令

1)代码实现如下:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.util.Calendar;import org.apache.commons.lang3.StringUtils;import ch.ethz.ssh3.Connection;import ch.ethz.ssh3.Session;import ch.ethz.ssh3.StreamGobbler;public class SshUtil { private static String DEFAULT_CHAR_SET = "UTF-8"; private static String tipStr = "=======================%s======================="; private static String splitStr = "=====================================================";  /**  * 登录主机  * @return  *  登录成功返回true,否则返回false  */ public static Connection login(String ip, String userName, String password){  boolean isAuthenticated = false;  Connection conn = null;  long startTime = Calendar.getInstance().getTimeInMillis();  try {   conn = new Connection(ip);   conn.connect(); // 连接主机   isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证   if(isAuthenticated){    System.out.println(String.format(tipStr, "认证成功"));   } else {    System.out.println(String.format(tipStr, "认证失败"));   }  } catch (IOException e) {   System.err.println(String.format(tipStr, "登录失败"));   e.printStackTrace();  }  long endTime = Calendar.getInstance().getTimeInMillis();  System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);  return conn; }  /**  * 远程执行shell脚本或者命令  * @param cmd  *  即将执行的命令  * @return  *  命令执行完后返回的结果值  */ public static String execute(Connection conn, String cmd){  String result = "";  Session session = null;  try {   if(conn != null){    session = conn.openSession(); // 打开一个会话    session.execCommand(cmd);  // 执行命令    result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);    //如果为得到标准输出为空,说明脚本执行出错了    if(StringUtils.isBlank(result)){     System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd);     result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);    }else{     System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd);    }   }  } catch (IOException e) {   System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage());   e.printStackTrace();  } finally {   if (conn != null) {    conn.close();   }   if (session != null) {    session.close();   }  }  return result; } /**  * 解析脚本执行返回的结果集  * @param in 输入流对象  * @param charset 编码  * @return  *  以纯文本的格式返回  */ private static String processStdout(InputStream in, String charset){  InputStream stdout = new StreamGobbler(in);  StringBuffer buffer = new StringBuffer();  try {   BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));   String line = null;   while((line = br.readLine()) != null){    buffer.append(line + "\n");   }  } catch (UnsupportedEncodingException e) {   System.err.println("解析脚本出错:" + e.getMessage());   e.printStackTrace();  } catch (IOException e) {   System.err.println("解析脚本出错:" + e.getMessage());   e.printStackTrace();  }  return buffer.toString(); } public static void main(String[] args){  String ip = "192.168.123.234"; // 此处根据实际情况,换成自己需要访问的主机IP  String userName = "root";  String password = "password";  Connection conn = SshUtil.login(ip, userName, password);  String cmd = "cd /home/miracle&&pwd&&ls&&cat luna.txt";  String result = SshUtil.execute(conn, cmd);  System.out.println(splitStr + "\n执行的结果如下: \n" + result + splitStr); }}

2)运行结果如下:

=======================认证成功=======================登录用时: 0.859s=====================================================【执行命令成功】执行的命令如下:cd /home/miracle&&pwd&&ls&&cat luna.txt=====================================================执行的结果如下: /home/miracleluna.txtHello, I'm SshUtil.Nice to meet you.^_^=====================================================

3)pom.xml 引用添加如下:

    org.apache.commons   commons-lang3   3.9         ch.ethz.ganymed   ganymed-ssh3   262  

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...