热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Java应用中嵌入sshd服务

这个应用需要依赖apachemina的子项目sshd,项目主页http:mina.apache.orgsshd-projectindex.html,当前版本号为0.8.0。这里的s

这个应用需要依赖apache mina的子项目sshd,项目主页http://mina.apache.org/sshd-project/index.html,当前版本号为0.8.0。这里的sshd和Linux下的sshd服务在特性上类似,但却是使用纯Java语言实现的,为Java应用提供了自定义ssh协议接入的能力。相关的API使用比较简单,见如下代码样例,API的含义也在注释中做了简单的说明。由于我在家没有Linux环境,因而只在Windows平台做了简单的试验,比如用户登录、校验口令等,但不能体验sftp接入控制的实现。

package com.sftp;
import java.io.IOException;
import java.util.EnumSet;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.Session;
import org.apache.sshd.common.util.OsUtils;
import org.apache.sshd.common.util.SecurityUtils;
import org.apache.sshd.server.FileSystemFactory;
import org.apache.sshd.server.FileSystemView;
import org.apache.sshd.server.PasswordAuthenticator;
import org.apache.sshd.server.SshFile;
import org.apache.sshd.server.keyprovider.PEMGeneratorHostKeyProvider;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.session.ServerSession;
import org.apache.sshd.server.shell.ProcessShellFactory;
public class SshdServer {
public static void main(final String[] args) throws Exception {
final SshServer sshd = SshServer.setUpDefaultServer();// 工厂方法,使用默认属性创建ssh服务对象
if (SecurityUtils.isBouncyCastleRegistered()) {// 保存会话安全校验信息,key.pem和key.ser为文件名
sshd.setKeyPairProvider(new PEMGeneratorHostKeyProvider("key.pem"));
}
else {
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("key.ser"));
}
if (OsUtils.isUNIX()) { // 在Unix环境下,使用系统自带的sh来执行命令
sshd.setShellFactory(new ProcessShellFactory(new String[] { "/bin/sh", "-i", "-l" }, EnumSet
.of(org.apache.sshd.server.shell.ProcessShellFactory.TtyOptions.ONlCr)));
}
else { // 在Windows平台下,只能使用标准的cmd命令
sshd.setShellFactory(new ProcessShellFactory(new String[] { "cmd.exe " }, EnumSet.of(
org.apache.sshd.server.shell.ProcessShellFactory.TtyOptions.Echo,
org.apache.sshd.server.shell.ProcessShellFactory.TtyOptions.ICrNl,
org.apache.sshd.server.shell.ProcessShellFactory.TtyOptions.ONlCr)));
}

// 在Windows平台,如果安装了Cygwin,还可以使用如下的调用,把用户的输入委托给Cygwin的shell
sshd.setShellFactory(new ProcessShellFactory(new String[] { "D:\\cygwin\\bin\\bash", "-i", "-l" }));
sshd.setPasswordAuthenticator(new PasswordAuthenticator() { // 使用用户名和口令方式,自定义对接入用户的校验
public boolean authenticate(final String username, final String password, final ServerSession serversession) {

// 我本地的测试代码只是为了演示使用方法,所以只是简单实现,对于一切来访用户都大开绿灯
return true;
}
});
sshd.setHost("127.0.0.1");// 指定提供ssh服务的IP
sshd.setPort(2022); // 指定ssh服务的端口,为了避免影响系统的服务,这里使用了自定义的2022端口
sshd.setFileSystemFactory(new FileSystemFactory() {// 如果需要使用ssh协议来提供文件下载、上传能力,则需要实现FileSystemFactory和SshFile接口
public FileSystemView createFileSystemView(final Session session) throws IOException {
return new FileSystemView() {
public SshFile getFile(final SshFile sshfile, final String s) {
return null;
}
public SshFile getFile(final String s) {
return null;
}
};
}
});
sshd.start();// 启动ssh服务
}
}

使用自定义的ssh服务有如下几点好处:

1、不需要创建操作系统的账号。在Linux环境下,如果要使用默认的ssh服务,事先需要创建一个操作系统的账号,这样存在安全隐患,对于心存恶意的来访者,系统被攻破只是时间问题;

2、可以通过实现FileSytemFactory接口和SshFile接口控制来访用户通过sftp访问到的目录及文件列表,避免来访者对无权路径的访问;

不过这个项目当前版本号为0.8.0,可以说非常年轻,在商用的产品中使用时,需要考虑风险。


推荐阅读
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • JComponentJLabel的setBorder前言用例2205262241前言setBorder(Border边框)实现自JComponentjava.awt.Insets ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • `chkconfig` 命令主要用于管理和查询系统服务在不同运行级别中的启动状态。该命令不仅能够更新服务的启动配置,还能检查特定服务的当前状态。通过 `chkconfig`,管理员可以轻松地控制服务在系统启动时的行为,确保关键服务正常运行,同时禁用不必要的服务以提高系统性能和安全性。本文将详细介绍 `chkconfig` 的各项参数及其使用方法,帮助读者更好地理解和应用这一强大的系统管理工具。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
author-avatar
美甲控Alily
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有