Java通过ssh连接服务器

一、Java通过ssh连接服务器

利用工具类JschUtil

前段时间遇到个业务需求,定时执行shell脚本任务,这就需要在Java代码里连接到远程服务器并执行成功,在网上找了一些资料,无奈代码都不全,只能自己写了。
下面展示一些 内联代码片

//工具类maven坐标
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.7</version>
</dependency>
public class ExecShellUtil {
    /**
     * 执行脚本
     *
     * @param user 用户名
	 * @param host IP地址
	 * @param port 端口号
	 * @param commands 脚本数据
	 * @param password 密码
	 * @param preKey 密钥
     * @return
     * @author fengdf
     */
    public static void exec(String user, String host, int port, String[] commands,String password,String preKey) {
        JSch jsch = new JSch();
        Session session  = null;
        try {
            //1.创建session
            session = JschUtil.createSession(jsch, shellData.getHost(), Integer.parseInt(shellData.getPort()), shellData.getUser());
            //密码登录
            if (){
                session.setPassword(password);
                log.info("密码登录:{}",password));
            }else {
                //2.添加密钥preKey登录
                jsch.addIdentity(null,preKey.getBytes(),null,null);
            }
            //3.连接
            session.connect();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			//exec()可以通过outputStream拿到执行shell失败时的返回提示
            String execResult = JschUtil.exec(session, commands, CharsetUtil.CHARSET_UTF_8, outputStream);
			//执行失败时execResult返回null
            if (StrUtil.isEmpty(execResult)){
                //4.打印错误日志
				log.info("err:{}",outputStream.toString("UTF-8"));
            }else {
                log.info("success:{}",execResult);
            }
        } catch (Exception e) {
            //设置执行失败的响应内容
            result.setResponseBody(e.getMessage());
            log.error("shell脚本异常:{}", shellData.getShellContent());
            log.error("发送请求异常", e);
        } finally {
            JschUtil.close(session);
        }
        return;
    }
}

JschUtil底层用了流的方式处理日志,synchronized解决并发问题,如果有兴趣也可以自己写。

这里我遇到一个坑,同时发送两个shell命令,会有一个报:session is down
原因是我把session设成了static属性,果然写代码是要严谨认真一点!

二,分享一些今天遇到的坑

数据表里的fieldserver_private_key_json是longtext类型,插入值如下,

{
    "name":"",
    "preKey":"",
    "pubKey":"",
    "passhrase":""
}

entity里对应的如果是对象类型,解析时会报错,最好写成String类型

@TableField("server_private_key_json")
private String serverPrivateKeyJson;

再用XXX keyJson = JSON.parseObject(data, xxx.class); 解析即可

当然解析时可能还会报错,具体问题具体分析。
String keyJson = shellData.getServerPrivateKeyJson().replace("},", "}");
我这里多出一个逗号

当然我还是个小菜鸡,哪里有不对的地方欢迎各位大佬指正。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值