热门标签 | 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,可以说非常年轻,在商用的产品中使用时,需要考虑风险。


推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
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社区 版权所有