首页 > 编程语言 >java远程链接SSH,并执行命令

java远程链接SSH,并执行命令

时间:2023-03-27 16:00:49浏览次数:34  
标签:执行命令 java sess SSH new null out conn sshShellUtil

远程连接SSh,可以配合webhook使用,自动打包处理,在docker部署下,是一种成本很小但是很实用的方案。

本方案使用ssh2进行链接。正常来说有两种链接方式,这里选择startShell,这种方式更像是新开一个terminal,可以取到完整的系统变量,脚本才能正常执行。另一种方案因为加载问题,取不到完整变量,导致部分语句执行失败。

上代码,pom

<dependency>
  <groupId>ch.ethz.ganymed</groupId>
  <artifactId>ganymed-ssh2</artifactId>
  <version>262</version>
</dependency>


上代码,封装的Util

public class SshShellUtil {

    private String hostName;

    private String userName;

    private String password;

    private String scriptEndWord;

    private String shCmd;

    public void runShell() throws IOException {
        Connection conn = null;
        Session sess = null;
        BufferedReader brs = null;

        log.info("準備鏈接");
        log.info("连接服务器 " + hostName + " ,执行shell:" + shCmd);

        try{
            conn = new Connection(hostName);
            conn.connect();

            boolean isAuthenticated = conn.authenticateWithPassword(userName, password);
            if (isAuthenticated == false)
                throw new IOException("Authentication failed.");
            sess = conn.openSession();
            sess.requestPTY("bash");
            sess.startShell();
            PrintWriter out = new PrintWriter(sess.getStdin());
            out.println(shCmd);
            out.flush();

            log.info("开始打印结果");
            InputStream stdout = new StreamGobbler(sess.getStdout());
            brs = new BufferedReader(new InputStreamReader(stdout));

            Thread.sleep(0);
            while(true){
                String line = brs.readLine();
                System.out.println(line);
//                Thread.sleep(200);
                if(null == line || scriptEndWord.equals(line)){
                    break;
                }
            }

            out.println("exit");
            out.close();
            sess.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS,
                    60000);

            log.info("結束");
        }
        catch (IOException | InterruptedException e){
            e.printStackTrace(System.err); System.exit(2);
        }finally{
            if(brs!=null)
                brs.close();
            //Close this session
            if(sess!=null)
                sess.close();
            // Close the connection
            if(conn!=null)
                conn.close();
        }
    }
}


调用代码

SshShellUtil sshShellUtil = new SshShellUtil();
sshShellUtil.setHostName(sshProDeployParam.getHostName());
sshShellUtil.setUserName(sshProDeployParam.getUserName());
sshShellUtil.setPassword(sshProDeployParam.getPassword());
sshShellUtil.setScriptEndWord("dep_scrip_done");
sshShellUtil.setShCmd("cd /data/dengwen_city_garden_api/ && sh script.sh");
ThreadUtil.execute(()->{
  try {
    shellUtil.runShell();
  } catch (IOException e) {
    e.printStackTrace();
  }
});


shCmd脚本,这里封装成为sh脚本。


标签:执行命令,java,sess,SSH,new,null,out,conn,sshShellUtil
From: https://blog.51cto.com/u_15595167/6152356

相关文章

  • kettle java api save 任务 无法load trans/job
    使用save保存publicstaticvoidrunTrans(StringtransName,KettleDatabaseRepositoryrepository){try{RepositoryDirectoryInterfacedir......
  • android stdio中java代码对于xml的操作
    首先,我们需要在java代码中声明要修改的页面,例如LinearLayoutlistView=findViewById(R.id.line_station_liebiao);其次声名我们加入希望添加的组件,例如LinearLayout......
  • Java 反射
    我在很久之前写过一次,也都是从网上搬运的知识,这段时间一直在学python,其他的知识就会有遗忘,我再复习一遍。 一.反射的基本概念使用反射机制可以构造类对象,动态获取当前......
  • 远程SSH连接和远程桌面连接龙芯3A5000
    远程SSH连接sudoaptupdate#更新软件列表sudoaptinstallopenssh-client#安装SSH客户端sudoaptinstallopenssh-server#安装SSH服务端sudosystemctlstart......
  • Java面试题(二)
    JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供......
  • Java数据结构 HashMap 哈希表定义使用
    1.HashMapHashMap是一个散列表,它存储的内容是键值(key-value)映射。其中key和value类型可以相同也就而已不同,根据定义。2.HashMap使用1)定义HashMap<Integer,String>hashmap1......
  • java 类的初始化顺序
    父类的静态字段-->父类静态代码块-->子类静态字段-->子类的静态代码块-->父类成员变量-->父类构造代码块-->父类构造方法-->子类成员变量-->子类构造代码块-->子类构造方法......
  • Grasshopper - Summation
    SummationWriteaprogramthatfindsthesummationofeverynumberfrom1tonum.Thenumberwillalwaysbeapositiveintegergreaterthan0.Forexample(Inp......
  • Java程序基础
    一。面向对象的概念1.面向对象是一种思想,是Java基础知识中最重要的部分,没有之一。 面向对象是相对面向过程而言的,面向对象和面向过程都是一种思想。(1)分析不同面向......
  • java代码备份mysql数据库
    生成环境的数据库我们需要不断的进行备份,不然服务器出现故障,会是灾难性的直接添加我的代码packagecom.hrp.task;importcom.alibaba.fastjson.JSON;importcom.bas......