1.简介
SSH,也其他安全状态或安全客户端,是一种网络协议,允许一台计算机通过不安全的网络安全地连接到另一台计算机。在本中,我们将展示如何使用 JSch 和 Apache MINA SSHD库通过Java与远程SSH服务器建立连接。
在的示例中,我们将首先打开 SSH,然后执行一个命令,输出读取其读取连接,最后关闭 SSH 连接。我们读取示例代码我们简单简单。
2. JSch
JSch 是SSH2 的Java 实现,它使我们可以连接到SSH 服务器并使用端口转发,X11 转发和文件传输。而且,它已经获得了BSD 样式许可的许可,并为我们提供了与Java 建立SSH 连接的一种访问权限 方法。
首先,让我们将 JSch Maven 依赖项添加到我们的 pom.xml 文件中:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
2.1 实现方式
要使用JSch建立SSH连接,我们需要一个用户名、密码、主机URL和SSH端口。默认的SSH端口是22,但可能会出现这样的情况,我们将服务器配置为使用其他端口进行SSH连接:
public static void listFolderStructure(String username, String password,
String host, int port, String command) throws Exception {
Session session = null;
ChannelExec channel = null; try {
session = new JSch().getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
ByteArrayOutputStream responseStream = new ByteArrayOutputStream();
channel.setOutputStream(responseStream);
channel.connect(); while (channel.isConnected()) {
Thread.sleep(100);
}
String responseString = new String(responseStream.toByteArray());
System.out.println(responseString);
} finally { if (session != null) {
session.disconnect();
} if (channel != null) {
channel.disconnect();
}
}
}
正如在代码中看到的那样,我们首先创建一个客户端会话将其配置用于连接到的 SSH 服务器。然后,我们创建了一个用于与 SSH 服务器通信的客户端接口我们,并在其中提供了通道类型 -在这种情况下为exec,这表示我们将把Shell命令传递给服务器。
另外,我们应该为将要写入服务器响应的通道设置输出流。使用通道。connect()方法建立连接后,将传递命令,接收到响应的响应激发。
让我们看看如何使用 JSch 提供的不同配置参数:
StrictHostKeyChecking – 指示应用程序是否检查是否可以在已知的主机上找到主机。 那么JSch 将永远不会将主机端口自动添加到known_hosts 文件,并且很多拒绝连接主机已经更改了主机。这将强制用户手动添加所有新主机。如果将设置为no,那么JSch 将自动添加所有新主机。 将新的主机密码添加到已知主机列表中
compression.s2c – 指定是否对服务器到客户端应用程序的数据流使用压缩。可用值是zlib,无值,第二个是默认值
compression.c2s——指定是否在客户端服务器方向上对数据流使用压缩。可用值是zlib,无值,第二个是默认值
与服务器的通信结束后,关闭会话和SFTP通道很重要,以避免内存泄漏。
3. Apache MINA SSHD
Apache MINA SSHD为基于Java的应用程序提供SSH支持。该库基于Apache MINA(一种可扩展的高性能异步IO库)。
让我们添加Apache Mina SSHD Maven依赖项:
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>2.5.1</version>
</dependency>
3.1 代码实现
让我们看一下使用Apache MINA SSHD连接到SSH服务器的代码示例:
public static void listFolderStructure(String username, String password,
String host, int port, long defaultTimeoutSeconds, String command) throws IOException {
SshClient client = SshClient.setUpDefaultClient();
client.start(); try (ClientSession session = client.connect(username, host, port)
.verify(defaultTimeoutSeconds, TimeUnit.SECONDS).getSession()) {
session.addPasswordIdentity(password);
session.auth().verify(defaultTimeoutSeconds, TimeUnit.SECONDS); try (ByteArrayOutputStream responseStream = new ByteArrayOutputStream();
ClientChannel channel = session.createChannel(Channel.CHANNEL_SHELL)) {
channel.setOut(responseStream); try {
channel.open().verify(defaultTimeoutSeconds, TimeUnit.SECONDS); try (OutputStream pipedIn = channel.getInvertedIn()) {
pipedIn.write(command.getBytes());
pipedIn.flush();
}
channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED),
TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds));
String responseString = new String(responseStream.toByteArray());
System.out.println(responseString);
} finally {
channel.close(false);
}
}
} finally {
client.stop();
}
}
使用Apache MINA SSHD时,我们的事件序列与JSch类似。首先,我们使用SshClient类实例建立与SSH服务器的连接。如果我们使用SshClient.setupDefaultClient(),对其进行初始化,那么我们将能够使用具有适合大多数用例的默认配置的实例。这包括密码,压缩,MAC,密钥交换和签名。
在那之后,我们将创建ClientChannel并将ByteArrayOutputStream附加到它,以便将其用作响应流。如我们所见,SSHD需要为每个操作定义超时。它还允许我们使用Channel.waitFor()方法定义在命令传递后等待服务器响应的时间。
请务必注意, SSHD会将完整的控制台输出写入响应流。 JSch仅使用命令执行结果来执行此操作。
有关Apache Mina SSHD的完整文档可在该项目的官方GitHub存储库中找到。
4。结论
本文说明了如何使用两个可用的Java库(JSch和Apache Mina SSHD)与Java建立SSH连接。我们还展示了如何将命令传递到远程服务器并获得执行结果。另外,可以在GitHub上获得完整的代码示例。
0 评论