java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2

2023-11-09

通过Jsch连接
step 1引入jar包

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.53</version>
    </dependency>

step 2 代码
import java.io.InputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class Main {
public static void main(String[] args) throws Exception {
long currentTimeMillis = System.currentTimeMillis();

    String command = "uname -a";

    JSch jsch = new JSch();
    Session session = jsch.getSession("xfraud", "192.168.115.64", 22);
    session.setPassword("cfca1234");
    session.setConfig("StrictHostKeyChecking", "no");
    session.connect(60 * 1000);
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(command);

    channel.setInputStream(null);

    ((ChannelExec) channel).setErrStream(System.err);

    InputStream in = channel.getInputStream();

    channel.connect();

    byte[] tmp = new byte[1024];
    while (true) {
        while (in.available() > 0) {
            int i = in.read(tmp, 0, 1024);
            if (i < 0) break;
            System.out.print(new String(tmp, 0, i));
        }
        if (channel.isClosed()) {
            if (in.available() > 0) continue;
            System.out.println("exit-status: " + channel.getExitStatus());
            break;
        }
        try {
            Thread.sleep(1000);
        } catch (Exception ee) {
        }
    }
    channel.disconnect();
    session.disconnect();

    long currentTimeMillis1 = System.currentTimeMillis();
    System.out.println("Jsch方式"+(currentTimeMillis1-currentTimeMillis));
}

}

通过ganymed-ssh2连接
step 1 引入jar包

ch.ethz.ganymed
ganymed-ssh2
build210

step 2 代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

//import org.apache.commons.lang.StringUtils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class MainCommand {
private static String DEFAULTCHART = “UTF-8”;

private static Connection login(String ip, String username, String password) {
    boolean flag = false;
    Connection connection = null;
    try {
        connection = new Connection(ip);
        connection.connect();// 连接
        flag = connection.authenticateWithPassword(username, password);// 认证
        if (flag) {
            System.out.println("================登录成功==================");
            return connection;
        }
    } catch (IOException e) {
        System.out.println("=========登录失败=========" + e);
        connection.close();
    }
    return connection;
}

/**
 * 远程执行shll脚本或者命令
 * 
 * @param cmd
 *            即将执行的命令
 * @return 命令执行完后返回的结果值
 */
private static String execmd(Connection connection, String cmd) {
    String result = "";
    try{
        if (connection != null) {
            Session session = connection.openSession();// 打开一个会话
            session.execCommand(cmd);// 执行命令
            result = processStdout(session.getStdout(), DEFAULTCHART);
            System.out.println(result);
            // 如果为得到标准输出为空,说明脚本执行出错了
            /*if (StringUtils.isBlank(result)) {
                System.out.println("得到标准输出为空,链接conn:" + connection + ",执行的命令:" + cmd);
                result = processStdout(session.getStderr(), DEFAULTCHART);
            } else {
                System.out.println("执行命令成功,链接conn:" + connection + ",执行的命令:" + cmd);
            }*/
            connection.close();
            session.close();
        }
    } catch (IOException e) {
        System.out.println("执行命令失败,链接conn:" + connection + ",执行的命令:" + cmd + "  " + e);
        e.printStackTrace();
    }
    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");
            System.out.println(line);
        }
        br.close();
    } catch (UnsupportedEncodingException e) {
        System.out.println("解析脚本出错:" + e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("解析脚本出错:" + e.getMessage());
        e.printStackTrace();
    }
    return buffer.toString();
}

public static void main(String[] args) {
    long currentTimeMillis = System.currentTimeMillis();
    String ip = "192.168.115.64";
    String username = "xfraud";
    String password = "cfca1234";
    String cmd = "uname -a";        
    Connection connection = login(ip, username, password);
    String execmd = execmd(connection, cmd);
    System.out.println(execmd);
    long currentTimeMillis1 = System.currentTimeMillis();
    System.out.println("ganymed-ssh2方式"+(currentTimeMillis1-currentTimeMillis));
}

}

运行结果比较
在这里插入图片描述
在这里插入图片描述

可以看出采用ganymed-ssh2连接方式要快很多。

原文链接:https://blog.csdn.net/u011937566/article/details/81666347

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2 的相关文章

  • zip压缩,使用org.apache.tools.zip实现zip压缩和解压

    1 使用apache的ant解压 org apache tools zip 2 引入pom
  • Java 使用LocalDate获取上周时间、本月时间等

    获取当前时间 LocalDate currentDate LocalDate now 获取当前日期所在的星期几 DayOfWeek currentDayOfWeek currentDate getDayOfWeek 计算需要减去的天数 in
  • 使用@ConfigurationProperties映射配置项到实体类

    1 创建配置文件 七牛云相关 qiniu accessKey accessKey secretKey secretKey CDN加速域名前缀 cdnDomainPrefix cdnDomainPrefix 2 添加映射配置 项目添加相关依赖
  • Excel工具类

    目录 1导入导出 2测试 2 1导入测试 2 1 1JSON导入 2 1 2对象导入 2 2导出测试 2 2 1导出模版 2 2 2导出用户表 3依赖 4工具包 1导入导出 UserImport package com excel enti
  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 身份证省市区SQL代码

    转载自 https blog csdn net xiaofanku article details 18085865 身份证号码的意义 前1 2位数字表示 所在省份的代码 第3 4位数字表示 所在城市的代码 第5 6位数字表示 所在区县的代
  • 多服务环境下定时任务重复执行问题解决方案

    当一个服务部署在多台服务器上时 定时任务可能出现多次执行的情况 就是每个服务上执行一次 有以下两种思路 一是固定死只有某服务器执行定时任务 二是随机暂停几秒 某一服务执行了 其他就不再执行 1 固定某一个服务器作为执行定时任务的机器 通过配
  • 加密解密相关→EncryptUtils

    import android util Base64 import java io File import java io FileInputStream import java io IOException import java sec
  • vim编辑器格式化代码

    他丫儿的搞啥子嘛 乱七八糟的 在vim中其实也有像Eclipse中的ctrl shift F 的自动格式化代码的操作 尽管非常强大 但是通常会破坏代码的原有的缩进 所以不建议在python这样缩进代替括号的语言中和源程序已经缩进过的代码中使
  • java实现域名解析

    java实现域名解析 域名解析过程 浏览器检查是否有该域名缓存 检查本机host文件之内是否有该域名对应ip 检查本机DNS缓存 递归或迭代向DNS根域名服务器获取该域名ip地址 1 windows控制台 win r 输入cmd进入控制台
  • # 后端开发技巧、常用规范

    后端开发技巧 常用规范 文章目录 后端开发技巧 常用规范 开发技巧 equals 方法的使用 创建 HashMap 指定初始化大小 Optional ofNullable orElse 避免空指针 Stream 求和 List 切割工具 单
  • idea使用vim

    idea使用vim 安裝ideaVim插件 在idea中直接搜索插件 ideaVim 并安装 配置vim 在 home 目录下创建 ideavimrc文件 如在 windows 系统中 则在 C Users xxxx 下建 在 ideavi
  • 卸载centos自带jdk&安装指定版本jdk

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 删除jdk 1 查看java安装情况 2 查看 3 卸载 4 rpm总结 5 安装 1 查看java安装情况 java version 2 查看 rpm qa grep jd
  • RedisTemplate lettuce 实现分布式锁

    springboot2 x 以上使用redis时 默认使用了lettuce封装 比起jedis线程安全 import lombok extern slf4j Slf4j import org springframework data red
  • java字符串定长前面填充0

    Java中在数字前自动补零方法 public class TestTest public static void main String args 方法一 0 代表前面补充0 4 代表长度为4 d 代表参数为正数型 System out p
  • ubuntu 查看端口占用命令

    查看端口占用情况 netstat nultp
  • Java写入txt文件内容

    Java写入数据进txt文件 需求 多条数据追加进文件 且需要处理中文编码问题 以下代码只能处理向文件添加数据的功能 但是会覆盖掉之前的数据 import java io File import java io FileOutputStre
  • vscode c++ 的环境配置 (完美版)

    怎么下载MinGW64 https blog csdn net skh2015java article details 85075032 vscode c 的环境配置 https blog csdn net qq 43041976 arti
  • VS2019安装Qt插件教程,发现下载不了问题解决

    1 打开VS 最上方工具栏中点击扩展窗口 选择管理扩展 2 在右边搜索中搜索qt出现以下界面 这时可能出现问题 再点击下载发现迟迟下载不了 或者是下载到一定地步后无法下载 再或者是下载完成后安装无反应 解决办法 点击有点的详细信息或者进入如
  • Java 正则表达式工具类大全

    import java util regex Matcher import java util regex Pattern author nql Description 验证工具类 date now public class Validat

随机推荐

  • mediapipe face_mesh测试

    目录 onnx测试 tensorflow预测tflite代码 onnx测试 img path r D data val result 1212 test 1 2 02370 1 jpg img path r D data face 1212
  • Python的下载和安装教程

    今天学习python以及pycharm的下载和安装 参考了好几个博客 在此总结一下安装过程 注意 在这里说明一下 如果要用pycharm进行python的开发 是要分别下载pycharm和python的 不要只安装pycharm就结束了 一
  • 命令提示符的使用及运行Java程序

    常用的命令提示符 dir 列出当前目录下的文件以及文件夹 director md 创建目录 make director rd 删除目录 cd 进入指定目录 cd 退回到上一级目录 cd 退回到根目录 del 删除文件 del txt可以将所
  • c++11std::thread扩展

    最近 整理一下学习c 的文章 看到一篇文章 其中提到了thread local和std future 觉得这两东西很有趣 于是网上搜了一些资料 觉得很有帮助 希望可以对大家学习c 线程有所帮助 http www cnblogs com ha
  • 嵌入式设备文件系统构建——增加用户登录功能

    1 修改inittab文件 first run the system script file sysinit etc init d rcS 进入命令行 askfirst bin sh 添加执行登录验证 sysinit bin login c
  • 【毕设教程】随机森林算法

    文章目录 0 前言 1 什么是随机森林 2 随机森林构造流程 3 随机森林的优缺点 3 1 优点 3 2 缺点 3 3 随机森林算法实现 4 最后 0 前言 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 这两年
  • Firebug调试经验与技巧

    昨天网站出问题了1 为了调试cookie 特别找了关于firebug里面如何调试cookie的文章 觉得这篇不错 保留下来备份 Firebug调试经验与技巧 2009 03 13 15 22 16 转自 http blog sina com
  • redis,mysql,elasticsearch,hbase,hive对比区别,该如何选择

    几种数据库对比如下 redis mysql elasticsearch hbase hive 容量 容量扩展 低 中 大 海量 海量 查询时效性 极高 中等 较高 较高 低 查询灵活性 较差 非常好 较好 较差 非常好 写入速度 极快 中等
  • U3D通过按钮点击实现场景切换

    1 新建UI 选择button选项 新建button 2 file gt Build settings gt Add Open Scenes 把你当前场景添加进去 gt 把你想要切换的场景拖拽上去 3 新建一个空对象 挂载一个scenech
  • org.apache.http.ConnectionClosedException Premature end of Content-Length delimited message body

    最近生产环境报了这个系统异常 org apache http ConnectionClosedException Premature end of Content Length delimited message body expected
  • CANOE入门:DBC创建和编辑

    目录 dbc文件创建步骤 创建一个DBC数据库文件 创建网络节点Network nodes 创建Message 创建信号Signal 创建Signals用到的数值表Value Tables 将Value Tables关联到Signals 将
  • I/O error on GET request for "http://user-service/hi": user-service; nested exception is java.net.Un

    一 场景重现 最近闲暇时间打算系统学习下SpringCloud系统教程 毕竟最近微服务也挺火的 于是网上找了一个大牛的博客跟着一起学习 史上最简单的SpringCloud教程 一直跟着模仿构建SpringCloud一直也没出什么问题 直到在
  • Pgsql与Oracle语法差异(SQL迁移记录)

    oracle 数据库中没有limit关键字 LIMIT 1 替换为 rownum 1 select from table where rownum 1 输出1条 oracle 自增序列使用 sequence PGSQL 自增序列可用 ser
  • jquery笔记回顾

    jquery 1 jquery概念 js框架封装的原生的js代码 2 jquery版本区别及使用 jquery xxx js 有排版 体积大 jquery xxx min js 无排版 体积小 3 jquery与原生js对象进行互转 jqu
  • hk-bc.xyz forum.php,www.xavdz.com

    Domain Name XAVDZ COM Registry Domain ID 1838157110 DOMAIN COM VRSN Registrar WHOIS Server whois enom com Registrar URL
  • Kafka面试题

    Kafka核心总控制器Controller是什么 在Kafka集群中会有一个或者多个broker 其中有一个broker会被选举为控制器 Kafka Controller 它负责管理整个集群中所有分区和副本的状态 Controller选举机
  • 使用代理同步Chromium代码的心得

    先参看 http www chromium org developers how tos build instructions windows 非常坑爹 谷歌获取chromium源码的方式又变了 从chromium39 0 2313 2之后
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Meaning 一个 N N 的矩阵 A 初始时全部值为 0 有两种操作 1 C x1 y1 x2 y2
  • 电机驱动板发烫严重怎么办?一份大厂PCB布局指南参考

    作者 Pete Millett Technical Marketing Engineer Monolithic Power Systems 翻译 Toffee Jia 来源 MPS 电机驱动 IC 传递大量电流的同时也耗散了大量电能 通常
  • java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2

    通过Jsch连接 step 1引入jar包