该篇文章主要讲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连接远程服务器的问题结束,希望对大家有所帮助!!