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;
}
- 通过密钥字符串连接主机
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();
}
}
- 通过跳板机连接主机
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();
}
}
- 执行远程命令
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();
}
}
- 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();
}
}
- 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();
}
}