java代码通过ssh免密操作远程服务器shell

48 篇文章 0 订阅
45 篇文章 0 订阅

环境

操作系统:win10
虚拟机:centos7

步骤

一般我们都是通过CRT这样的工具来连接并操作服务器。但是最近由于业务需求,需要通过java代码来操作远程服务器。其实也就是操作shell。
思路:
①使用java两个相关类Runtime和Process

1.Runtime:该类封装了运行时的环境。每个Java应用程序都有一个Runtime类实例,是应用程序能够与其运行的环境环境相链接。在多线程的操作系统中,可以使用Runtime类来运行其他的线程。

2.Process:该类是一个抽象类,封装了一个进程。Runtime.exec和ProcessBuilder.start都会启动一个进程,并返回该Process子类的一个实例。

网上相关的资料中,没有关于免密的解决方案,所以我也就没有参数这种方式。

②使用框架jsch
这个框架提供了好多好多的解决方案。
官网:http://www.jcraft.com/jsch/

这里写图片描述

我参考的是UserAuthPubKey这个类的例子。

我自己测试成功的代码,如下:
(代码相对于例子是有所删减,因为官网的例子中使用了javaswing类,也就是java的图形界面,那些页面,明显我是不需要的)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class ConnectionSSH {


    public static void main(String[] args) throws JSchException, IOException {
        JSch jsch = new JSch();
        String pubKeyPath = "C:\\Users\\yutao\\.ssh\\id_rsa";
        jsch.addIdentity(pubKeyPath);

        String username = "yutao";
        String host = "192.168.116.131";
        Session session=jsch.getSession(username, host, 22);//为了连接做准备
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        String command = "ls";
        Channel channel=session.openChannel("shell");   

        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        InputStream in=channel.getInputStream();

        channel.connect();

    }
}

在这里说下,注意的细节:

String pubKeyPath = "C:\\Users\\yutao\\.ssh\\id_rsa";

这句话是指定本机win10的私钥的路径。也就意味着,在此之前,需要把公钥远程拷贝到远程服务器中。

可以参考我的文章:SSH-免密码互相远程登录中的本机和虚拟机免密

        String username = "yutao";
        String host = "192.168.116.131";

分别为远程服务器的登录用户名和ip地址,一般都不会用root账号。

session.setConfig("StrictHostKeyChecking", "no");

这句话一定要加,官网的例子中是没有的,因为它使用的是图形界面进行交互,在代码里我们需要跳过检测。否则会报错,说找不到主机。


上面的代码虽然可以连接成功,但是它最后是在eclipsecontrol里挂起,等待你输入命令。

我希望的是,命令通过前端页面传。而不是在IDE里面手动输入。

在代码里写命令

在上面的代码中有这么一句:

Channel channel=session.openChannel("shell");   

我们可以把shell改为exec

代码如下:

package com.misssad.connection;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class ConnectionSSH {


    public static void main(String[] args) throws JSchException, IOException {
        JSch jsch = new JSch();
        String pubKeyPath = "C:\\Users\\yutao\\.ssh\\id_rsa";
        jsch.addIdentity(pubKeyPath);

        String username = "yutao";
        String host = "192.168.116.131";
        Session session=jsch.getSession(username, host, 22);//为了连接做准备
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
        String command = "./test.sh";
//      Channel channel=session.openChannel("shell");
        ChannelExec channel=(ChannelExec)session.openChannel("exec");
        channel.setCommand(command);


//      channel.setInputStream(System.in);
//      channel.setOutputStream(System.out);
//      InputStream in=channel.getInputStream();

        BufferedReader in = new BufferedReader(new InputStreamReader(channel.getInputStream()));

        channel.connect();

        String msg;

        while((msg = in.readLine()) != null){
            System.out.println(msg);
        }
        channel.disconnect();
        session.disconnect();
    }
}

我为了测试,先在远程服务器中创建了一个脚本test.sh里面的命令就是ls
执行上面代码后得到结果:

test.sh
公共
模板
视频
图片
文档
下载
音乐
桌面

JSch基本使用

如何通过 java 实现在多台 Linux 服务器间自动执行各种命令或查询日志

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值