使用Jsch执行命令,并读取终端输出

jsch
http://www.jcraft.com/jsch/

Jsch是java实现的一个SSH客户端。开发JSCH的公司是 jcraft:

JCraft成立于1998年3月,是一家致力于Java应用程序和Internet / Intranet服务的应用程序开发公司。

引入依赖:

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

代码样例:

import com.jcraft.jsch.*;
import com.linkmecha.tenant.common.model.DataBase;
import com.linkmecha.tenant.common.model.SSHResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.InputStream;

/**
 * @Author: jinxk
 * @Date: 2023-04-03  18:36
 */
@Slf4j
@Data
public class LinuxShellOutUtil {

    private static Session session;

    public Boolean connectTest(DataBase dataBase) {
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(dataBase.getUserName(), dataBase.getUrl(), Integer.parseInt(dataBase.getPort()));
            session.setPassword(dataBase.getPassWord());
            // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
            session.setConfig("StrictHostKeyChecking", "no");
            // 连接超时
            session.connect(1000 * 10);
            if (session.isConnected()) {
                session.disconnect();
            }
            return true;
        } catch (JSchException e) {
            if (session.isConnected()) {
                session.disconnect();
            }
            log.error("linux连接测试异常", e);
            return false;
        }

    }

    public SSHResult getData(DataBase dataBase, String sql) {
        SSHResult result = new SSHResult();
        result.setFlag(true);
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(dataBase.getUserName(), dataBase.getUrl(), Integer.parseInt(dataBase.getPort()));
            session.setPassword(dataBase.getPassWord());
            // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
            session.setConfig("StrictHostKeyChecking", "no");
            // 连接超时
            session.connect(10000 * 10);
            byte[] tmp = new byte[1024];
            byte[] btmp = new byte[1024];
            // 命令返回的结果
            StringBuffer successBuffer = new StringBuffer();
            StringBuffer errorBuffer = new StringBuffer();
            Channel channel = session.openChannel("exec");
            ChannelExec exec = (ChannelExec) channel;
            InputStream extInputStream = exec.getInputStream();
            // 返回结果流(命令执行错误的信息通过getErrStream获取)
            InputStream stdStream = exec.getErrStream();
            exec.setCommand(sql);
            exec.connect();
            try {
                while (true) {
                    //获取命令执行正确的返回信息
                    while (extInputStream.available() > 0) {
                        int i = extInputStream.read(btmp, 0, 1024);
                        if (i < 0) {
                            break;
                        }
                        successBuffer.append(new String(btmp, 0, i));
                    }
                    //开始获得SSH命令错误的结果
                    while (stdStream.available() > 0) {
                        int i = stdStream.read(tmp, 0, 1024);
                        if (i < 0) {
                            break;
                        }
                        errorBuffer.append(new String(tmp, 0, i));
                    }
                    if (exec.isClosed()) {
                        break;
                    }
                    try {
                        Thread.sleep(200);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } finally {
                //关闭连接
                channel.disconnect();
            }
            //根据返回数据,组装结果
            if (StringUtils.hasLength(successBuffer)) {
                result.setCode("000000");
                result.setMessage(successBuffer.toString());
            } else if (StringUtils.hasLength(errorBuffer)) {
                result.setCode("000002");
                result.setMessage(errorBuffer.toString());
            } else {
                result.setCode("000001");
                result.setMessage("");
            }
        } catch (Exception e) {
            log.error("获取ssh执行结果异常", e);
            result.setFlag(false);
            result.setCode("100000");
        } finally {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
        return result;
    }


    /**
     * 关闭连接
     */
    public static void close() {
        if (session.isConnected()) {
            session.disconnect();
        }
    }

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {

        String ip = "";
        String username = "root";
        String password = "";
        DataBase dataBase = new DataBase();  //  连接数据类
        dataBase.setUserName(username);
        dataBase.setPassWord(password);
        dataBase.setUrl(ip);
        dataBase.setPort("22");
        LinuxShellOutUtil linux = new LinuxShellOutUtil();

        System.out.println(linux.getData(dataBase, "mkdir zx1"));
        System.out.println(linux.getData(dataBase, "ls -l"));

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值