官网:GitHub传送门
简介
最近项目里要弄一个Java操作CentOS的工具类,之前是没搞过这种的,还是有点蒙圈的。最后确定了用Apache的库来操作,毕竟大公司的东西还是比较可靠的吧。
Maven依赖
往pom里一丢就完事了
<!-- ssh 相关依赖 -->
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>2.11.0</version>
</dependency>
连接服务器
- 创建一个client
- 用client来连接得到一个session,这个session才是实际可操作的
SshClient client = SshClient.setUpDefaultClient();
client.start();
ClientSession session;
try {
session = client
.connect(用户名, 服务器IP, ssh端口)
.verify(超时时间)
.getSession();
session.addPasswordIdentity(密码);
session.auth().verify(超时时间);
} catch (IOException e) {
// 打印异常到日志
}
执行远程命令
这里是用前面创建好的session来操作
try {
ChannelExec channel = session.createExecChannel(命令)
channel.open().verify(超时);
InputStream in = channel.getInvertedOut();
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br= new BufferedReader(reader);
// 服务器执行后返回结果
while (br.readLine() != null) {
System.out.println(br.readLine());
}
// 一般退出状态为0表示正常
int status = channel.getExitStatus();
// 记得关闭资源
bufferedReader.close();
reader.close();
in.close();
} catch (Exception e) {
}
这里如果不需要很准确的结果,可以使用
session.executeRemoteCommand
这个方法,直接返回执行结果。其实executeRemoteCommand
方法也是用createExecChannel
来实现的。
上传文件
同样用前面创建好的session来操作
try {
// 上传文件
SftpFileSystem fs = SftpClientFactory.instance().createSftpFileSystem(session);
Path remoteRoot = fs.getDefaultDir().resolve(远程路径);
// 检查并创建目录
if (!Files.exists(remoteRoot)) {
Files.createDirectories(remoteRoot);
}
// 注意这里需要拼接绝对路径,例如'/xxx/xxx/hello.txt'
Path remoteFile = remoteRoot.resolve(远程文件);
byte[] bytes = 字符串形式的文件内容.getBytes();
InputStream inputStream = new ByteArrayInputStream(bytes);
Files.copy(inputStream, remoteFile, REPLACE_EXISTING);
fs.close();
} catch (IOException e){
// 连接失败的异常
}
这里的上传方式为输入流,把东西都传到服务器再合成文件。也可以采用上传本地已有文件的做法,这个copy方法有多个重载的,可以看源码
总结
本文主要介绍了执行命令和上传文件两种情况。
执行命令有createExecChannel
和executeRemoteCommand
两种方法。
上传文件有本地文件和输入流两种方法,具体看Files.copy()
的重载。
以上方法应该足够使用了。