您当前的位置:首页 > 电脑百科 > 硬件技术 > 硬件知识

SSHJ - 功能齐全的Java SSH库

时间:2020-07-19 10:49:45  来源:  作者:

SSH(Secure Shell,安全外壳协议),是专为远程登录会话和其他网络服务提供安全性的应用层协议。在日常开发中,包括登录远程服务器、远程执行命令脚本、文件传输等,都使用了 SSH 协议的实现。而 SSHJ 就是 SSH 协议的一个 JAVA 语言实现,其功能齐全,对 SSH 协议的特性实现全面,可以很方便地在代码中实现 SSH 相关功能应用,值得 Java 开发者了解使用。

SSHJ - 功能齐全的Java SSH库

SSH协议

简介

SSHJ 是 hierynomus 在 Github 上开源的 Java SSH 库,项目位于 https://github.com/hierynomus/sshj,目前版本为 v0.29.0。

SSHJ 功能齐全,支持从 known_hosts 文件读取验证公钥,支持公钥、密码和交互式的验证方式,支持命令、子系统和 Shell Channel,支持本地和远程端口转发,支持 SCP 安全拷贝协议,支持从版本 0 到 3 的完全的 SFTP 安全文件传输协议,支持广泛的加密、签名、压缩等的算法实现。

SSHJ - 功能齐全的Java SSH库

SSH协议和SSHJ库

安装

SSHJ 使用方便,可以使用 Maven 添加到项目依赖,在 pom.xml 中添加

<dependency>
  <groupId>com.hierynomus</groupId>
  <artifactId>sshj</artifactId>
  <version>0.29.0</version>
</dependency>

SSHJ 的主要依赖是 SLF4J,另外,一些加密算法可能会需要 BouncyCastle,而 zlib 压缩则需要依赖 JZlib。

SSHJ 也可以自行编译,需要 Java6 及以上环境,并安装有 Unlimited strength Java Cryptography Extensions (JCE) 加密扩展包,运行命令

./gradlew clean build
SSHJ - 功能齐全的Java SSH库

SSH协议与SSHJ库

实例

SSHJ中的主要接口由 SSHClient 提供,其作为客户端用于连接 SSH 服务,每次连接都会生成一个会话 session,在一个 session 中进行具体操作。我们来看一个基本的使用例子:

package net.schmizz.sshj.examples;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.IOUtils;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.Session.Command;

import java.io.Console;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/** 执行远程命令 */
public class Exec {
    private static final Console con = System.console();

    public static void main(String... args)
            throws IOException {
        final SSHClient ssh = new SSHClient();
        ssh.loadKnownHosts();
        ssh.connect("localhost");
        Session session = null;
        try {
            ssh.authPublickey(System.getProperty("user.name"));
            session = ssh.startSession();
            final Command cmd = session.exec("ping -c 1 toutiao.com");
            con.writer().print(IOUtils.readFully(cmd.getInputStream()).toString());
            cmd.join(5, TimeUnit.SECONDS);
            con.writer().print("n** exit status: " + cmd.getExitStatus());
        } finally {
            try {
                if (session != null) {
                    session.close();
                }
            } catch (IOException e) {
                // 处理异常
            }
            
            ssh.disconnect();
        }
    }

}

这是使用 SSHJ 在远程服务器上执行命令的例子。首先创建一个 SSHClient,再加载 know_hosts,并连接到 localhost 所在的 SSH 服务。然后,使用本机用户名对应的公钥进行 SSH 登录验证,并启动会话。成功建立连接后,使用 session 的 exec 接口在 SSH 服务所在远程执行了一条 ping 命令,并从远程读取命令行输出,返回到本地命令行进行打印。最终,在完成任务后,关闭会话并断开连接。以此为基础可以实现远程命令的程序化实现,把需要手动登录 SSH 并执行命令的过程自动化。

SSHJ 实现了 SCP 安全拷贝协议,用于加密的文件在本地和远程之间拷贝复制。在 SSHClient 连接成功之后,使用 SCPFileTransfer 实现文件的上传和下载:

// SCP下载文件
ssh.newSCPFileTransfer().download("test_file", new FileSystemFile("/tmp/"));

// SCP上传文件
ssh.newSCPFileTransfer().upload(new FileSystemFile(src), "/tmp/");

SSHJ 还实现了 SFTP 安全文件传输协议。与 SCP 相比,SFTP 可靠性高,可断点续传,支持更加广泛的远程文件操作。SSHJ 中使用 SFTPClient 来作为 SFTP 的客户端,在 SSHClient 连接成功后,创建 SFTPClient,并使用 put 和 get 进行上传和下载:

// SFTP下载
final SFTPClient sftp = ssh.newSFTPClient();
try {
    sftp.get("test_file", new FileSystemFile("/tmp"));
} finally {
    sftp.close();
}

// SFTP上传
final SFTPClient sftp = ssh.newSFTPClient();
try {
    sftp.put(new FileSystemFile(src), "/tmp");
} finally {
    sftp.close();
}

利用 SSHJ,我们还就可以很方便地实现一个交互式 SSH 客户端,在本地命令行上实现对远程命令行的交互:

package net.schmizz.sshj.examples;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.StreamCopier;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.Session.Shell;
import net.schmizz.sshj.transport.verification.ConsoleKnownHostsVerifier;
import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts;

import java.io.File;
import java.io.IOException;
import net.schmizz.sshj.common.LoggerFactory;

/** 交互式SSH客户端 */
class RudimentaryPTY {

    public static void main(String... args)
            throws IOException {

        final SSHClient ssh = new SSHClient();

        final File khFile = new File(OpenSSHKnownHosts.detectSSHDir(), "known_hosts");
        ssh.addHostKeyVerifier(new ConsoleKnownHostsVerifier(khFile, System.console()));

        ssh.connect("localhost");
        try {

            ssh.authPublickey(System.getProperty("user.name"));

            final Session session = ssh.startSession();
            try {

                session.allocateDefaultPTY();

                final Shell shell = session.startShell();

                new StreamCopier(shell.getInputStream(), System.out, LoggerFactory.DEFAULT)
                        .bufSize(shell.getLocalMaxPacketSize())
                        .spawn("stdout");

                new StreamCopier(shell.getErrorStream(), System.err, LoggerFactory.DEFAULT)
                        .bufSize(shell.getLocalMaxPacketSize())
                        .spawn("stderr");

                new StreamCopier(System.in, shell.getOutputStream(), LoggerFactory.DEFAULT)
                        .bufSize(shell.getRemoteMaxPacketSize())
                        .copy();

            } finally {
                session.close();
            }

        } finally {
            ssh.disconnect();
        }
    }

}

在这个例子中,使用了会话的 startShell 来启动一个命令行,而不像我们的第一个例子那样创建会话。在此之后,使用 SSHJ 提供的 StreamCopier,进行远程命令行输出流的获取,以及本地输入流的上传,从而完成了一个实时交互的 SSH 命令行。

SSHJ - 功能齐全的Java SSH库

SSH协议与SSHJ库

总结

SSHJ 作为一个使用 Java 语言实现的 SSH 库,其对于 SSH 协议的实现十分全面,包含的特性众多,在其所提供的 SSH 实现的比较中,SSHJ 对于协议和算法的实现覆盖程度很高,是实现 SSH 协议相关代码逻辑和应用的优秀选择。

SSHJ 项目代码质量高,历经数年的开发,项目一直处于活跃的开发和维护状态;项目代码量不大,代码结构设计较好,且提供了丰富的使用例子,值得有兴趣的开发者进行更进一步的学习研究和开源贡献。



Tags:SSHJ - 功能齐全的Java SSH库   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
SSH(Secure Shell,安全外壳协议),是专为远程登录会话和其他网络服务提供安全性的应用层协议。在日常开发中,包括登录远程服务器、远程执行命令脚本、文件传输等,都使用了 SSH 协议...【详细内容】
2020-07-19  Tags: SSHJ - 功能齐全的Java SSH库  点击:(1527)  评论:(0)  加入收藏
▌简易百科推荐
在日常生活或工作中,我们或多或少用过一些非常“冷门”的数码电脑周边配线,比如:USB对拷线、USB延长线、网络延长线&hellip;&hellip;这些配线虽然看似不起眼,但关键时刻却能解决...【详细内容】
2021-12-28  UNITEK优越者    Tags:数据线   点击:(1)  评论:(0)  加入收藏
大家好,我是成都刘老烧,最近两个月升级了8K设备多数的网友都叫我说说每一样产品的优缺点,所以今天这期我们就来聊聊我升级的一些HDMI2.1线,为未来即将要升级8K@60hz和4K@120hz的...【详细内容】
2021-12-28  成都刘老烧    Tags:HDMI   点击:(2)  评论:(0)  加入收藏
首先我们要弄懂什么是“雷电”接口。其实“雷电”本质上和咱们常见的HDMI,DP等一样是一种传输协议的简称,全程英文名叫做Thunderbolt。请注意与其说他是一个接口倒不如说他是...【详细内容】
2021-12-27  小伊评科技    Tags:雷电接口   点击:(10)  评论:(0)  加入收藏
畅谈关于装修的那些事,分享装修的各种经验和知识。大家好,我是畅谈装修,关注我即可了解更多关于装修的那些事!路由器现在已经是居家生活中“不可缺少的伙伴”,没有了它,相信连饭吃...【详细内容】
2021-12-27  畅谈装修    Tags:路由器   点击:(3)  评论:(0)  加入收藏
此前有关厂商销售的显示器上,HDMI 2.1的标示问题闹得沸沸扬扬。按照官方的说法,HDMI 2.0标准已经不存在了,以后只有HDMI 2.1标准,后者的功能是可选的,显示器制造商只要具体说明该...【详细内容】
2021-12-24  超能网    Tags:HDMI   点击:(11)  评论:(0)  加入收藏
声卡本身会包含一个DAC。DAC字面上直接翻译,就是“数字到模拟转换器”。有时候,人们认为声卡的DAC不够好,所以从声卡的数字输出接口,外接独立的DAC,来改善声音。DAC首选的接口是...【详细内容】
2021-12-10  亲爱的客户    Tags:解码器   点击:(15)  评论:(0)  加入收藏
1.为什么要有虚拟内存 在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。 当运行多个程序时,经常会出现以下问题: 1)进程地址空间...【详细内容】
2021-12-08  linux上的码农    Tags:虚拟地址   点击:(21)  评论:(0)  加入收藏
CPU、GPU、FPGA三者能力相加就是芯片的未来!很多粉丝问我,嵌入式方向中的FPGA怎么样?收入如何?前言讲述FPGA前,我们先讲讲当年中兴被制裁的问题。美国前总统特朗普曾经发布过一条...【详细内容】
2021-12-01  一口Linux    Tags:FPGA   点击:(52)  评论:(0)  加入收藏
现在市面上常用的视频线有HDMI线、VGA线、DP线、DVI线,其中HDMI线是用的比较多的,平时直播也有很多朋友会问HDMI相关的问题,今天小泽总结了一些高频的HDMI使用问题,赶紧收藏! 所...【详细内容】
2021-11-25  SAMZHE山泽    Tags:HDMI线   点击:(32)  评论:(0)  加入收藏
本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:殇小辛 apple tv 4K使用近2年了,分享下深度使用体验 整个盒子比想象中小很多,放在电视柜里不占空间,还很好看 遥控器顶部区...【详细内容】
2021-11-09  什么值得买    Tags:Apple TV   点击:(32)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条