SSHJ 的几个使用例子

2,842 阅读1分钟

SSHJ 与 JSch 一样,是 SSH 的一种 Java 实现,SSHJ 底层使用了 Apache SSHD,所以相对来说比 Apache SSHD 更易使用。以下是 SSHJ 常用到的几个例子:

例子中用到的公共参数

public class Constant {
    public static final String ip = "xxx.xxx.xxx.xxx";
    public static final int port = 22;
    public static final String username = "ubuntu";
    public static final String key = "/Users/Data/.ssh/a.pem";

    public static final String jump_ip = "xxx.xxx.xxx.xxx";
    public static final int jump_port = 22;
    public static final String jump_username = "ubuntu";
    public static final String jump_key = "/Users/Data/.ssh/b.pem";

    public static final String host_ip = "xxx.xxx.xxx.xxx";
    public static final int host_port = 22;
    public static final String host_username = "ubuntu";
    public static final String host_key = "/Users/Data/.ssh/c.pem";

    public static final int timeout = 3000;
}
  1. 通过密钥字符串连接主机
public void connHost() throws IOException {
    String privateKey = FileParse.getContent(key);

    SSHClient sshClient = new SSHClient();
    try {
        KeyProvider keyProvider = sshClient.loadKeys(privateKey, null, null);
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.connect(ip, port);
        sshClient.authPublickey(username, keyProvider);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        sshClient.disconnect();
    }
}
  1. 通过跳板机连接主机
public void connHostByJumpServer() throws IOException {
    String jumpPrivateKey = FileParse.getContent(jump_key);
    String hostPrivateKey = FileParse.getContent(host_key);

    SSHClient sshClient = new SSHClient();
    SSHClient jumpClient = null;
    try {
        jumpClient = new SSHClient();
        jumpClient.addHostKeyVerifier(new PromiscuousVerifier());
        jumpClient.setTimeout(timeout);
        jumpClient.connect(jump_ip, jump_port);
        KeyProvider jumpKeyProvider = jumpClient.loadKeys(jumpPrivateKey, null, null);
        jumpClient.authPublickey(jump_username, jumpKeyProvider);
        DirectConnection tunnel = jumpClient.newDirectConnection(host_ip, host_port);

        KeyProvider hostKeyProvider = sshClient.loadKeys(hostPrivateKey, null, null);
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.setTimeout(timeout);
        sshClient.connectVia(tunnel);
        sshClient.authPublickey(host_username, hostKeyProvider);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sshClient.disconnect();
        if (jumpClient != null) jumpClient.disconnect();
    }
}
  1. 执行远程命令
public void execCommand() throws IOException {
    String privateKey = FileParse.getContent(key);

    final SSHClient sshClient = new SSHClient();
    try {
        KeyProvider keyProvider = sshClient.loadKeys(privateKey, null, null);
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.connect(ip, port);
        sshClient.authPublickey(username, keyProvider);

        try (Session session = sshClient.startSession()) {
            String tmpDir = "/tmp/123";
            String command = "sudo mkdir -p " + tmpDir
                    + " && sudo chmod -R 755 " + tmpDir;
            session.exec(command);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        sshClient.disconnect();
    }
}
  1. scp 下载文件
public void scpDownloadFields() throws IOException {
    String privateKey = FileParse.getContent(key);
    final SSHClient sshClient = new SSHClient();
    try {
        KeyProvider keyProvider = sshClient.loadKeys(privateKey, null, null);
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.connect(ip, port);
        sshClient.authPublickey(username, keyProvider);

        sshClient.newSCPFileTransfer().download("/home/ubuntu/data", "/Users/Data/download");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        sshClient.disconnect();
    }
}
  1. sftp 下载文件
public void sftpDownloadFields() throws IOException {
    String privateKey = FileParse.getContent(key);

    final SSHClient sshClient = new SSHClient();
    try {
        KeyProvider keyProvider = sshClient.loadKeys(privateKey, null, null);
        sshClient.addHostKeyVerifier(new PromiscuousVerifier());
        sshClient.connect(ip, port);
        sshClient.authPublickey(username, keyProvider);

        try (SFTPClient sftp = sshClient.newSFTPClient()) {
            sftp.get("/home/ubuntu/data", "/Users/Data/download");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        sshClient.disconnect();
    }
}

参考: github.com/hierynomus/…