Java中使用JSCH工具连接Linux服务器及执行多条Shell命令

一、JAVA连接至Linux服务器

        创建Maven项目,导入JSCH依赖:

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

        编写创建和关闭连接的方法,之后的使用中,只需要调着两个方法即可。连接原理:创建session对话,使用ipportuserNamepassword进行校验,函数返回session对话对象。

//jsch创建连接
public static Session getJSchSession(String ip , int port, String userName, String password){
    JSch jSch = new JSch();
    Session session = null;
    try {
        //创建连接
        session = jSch.getSession(userName,ip,port);
        session.setPassword(password);
        //是否使用密钥登录,一般默认为no
        session.setConfig("StrictHostKeyChecking", "no");
        //启用连接
        session.connect();
        System.out.println("==============服务器连接成功==============");
    }catch (Exception e){
        e.printStackTrace();
        System.out.println("==============服务器连接失败==============");
    }
    return session;
}


//jsch关闭连接
public static void closeJSchSession(Session session){
    if (session != null) {
        try {
            session.disconnect();
            System.out.println("===========服务器连接关闭成功===========");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("===========服务器连接关闭失败===========");
        }
    }
}

二、JAVA操作多条Shell命令

        传入Shell命令集合进行操作,并可以接收返回值

操作原理:

  1. 使用上述连接方法返回的session对话对象进行创建Channel执行通道
  2. 命令集合参数传递给通道,连接通道,通道执行命令,使用IO流读命令结果
  3. 循环读取结果并且将返回值拼接为字符串,若没有返回值则标注
  4. 将拼接好的字符串保存到集合,并且返回
//用来执行命令
//Session表示传递连接对话,commands表示传递命令集合
public static List<String> getCmdResult(Session session , List<String> commands){
    //用来存放命令的返回值
    List<String> cmdResult = new ArrayList<>();
    for (String command : commands) {
        Channel channel = null;
        try {
            //创建执行通道
            channel = session.openChannel("exec");
            //设置命令
            ((ChannelExec) channel).setCommand(command);
            //连接通道
            channel.connect();
            //读取通道的输出
            InputStream in = channel.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            //存放命令的执行结果,如果结果有很多行,则每次line的值不同
            String line;
            //lines用来拼接line结果
            StringBuffer lines = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                //去除头尾的空格
                line.trim();
                lines = lines.append(line);
            }
            //如果命令执行没有返回值,则直接输出没有返回值
            if (String.valueOf(lines).equals("")){
                cmdResult.add("命令["+command+"]执行成功,但没有返回值");
            }else {
                //否则将每行返回直接存入到list中
                cmdResult.add(String.valueOf(lines));
            }
            reader.close();
            channel.disconnect();
        } catch (JSchException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    return cmdResult;
}

三、使用

        注意cd命令是不生效的。所谓不生效就是你不能先切换到某个目录,然后直接执行创建文件夹,创建文件夹的路径必须要写绝对路径。

public static void main(String[] args) {
     String ip = "服务器ip地址";
     int port = 22;
     String userName = "服务器账号";
     String password = "服务器密码";
     List<String> cmds = new ArrayList<>();
     cmds.add("ls -l");
     cmds.add("mkdir MyDir");
     Session session = getJSchSession(ip,port,userName,password);
     List<String> result = getCmdResult(session, cmds);
     result.forEach((x)-> System.out.println(x));
     closeJSchSession(session);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值