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 条评论
登录 后参与评论

相关文章

来自专栏coding

python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默

Python 使用被称为 异常 的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异...

1152
来自专栏JackeyGao的博客

Django 进阶学习 - 文本框过滤

默认情况下django可以对列进行过滤, 但大多数是对Relationship列通过list_filter 直接指定field name就可以方便的进行过滤了,...

571
来自专栏逆向技术

异常处理第二讲,结构化异常(微软未公开)

            异常处理第二讲,结构化异常(微软未公开) 讲解之前,请熟悉WinDbg的使用,工具使用的博客链接 一丶认识段寄存器FS的内容,以及作用 ...

1877
来自专栏Golang语言社区

Golang语言 与 C 语言 的比较学习

对于MarkDown 编译器没有自动保存功能这件事情, 我表示严重的厌恶。 一个来小时的整理化为乌有,而且居然还不能导入到HTML编辑器, 真是无法忍受! 关键...

3197
来自专栏SpringBoot

第二节,Springboot自定义配置文件

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

863
来自专栏FreeBuf

IE 11浏览器0day漏洞(CVE-2015-2425)UAF分析

前言 CVE-2015-2425是Hacking team泄露出来的一个IE11的0day漏洞,影响了IE11及之前的版本。在一封Hacking Team高层收...

2287
来自专栏大内老A

WCF的三个名称/命名空间,你是否傻傻分不清楚?

在定义和寄宿WCF服务的时候会面临三个名称/命名空间,它们分别是ServiceContractAttribute、ServiceBehaviorAttribut...

1859
来自专栏开源优测

AutoLine源码分析之数据库模型

AutoLine开源平台是一个开源自动化测试解决方案,基于RobotFramework进行二次开发,支持RobotFramework几乎所有的库。

711
来自专栏java学习

1.3java的运行原理

java的运行原理 这里我们简单分析一下我们的第一个应用程序,其中涉及到很多没有接触过的概念,大家可先阅读以下,以后会详细讲解。重点是理解java的运行原理。 ...

2924
来自专栏你不就像风一样

用Java执行Python:Jython踩坑笔记

1.通过Jython.jar提供的类库实现 2.通过Runtime.getRuntime()开启进程来执行脚本文件

2494

扫码关注云+社区