引入ssh相关依赖,以maven为例
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
导入工具类
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.KeyPair;
import com.jcraft.jsch.Session;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Objects;
public class SSHTools {
private static final Logger logger = LoggerFactory.getLogger(SSHTools.class);
private Session session;
public static SSHTools getInstance() {
return new SSHTools();
}
private void loginByPassword(@NotNull String hostIp,
@NotNull Integer hostPort,
@NotNull String user,
@NotNull String password) {
try {
JSch jsch = new JSch();
session = jsch.getSession(user, hostIp, hostPort);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(1000 * 10);
} catch (JSchException e) {
logger.error("登录时发生错误!", e);
}
}
private void loginByKey(@NotNull String hostIp,
@NotNull Integer hostPort,
@NotNull String user,
@NotNull String privateKey) {
try {
JSch jsch = new JSch();
jsch.addIdentity(user, privateKey.getBytes(), null, null);
session = jsch.getSession(user, hostIp, hostPort);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(1000 * 10);
} catch (JSchException e) {
logger.error("登录时发生错误!", e);
}
}
public String executeShell(@NotNull String command) throws Exception {
logger.info("exe cmd: {}", command);
byte[] tmp = new byte[1024];
StringBuilder resultBuffer = new StringBuilder();
ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand(command);
exec.connect();
InputStream stdStream = exec.getInputStream();
try {
while (true) {
while (stdStream.available() > 0) {
int i = stdStream.read(tmp, 0, 1024);
if (i < 0) {
break;
}
resultBuffer.append(new String(tmp, 0, i));
}
if (exec.isClosed()) {
break;
}
try {
Thread.sleep(200);
} catch (Exception e) {
logger.error("执行命令发生错误!", e);
}
}
} finally {
if (exec.isConnected()) {
exec.disconnect();
}
}
String result = resultBuffer.toString();
logger.info("exe cmd return : {}", result);
return result;
}
public void close() {
if (Objects.nonNull(session) && session.isConnected()) {
session.disconnect();
}
}
public static Pair<String, String> generateKeyPair(String comment) throws JSchException {
JSch jsch = new JSch();
KeyPair keyPair = KeyPair.genKeyPair(jsch, KeyPair.RSA);
ByteArrayOutputStream baos;
baos = new ByteArrayOutputStream();
keyPair.writePrivateKey(baos);
String privateKeyString = baos.toString();
baos = new ByteArrayOutputStream();
keyPair.writePublicKey(baos, comment);
String publicKeyString = baos.toString();
keyPair.dispose();
return Pair.of(publicKeyString, privateKeyString);
}
}
密码登录并执行命令demo
public static void main(String[] args) throws Exception {
SSHTools sshTools = SSHTools.getInstance();
try {
//1.密码登录主机
sshTools.loginByPassword("主机ip", 22, "root", "主机用户密码");
//2.执行命令 例如:查看 data 目录下文件
String executeShell = sshTools.executeShell("ls /data/");
//3.打印执行结果
System.out.println(executeShell);
}finally {
//4.释放资源
sshTools.close();
}
}
免密登录并执行命令demo
public static void main(String[] args) throws Exception {
Pair<String, String> pair = SSHTools.generateKeyPair("根据业务随便填");
String privateKeyString = pair.getRight();
String publicKeyString = pair.getLeft();
String command = "cd ~ && if [ ! -d .ssh ];then mkdir -p .ssh ;fi && cd .ssh && echo " + publicKeyString + " >> authorized_keys && chmod 700 ~/.ssh && chmod 600 authorized_keys"
System.out.println(command);
SSHTools sshTools = SSHTools.getInstance();
try {
sshTools.loginByKey("主机ip", 22, "root", privateKeyString);
String executeShell = sshTools.executeShell("ls /data/");
System.out.println(executeShell);
} finally {
sshTools.close();
}
}