首先需要添加一个ssh连接的maven依赖
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
demo:
Connection conn = new Connection(hostName, port);
conn.connect();
// 第一种,使用用户名密码验证身份
// conn.authenticateWithPassword(userName, password);
// 第二种,使用用户名密码以及秘钥验证身份
conn.authenticateWithPassword(/*用户名*/userName, /*秘钥文件*/keyFile, /*密码*/password);
// 此时就可以用conn do something啦!
Session session = conn.openSession();
session.execCommand(/*要执行的命令*/command);
// 获取输入流用来读取执行结果,自己封装流read即可
InputStream is = new StreamGobbler(session.getStdout())
// do read
封装成一个工具类就可以方便的执行命令啦,但是我的需求还要上传下载文件,每次使用scp都需要输入密码,怎么办呢,因为本来是想做一个运维后台,不需要手动到服务器上操作就可以从零部署项目,其他操作都可以使用java执行命令,但是上传下载文件,配置之类的,每次都需要输入密码,所以我采用了将本机的公钥放入服务器的authorized_keys实现免密上传下载,但是这一步必须要手动操作,如果有更好的办法欢迎大佬私信留言我,感激不尽
操作如下:
# 生成秘钥对
ssh-keygen -t rsa
# 将本地生成的公钥上传至远程服务器
scp ~/.ssh/id_rsa.pub 用户名@远程主机ip:~/.ssh/authorized_keys
# 此时需要键入远程服务器的密码,输入后显示上传界面即为成功,两台服务器通信就不需要密码了