如题:实现JAVA程序对远程服务器执行shell命令
最近想给实验室内网环境的docker做一个可视化管理页面,用到docker-java的API,但是部分docker指令返回的值不全。就以java直接操作服务器命令的方式,并返回输出结果。
环境说明:
- 机房内网远程服务器-192.168.10.16:22
- java项目:springboot
- ssh的api:jsch
Maven
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
服务器信息配置
此处是springboot项目,直接把服务器基本信息配置在application.properties.
ip=192.168.10.16
port=22
remoteusername=gpu-server
password=root
此处服务器用户名千万不要写username,springboot会把本机账户名当作username写入默认的boot项目配置中。
SSH连接开启
package com.zyr.dockerproject.config;
import com.jcraft.jsch.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class SSHConfig {
@Value("${ip}")
private String ip;
@Value("${port}")
private Integer port;
@Value("${remoteusername}")
private String username;
@Value("${password}")
private String password;
@Bean
public ChannelExec connectChannelExec(){
JSch jSch = new JSch();
Session session = null;
try {
session = jSch.getSession(username, ip, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(1000 * 10);
ChannelExec channel =(ChannelExec) session.openChannel("exec");
return channel;
} catch (JSchException e) {
e.printStackTrace();
return null;
}
}
}
session.setConfig(“StrictHostKeyChecking”, “no”); 此处不要设置成yes,亲测报错。
StrictHostKeyChecking具体作用:StrictHostKeyChecking
使用连接执行命令
package com.zyr.dockerproject;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.zyr.dockerproject.entity.ContainerInfo;
import com.zyr.dockerproject.entity.ImageInfo;
import com.zyr.dockerproject.service.DockerClientService;
import com.zyr.dockerproject.utils.DockerClientUtils;
import jdk.nashorn.internal.runtime.regexp.joni.ast.StringNode;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
@SpringBootTest
class DockerProjectApplicationTests {
@Autowired
private ChannelExec channelExec;
@Test
void testSSH() throws JSchException, IOException {
channelExec.setCommand("nvidia-smi");
channelExec.setInputStream(null);
channelExec.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(channelExec.getInputStream()));
StringBuilder msg = new StringBuilder(16);
String read;
while((read = in.readLine()) != null){
msg.append("\n").append(read);
System.out.println(read);
}
}
}