前提
需要测试主机之间能够免密
配置ssh请自行百度
jar包
旧版:com.jcraft.jsch
仅支持老版的密钥格式:旧版本 RSA
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
新版:com.github.mwiede.jsch
推荐使用
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.13</version>
</dependency>
id_rsa私钥文件
旧版本
jsch支持, 需要创建ssh-keygen的时候加上参数-m pem
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
-----END RSA PRIVATE KEY-----
新版本
-----BEGIN OPENSSH PRIVATE KEY-----
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
-----END OPENSSH PRIVATE KEY-----
报错处理:
Invalid privatekey
com.jcraft.jsch使用时,如果使用的新版本的密钥就会报这个错误
解决方法
修改密钥格式为RSA
- 用低版本的的SSH工具生成密钥对,上传上去。低版本生成的就是旧版本的密钥格式RSA
- 生成密钥时指定格式,ssh-keygen -m PEM -t rsa,加上参数-m PEM,生成的密钥对,就是RSA的了。(推荐)
修改新版本
- 使用com.github.mwiede.jsch
Auth fail
权限问题:需要检查ip,用户名,密码,是否能够远程登录等等
免密登录获取session
public static final String SECRET_KEY = "~/.ssh/id_rsa";
public static final String SECRET_PUB_KEY = "~/.ssh/id_rsa.pub";
public static final String KNOWN_HOSTS = "~/.ssh/known_hosts";
public static String getTestHost(String user, String host, String password, boolean flag) {
JSch jsch = new JSch();
Session session = null;
try {
if(flag) { // 免密登录
// 1。这样写更全面
jsch.addIdentity(SECRET_KEY);
jsch.setKnownHosts(KNOWN_HOSTS);
jsch.addIdentity(SECRET_KEY, SECRET_PUB_KEY, null);
// 2.只用SECRET_KEY也可以获取session
// jsch.addIdentity(SECRET_KEY);
session = jsch.getSession(user, host, PORT4SSH);
} else {
session = jsch.getSession(user, host, PORT4SSH);
session.setPassword(password);
}
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
} catch (JSchException e) {
return e.getMessage();
} finally {
if (session != null) {
session.disconnect();
}
}
return "yes";
}