Google sshxcute优化版+二次封装类

1.Google sshxcute优化版

源码下载: https://gitee.com/chengyuqiang/sshxcute

2.二次封装

package cn.hadron.util;

import java.util.HashMap;
import java.util.Map;
import net.neoremind.sshxcute.core.ConnBean;
import net.neoremind.sshxcute.core.IOptionName;
import net.neoremind.sshxcute.core.Result;
import net.neoremind.sshxcute.core.SSHExec;
import net.neoremind.sshxcute.exception.TaskExecFailException;
import net.neoremind.sshxcute.task.CustomTask;
import net.neoremind.sshxcute.task.impl.ExecCommand;
import net.neoremind.sshxcute.task.impl.ExecShellScript;

/**
 * sshxcute.jar二次封装类
 *  在执行命令时,命令前面已经是他的完全路径,多条命令用分号隔开
 *  参考文献 https://my.oschina.net/u/1866821/blog/479409
 * @author chengyuqiang
 *
 */
public final class SSHUtil {
    private SSHExec sshx = null;
    private ConnBean cb = null;

    public SSHUtil(String ip, String username, String password) {
        // 如果遇到失败,仍然想继续执行剩下的任务
        SSHExec.setOption(IOptionName.HALT_ON_FAILURE, true);
        // 修改错误日志输入目录
        SSHExec.setOption(IOptionName.ERROR_MSG_BUFFER_TEMP_FILE_PATH, "/var/log/sshxcute_err.msg");
        this.cb = new ConnBean(ip, username, password);
    }

    /**
     * 连接SSH,私有方法
     * @return
     */
    private boolean connect() {
        if (null == cb) {
            return false;
        }
        sshx = SSHExec.getInstance(cb);
        return sshx.connect();
    }

    /**
     * 执行命令
     * @param command
     * @return
     */
    public Result exec(String... cmd) {
        this.connect();
        // 执行的命令行任务
        CustomTask sampleTask = new ExecCommand(cmd);
        // 执行,并对执行后的结果进行处理
        try {
            return sshx.exec(sampleTask);
        } catch (TaskExecFailException e) {
            e.printStackTrace();
            return null;
        } finally {
            sshx.disconnect();
        }
    }

    /**
     * shellPath 代表脚本执行路径
     * @param shellPath
     * @return
     */
    public Result exeScript(String shellPath) {
        this.connect();
        CustomTask task = new ExecShellScript(shellPath);
        try {
            return sshx.exec(task);
        } catch (TaskExecFailException e) {
            e.printStackTrace();
            return null;
        } finally {
            sshx.disconnect();
        }
    }

    /**
     * 带参执行脚本
     * @param shellPath
     * @param args
     * @return
     */
    public Result exeScript(String shellPath, String args) {
        this.connect();
        CustomTask task = new ExecShellScript(shellPath, args);
        try {
            return sshx.exec(task);
        } catch (TaskExecFailException e) {
            e.printStackTrace();
            return null;
        } finally {
            sshx.disconnect();
        }
    }

    /**
     * 上传文件
     * @param localFile
     * @param remotePath
     */
    public boolean putFile(String localFile, String remotePath) {
        this.connect();
        try {
            sshx.uploadSingleDataToServer(localFile, remotePath);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            sshx.disconnect();
        }
    }

    /**
     * 上传目录
     * @param localPath
     * @param remotePath
     */
    public boolean putDir(String localPath, String remotePath) {
        this.connect();
        try {
            sshx.uploadAllDataToServer(localPath, remotePath);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            sshx.disconnect();
        }
    }

    /**
     * 解析结果
     * @param result
     * @return
     */
    public Map<String, String> parseResult(Result result) {
        if(null==result){
            System.out.println("Result空值!");
            return null;
        }
        Map<String, String> map = new HashMap<>();
        // Check result and print out messages.
        if (result.isSuccess) {
            map.put("isSuccess", "true");
            map.put("returnCode", result.rc + "");
            map.put("sysout", result.sysout);
        } else {
            map.put("isSuccess", "false");
            map.put("returnCode", result.rc + "");
            map.put("sysout", result.error_msg);
        }
        return map;
    }
    /**
     * 解析结果
     * @param result
     * @return
     */
    public String getString(Result result) {
        if(null==result){
            System.out.println("Result空值!");
            return null;
        }
        if (result.isSuccess) {
            return result.sysout;
        } else {
            return result.error_msg;
        }
    }

    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        SSHUtil ssh = new SSHUtil("192.168.2.91", "root", "123456");
        Result result=ssh.exec("date");
        Map<String, String> map=ssh.parseResult(result);
        for(String key:map.keySet()){
            System.out.println(key+":"+map.get(key));
        }
        System.out.println("-------------------------------------");
        result=ssh.exec("ls -l", "uname");
        map=ssh.parseResult(result);
        for(String key:map.keySet()){
            System.out.println(key+":"+map.get(key));
        }
        System.out.println("-------------------------------------");
        boolean success=ssh.putFile("/root/sshxcuteTest.sh", "/root/sshxcuteTest.sh");
        if(success){
            System.out.println("上传成功!");
        }else{
            System.out.println("上传失败!");
        }
        System.out.println("###-------------------------------------");
        //参数放到同一个字符串中,通过空格分割
        result=ssh.exeScript("/root/sshxcuteTest.sh", "hello world");
        System.out.println(ssh.getString(result));

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

聊一聊生产环境中如何动态监听配置文件变化并重载

上一篇,我们谈到Java中的几种读取properties配置文件的方式,但是在生产环境中,最忌讳的就是重启应用了。比如某个系统的路径常量或者接口变更,需要线上及...

32411
来自专栏zhisheng

渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

上篇文章写了 ElasticSearch 源码解析 —— 环境搭建 ,其中里面说了启动 打开 server 模块下的 Elasticsearch 类:org.e...

721
来自专栏Android-薛之涛

Android-Fragment

我们在创建Fragment的管理器的时候,会选择导入那个包下的FragmentManager.有app包下和v4包下的,这里我推荐用v4包的FragmentMa...

793
来自专栏10km的专栏

java nio:Files.isSameFile判断两个路径(Path)是否相等

不论在windows还是linux下,仅凭字符串比较判断两个文件路径是否相等是不靠谱的。因为有link,Disk map等技术的存在,两个不同的路径有可能指向同...

1956
来自专栏后端之路

SpringBoot之神奇的properties和覆盖顺序

背景 前面我们描述了spring profile和maven profile的异同maven profile VS spring profile 通常意义上我们...

7998
来自专栏技术碎碎念

jdbc基础 (二) 通过properties配置文件连接数据库

上一篇描述了对mysql数据库的简单操作,下面来看一下开发中应该如何灵活应用。 因为jdbc对数据库的驱动加载、连接获取、释放资源的代码都是相同的,为了提高代码...

2578
来自专栏Android知识点总结

Java总结IO篇之File类和Properties类

打开颜色选择器 :读流I-->字符串分割-->字符串存入Map-->使用Map对象还原用户配置 修改配置时 :写流O-->创建Map对象-->字符...

532
来自专栏流媒体

App进程启动流程

在上一节Activity的启动流程中,当app进程不存在(第一次启动)时,会先去创建进程。这里我们通过源码来解读app进程的启动流程。

974
来自专栏ml

将文件字节输出流写入到文本中

1 package DEMO; 2 3 import java.io.File; 4 import java.io.FileOutputStream;...

3626
来自专栏技术碎碎念

jdbc基础 (四) 批处理

批处理,就是字面上的意思,一次性处理一批sql语句。 直接看例子吧: 1 package com.cream.ice.jdbc; 2 3 imp...

26910

扫码关注云+社区