java登陆centos切换root用户,sftp上传jar包部署更新

我们的内网服务器每次更新前后端包时,都要先登陆一个普通xunjian帐号,再切换成root输入密码,上传包后再用命令更新,操作有点麻烦,所以用JSch写了一个工具类来实现密码输入和用户的切换以及项目包的上传和更新,下面是代码

java 复制代码
import com.jcraft.jsch.*;
import java.io.*;
import java.util.concurrent.TimeUnit;

public class Update {
    public static String user="xunjian";
    public static String host="10.10.10.124";
    public static int port=10022;
    public static String password="123456";
    public static String rootpassword="abcdef";
    public static void main(String[] args) {
        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user,host,port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
            ChannelShell channel = (ChannelShell)session.openChannel("shell");
            ChannelSftp sftp =(ChannelSftp) session.openChannel("sftp");
            //执行命令的通道
            channel.connect();
            //上传包的sftp通道
            sftp.connect();
            final BufferedReader i = new BufferedReader(new InputStreamReader(channel.getInputStream()));
            //另起一线程去处理服务器输出
            new Thread(new Runnable(){
                @Override
                public void run() {
                    try {
                        String line;
                        while ((line=i.readLine())!=null){
                            System.out.println(line);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            },"read").start();
            //写入流,用于命令的写入
            OutputStream o = channel.getOutputStream();
            //切换用户
            commond("su - root",o);
            //我在外网测试时,这里不等待无法正常切换root,不知道啥原因
            TimeUnit.SECONDS.sleep(1);
            commond(rootpassword,o);
            //删除之前包
            rm("/home/xm.jar",sftp);
            //把正在运行包改名
            rename("/home/xm.jar",sftp);
            //上传新jar包
            sftp.put(new FileInputStream("C:\\Users\\Administrator\\Desktop\\a\\xm.jar"),"/home/xm.jar",ChannelSftp.OVERWRITE);
            System.out.println("包上传完成,正在更新...");
            //更新命令也可以分开输入
            commond("/home/stop.sh && /home/start.sh",o);
            session.disconnect();
            System.out.println("更新完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void commond(String c,OutputStream o){
        try {
            o.write(c.getBytes());
            o.write("\n\r".getBytes());
            o.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void rm(String path,ChannelSftp sftp){
        try {
            sftp.rm(path+".bak");
        } catch (SftpException e) {
        }
    }
    public static void rename(String path,ChannelSftp sftp){
        try {
            sftp.rename(path,path+".bak");
        } catch (SftpException e) {
        }
    }
}
相关推荐
君顾16 分钟前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
zhanghe6871 小时前
es的密码带有特殊字符,导出
java
pnoker1 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
my_realmy1 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
天远数科2 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
骇客野人2 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
qiuhaipeng12 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
wxwx_bscxy3223 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
evans在进步4 小时前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
渡我白衣5 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集