Java用Jsch连接远程服务器,踩坑必看

2,586 阅读2分钟

该篇文章主要讲Java中用Jsch连接远程服务器的操作,并且解决通过密钥登录时爆com.jcraft.jsch.JSchException: invalid privatekey的bug,本文用两种方式实现远程连接,一个是自己手写工具类,第二个是用hutool的工具依赖

一.自己动手写jsch的工具类

1.Maven依赖

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

2.具体的demo

public static Boolean connectRemoteHost() throws Exception{
    JSch jsch = new JSch();

    // 通过密钥文件登录(这里有坑,大坑,网上的博主也是坑的一批)
    //我的密钥证书路径:PRIVATE_SSH_KEY=/Users/camel/.ssh/id_rsa
    jsch.addIdentity(PRIVATE_SSH_KEY); //可能会出现com.jcraft.jsch.JSchException: invalid privatekey
    // Create a new SSH session
    Session session = jsch.getSession("root", YC_HOST, 22);
    session.setConfig("StrictHostKeyChecking", "no");
    // Connect to the remote service
    //通过密码登录
    //session.setPassword("12345");
    session.connect();
    // 跑一条命令测试一下
    String command = "ls -la";
    ChannelExec channel = (ChannelExec) session.openChannel("exec");
    channel.setCommand(command);
    // 打印命令结果
    channel.connect();
    java.io.InputStream in = channel.getInputStream();
    byte[] tmp = new byte[1024];
    while (true) {
        while (in.available() > 0) {
            int i = in.read(tmp, 0, 1024);
            if (i < 0) break;
            System.out.print(new String(tmp, 0, i));
        }
        if (channel.isClosed()) {
            if (in.available() > 0) continue;
            System.out.println("exit-status: " + channel.getExitStatus());
            break;
        }
        try {
            Thread.sleep(1000);
        } catch (Exception ee) {
            // do nothing
        }
    }

    // Disconnect from the remote service
    channel.disconnect();
    session.disconnect();
    return true;
}

3.解决com.jcraft.jsch.JSchException: invalid privatekey的bug

方案一

如果你反复确认过你的密钥文件和路径都是没有问题的,而且你的终端是可以通过密钥的方式链接到远程服务器的,那么这里的com.jcraft.jsch.JSchException: invalid privatekey 问题很大可能是密钥版本的问题。大家现在新的电脑或者操作系统默认生成的ssh 密钥文件是大于openssh V8的.而jsch支持的是V8以下版本的,所以jsch识别不了新版本的密钥证书。解决方法是生成新的密钥证书,命令如下:

##执行下面命令,回车根据提示就行
ssh-keygen  -m PEM  -t rsa  -b 4096

方案二

直接替换Maven依赖,推荐这种做法,对代码不需要调整,只换Maven依赖即可


<dependency>
    <groupId>com.github.mwiede</groupId>
    <artifactId>jsch</artifactId>
    <version>0.2.17</version>
</dependency>

二、用Hutool实现连接远程服务器

1.maven依赖

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.14</version>
</dependency>

2.具体代码

//用密码的方式登录
Session session = JschUtil.getSession("10.1.1.1", 22, "test", "123456");
//密钥的方式登录,我的密钥证书路径:PRIVATE_SSH_KEY=/Users/camel/.ssh/id_rsa
Session session = JschUtil.getSession("10.1.1.1", 22, "test", PRIVATE_SSH_KEY,null);

到此,关于Java使用jsch连接远程服务器的问题结束,希望对大家有所帮助!!