拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java怎么使用SSH连接服务器

Java怎么使用SSH连接服务器

白鹭 - 2021-11-12 2448 0 2

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *