Apache Mina SSHD 是一个用于构建 SSH 客户端和服务器的 Java 库,它提供了对 SSH 协议的全面支持。与 JSCH 类似,Apache Mina SSHD 可以用于通过 SSH 连接到远程服务器。
官方网站:Apache Mina SSHD
Maven 依赖:
<dependency>
<groupId>org.apache.sshdgroupId>
<artifactId>sshd-coreartifactId>
<version>2.9.0version>
dependency>
简单使用示例:
import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.auth.password.PasswordAuthenticator;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.client.subsystem.sftp.SftpClient;
import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
import java.nio.file.Paths;
public class ApacheMinaSSHExample {
public static void main(String[] args) throws Exception {
SshClient sshClient = SshClient.setUpDefaultClient();
sshClient.start();
// 设置身份验证
sshClient.setPasswordAuthenticator((username, password, session) -> true); // 使用用户名密码验证
// 建立连接
try (ClientSession session = sshClient.connect("your_username", "host_ip", 22).verify().getSession()) {
session.addPasswordIdentity("your_password");
session.auth().verify();
// 执行命令
String result = session.executeRemoteCommand("ls -l");
System.out.println(result);
}
sshClient.stop();
}
}
你也可以通过 JSCH 和 OpenSSH(或其他外部工具)的组合来实现 SSH 连接。你可以通过 Java 运行外部进程来使用 OpenSSH 客户端(例如 ssh 和 scp 命令),然后在 Java 中处理结果。
执行外部 SSH 命令:
import java.io.*;
public class ExternalSSHExample {
public static void main(String[] args) {
try {
String command = "ssh your_username@host_ip 'ls -l'"; // 使用 OpenSSH 客户端
Process process = Runtime.getRuntime().exec(command);
// 获取命令的输出
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
process.waitFor(); // 等待命令执行完毕
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
这种方法通过 Java 运行外部命令来使用 OpenSSH 客户端进行连接,并读取命令的输出。
除了外部执行 OpenSSH 命令,你还可以通过 ProcessBuilder 在 Java 中启动外部进程。比如,你可以使用 ssh 命令来实现远程连接,并且使用 Java 获取返回的结果。
import java.io.*;
import java.util.*;
public class SSHWithProcessBuilder {
public static void main(String[] args) {
String host = "host_ip";
String username = "your_username";
String password = "your_password"; // 注意不要直接在代码中存储密码,可以考虑使用更安全的方法处理密码。
List<String> commands = Arrays.asList("ssh", username + "@" + host, "ls -l");
try {
ProcessBuilder builder = new ProcessBuilder(commands);
Process process = builder.start();
// 读取命令输出
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
process.waitFor(); // 等待命令执行完毕
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
这种方法直接通过 ssh 命令来进行连接,但它不如使用 SSH 库那样具有跨平台的优势。
从 Java 9 开始,JDK 提供了内置的 JDK SSH API,允许你直接通过 Java 进行 SSH 连接、执行命令等操作。这是一个新的 API,它是 Java 平台的一部分,尽管目前支持的功能还不如 JSCH 或 Apache Mina SSHD 完善,但它是一个很好的选择。
官方文档:JDK SSH API
sshj 是一个另一种流行的 Java SSH 库,支持 SSH2 协议。它的使用方式与 JSCH 类似,但在某些场景下表现得更加简洁和现代。
Maven 依赖:
<dependency>
<groupId>com.jcraftgroupId>
<artifactId>sshjartifactId>
<version>0.31.0version>
dependency>
使用示例:
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.IOUtils;
public class SSHJExample {
public static void main(String[] args) {
try (SSHClient ssh = new SSHClient()) {
ssh.loadKnownHosts();
ssh.connect("host_ip");
ssh.authPassword("your_username", "your_password");
// 执行命令
String result = ssh.startSession().exec("ls -l").getOutput();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
sshj 提供了简单而强大的 API 支持,可以用于远程执行命令、文件传输等操作。