JAVA编程-访问SSH的方式

1. Apache Mina SSHD

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();
    }
}

2. JSch + OpenSSH 组合

你也可以通过 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 客户端进行连接,并读取命令的输出。

3. JSch + JDK 的 ProcessBuilder

除了外部执行 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 库那样具有跨平台的优势。

4. 使用 JDK 自带的 JDK SSH API(Java 9+)

从 Java 9 开始,JDK 提供了内置的 JDK SSH API,允许你直接通过 Java 进行 SSH 连接、执行命令等操作。这是一个新的 API,它是 Java 平台的一部分,尽管目前支持的功能还不如 JSCH 或 Apache Mina SSHD 完善,但它是一个很好的选择。

官方文档:JDK SSH API

5. 使用 sshj 库

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 支持,可以用于远程执行命令、文件传输等操作。

你可能感兴趣的:(java,ssh,开发语言)