`
歆渊
  • 浏览: 308444 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

通过SSH的交互式Java应用开发和管理

    博客分类:
  • Java
阅读更多
BSD License, 需要 JDK 6.0 或者 JRE 6.0 + OpenJDK Javac 运行.
附件为代码包 (请到 http://sjsh.dev.java.net 下载最新代码包, 此处附件以后不再更新)

参照代码包中 demo/src 目录下的示例, 就可以很简单的写成包装自己应用对象的 SSH Server 了

启动演示 SSH Shell Server
引用


D:\workspace\SecureJSH>ant demo
Buildfile: build.xml

build:

compile-demo:

run-java-demo:
     [java] SSH-2.0-SJSHD-1.0: Generating an authorized key for user 'sjsh'...
     [java] SSH-2.0-SJSHD-1.0: New authorized private key for user 'sjsh' stored to D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\id_rsa
     [java] SSH-2.0-SJSHD-1.0: Updated authorized public keys for user 'sjsh' stored to D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\authorized_keys
     [java] SSH-2.0-SJSHD-1.0(@localhost/127.0.0.1:22022): Starting...
     [java] SSH-2.0-SJSHD-1.0: Generating Host DSA Key...
     [java] SSH-2.0-SJSHD-1.0: Host DSA Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_dsa_key
     [java] SSH-2.0-SJSHD-1.0: Host DSA Public Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_dsa_key.pub
     [java] SSH-2.0-SJSHD-1.0: Generating Host RSA Key...
     [java] SSH-2.0-SJSHD-1.0: Host RSA Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_rsa_key
     [java] SSH-2.0-SJSHD-1.0: Host RSA Public Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_rsa_key.pub
     [java] SSH-2.0-SJSHD-1.0(@localhost/127.0.0.1:22022): Started.
     [java] Now you can login using an SSH client, with:
     [java]  User Name: sjsh
     [java]  Private Key: D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\id_rsa
     [java]
     [java] Type in anything to stop:


然后通过任意SSH客户端连接上去:
(注意OpenSSH客户端需要更改 SJSH-Root\home\sjsh\.ssh\id_rsa 的权限属性为 600, 其他客户端不支持PEM格式私钥的需要转换其格式,  PuTTY 带的 PUTTYGEN 工具转换比较好用)

引用

Using username "sjsh".
Authenticating with public key "imported-openssh-key"

This is an interactive Java(TM) shell, type in Java(TM)
statements to get them executed.

Type in Ctrl^D to logout.

Type in ? or help for a list of available commands.

Type in <Tab> to complete commands.

Use UP/DOWN arrow keys for command history.

Here you are in the demo shell.

There are two demo built-in commands: 'msg' and 'msgs',
and one built-in field: 'msgs', those are added by this demo.

Try them out and write your own shell similarly.

SecueJSH Java(TM) Compiler Ready.

[jsh ]$ ?
Built-in commands:

class <class-name> +<class-code>
   Start defining a new class in current package
def <field-name> [ <type> [<comment> | -] | - ]
   Define a field that persists across statements
feedback [ on | off ]
   Control display of feedbacks
fields
   Show all fields currently defined
import <package-name>.* | static <qualified-class-name>.*
   Add an import
imports
   Show all imports in current import list
lineNo [ on | off ]
   Control display of line numbers
msg <message> | +<multi-line message>
   Leave a message
msgs
   Show all messages in demo shell 'msgs' list
package [ <package-name> ]
   Specify current package
preview [ on | off ]
   Control display of previews
redef <field-name> [ <type> [<comment> | -] | - ]
   Redefine a field that persists across statements
undef <field-name>
   Undefine an existing field
unimport <existing-import> | *
   Remove specified import

Type in:   help | ? <cmd-name> [<topic>]
for more details of a built-in command.

The following built-in methods:
  void javap(Class<?> c); void javap(Class<?> c,int depth);
  void javap(Object o); void javap(Object o,int depth);
can be used to examine the structure of any Java class (of an
Java object), where <depth> specifies how many classes up the
inheritance hierarchy should be printed, 0 for infinite.

Type in:   javap(this);
to see all built-in methods and fields listed.

[jsh ]$ fields
// builtin
protected java.util.Map<java.lang.String, java.lang.String> env; //= {USER=sjsh, SSH_CLIENT=127 ...
// builtin
protected java.io.PrintWriter out; //= java.io.PrintWriter@cfad31
// builtin
protected java.io.PrintWriter err; //= java.io.PrintWriter@73a5d3
// All Messages
protected java.util.Vector<java.lang.String> msgs; //= []

[jsh ]$ javap(this);
public class $JSH$
--- Constructors:
- public $JSH$()
--- Methods:
- public void run()
--- Fields:
- protected java.util.Vector<java.lang.String> msgs
extends public abstract class sjsh.jsh.JSHRunner
  implements java.lang.Runnable
--- Constructors:
- public JSHRunner()
--- Methods:
- public java.lang.String getEnv(java.lang.String)
- public void javap(java.lang.Object,int)
- public void javap(java.lang.Class<?>)
- public void javap(java.lang.Object)
- public void javap(java.lang.Class<?>,int)
- public void println(java.lang.Object)
- public void println()
- public void print(java.lang.Object)
- public java.io.PrintWriter printf(java.lang.String,java.lang.Object[])
--- Fields:
- protected java.util.Map<java.lang.String, java.lang.String> env
- protected java.io.PrintWriter out
- protected java.io.PrintWriter err

[jsh ]$ for(Map.Entry<Object,Object> en : System.getProperties().entrySet())
002: printf("%s = %s\n", en.getKey(), en.getValue());
java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = C:\Java\jdk1.6.0_02\jre\bin
java.vm.version = 1.6.0_02-b05
ant.library.dir = D:\apps\apache-ant-1.7.0\lib
java.vm.vendor = Sun Microsystems Inc.
  .....
java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist =

[jsh ]$


分享到:
评论
5 楼 pf8123829456 2017-11-09  
你好,文中的地址访问不了,我想下载个最新的包,能给我发个或者给我个地址吗?谢谢。
4 楼 歆渊 2007-07-26  
joker23 写道
博主你好。关于这个项目不知道你熟悉吗,有些问题想请教你。我现在运行起这个项目的demo,但是使用SecureCrt无法指定公钥文件链接到server程序,希望博主能指点一二。另外如果我希望把认证方式改为传统的user/password方式,不知道这个项目是否实现了这种认证方式。


SecureCRT 我没怎么用过, 不过如果是认证的话应该是用自动生成的私钥文件, 默认是 SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\id_rsa , 这个文件是 OpenSSH 兼容的 PEM 格式私钥, 要看 SecureCRT 是否支持这种格式, 如果不支持的话需要进行转换. 不过 OpenSSH 和 SSH.COM 的转换工具似乎都只能转换公钥, 不转换私钥, 我所知道的只有 PuTTY 附带的 PUTTYGEN 工具可以转换私钥.

按说作为SSH工具 SecureCRT 应该支持认证用 公/私 钥对 的生成, 如果这样的话不妨新生成一对密钥用作认证就可以了. SecureJSH 是完全兼容 OpenSSH Server 的密钥文件存储格式的, 所以只要参考 SecureCRT 的文档, 把 SecureJSH 当作 OpenSSH Server, 向 SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\authorized_keys 文件中添加一行公钥信息应该就可以了.

password认证的支持在 SecureJSH 中有所考虑, 目前觉得比较理想的是读取 UNIX passwd/shadow 格式的密码信息, 但是鉴于这个格式目前没有一个公开统一的标准可以在Java程序中实现, 暂时没有去实现. 而是考虑在后续版本中通过 JAAS 支持包括 password 在内的更多认证方式.

当然这是官方维护的SecureJSH的计划, 它是BSD License发行的, 所以如果你觉得有必要, 完全可以自己写点代码加入类似功能, 然后发布给你的用户. 在 ecureJSH\src\sjsh\sshd\auth\SSHStage.java 128 行左右可以看到这个方法:

    public PasswordAuthResult authenticateUser(String userName,
        char[] password, char[] newPassword)
    {
        // TODO implement password authentication, consider JAAS for it
        return PasswordAuthResult.FAILURE;
    }


在这里加入你的代码校验用户密码就可以了.
3 楼 taiwen 2007-07-26  
对SecureJSH的深入报道可以参加InfoQ中文站的一篇新闻:
Java交互管理工具——SecureJSH发布
2 楼 joker23 2007-07-26  
博主你好。关于这个项目不知道你熟悉吗,有些问题想请教你。我现在运行起这个项目的demo,但是使用SecureCrt无法指定公钥文件链接到server程序,希望博主能指点一二。另外如果我希望把认证方式改为传统的user/password方式,不知道这个项目是否实现了这种认证方式。
1 楼 Tin 2007-07-20  
!!!以下是对项目的介绍的中文翻译!!!
SecureJSH允许Java编写的服务器端应用程序为管理员、客户、开发者和客户端服务提供一个安全shell,这里可以交互性的让Java语言逐句的运行。
SecureJSH需要JDK 6.0或者JRE 6.0加JAVAC(在classpath中)来运行。

安全:
SecureJSH在服务器端实现了RFC-4251,SSH 2.0协议,支持公钥认证,这种方式方便安全(不需要每次输入密码)。

交互式执行:
传统的方式下,在运行Java源代码之前你必须将它们编译为bytecode。但是使用SecureJSH,编译的过程是透明完成的,所以你只需要随意输入一些Java表达式(就可以运行)。这意味着你可以使用你书写应用程序时完全相同的语法,与最新的Java语言规范同步。你可以在你的Java项目源码和SecureJSH终端里面拷贝&粘贴任何代码,都没有问题。

智能命令识别,UNIX Shell风格
不像JSR-223(Java Scripting Engin,Java脚本引擎)对Java语言的脚本的支持,在(Java脚本引擎)里面你必须将Java类的全部代码输入后才可以执行,SecureJSH更加智能和人性化,如果你输入了不完整的Java表达式它会自动提示你进行多行的输入,然后将这些表达式包装到一个预先定义的类结构中来执行。它是一个真正的Shell。

没有相互干扰,最小化资源消耗
SecureJSH没有需要储存在JVM范围的静态资源,每一个实例只消耗很少量的资源(基于NIO实现,所有的SSH通讯都由一个线程处理)。你可以按照你的想法在一个JVM里面运行任意多个shell服务,包括Java应用程序服务器的JVM。

长远规划
因为在当代的JVM里面,类载入还是一个昂贵的操作(消耗持久生成的堆区域),SecureJSH意图实现一个在当前JVM之上运行的JVM来直接(on-the-fly)的运行bytecode,而不需要使用类载入。这样可能会比在主JVM上运行要慢很多,但是对于交互会话来说已经足够了,特别是考虑到这样可以摆脱类载入对主JVM长期运行带来的负面影响。

相关推荐

    SSH员工管理系统

    总的来说,SSH员工管理系统是一个集成了多种技术的实战项目,它可以帮助开发者深入理解SSH框架的运用,提升Java Web开发技能,同时也是学习数据库设计和企业级应用开发的优秀案例。通过这个项目,我们可以学习到如何...

    java ssh练习题

    **JSP(JavaServer Pages)** 是一种动态网页技术,用于创建交互式的Web应用。JSP页面可以包含HTML、CSS、JavaScript,以及嵌入的Java代码,这些Java代码在服务器端执行,生成HTML响应给客户端。 在"java ssh练习题...

    JAVA源码 jsp源代码程序 代码 SSH框架 easyui 进销存管理系统

    SSH框架是Java Web应用开发中的经典组合,提供了模型-视图-控制器(MVC)设计模式的实现,便于开发者构建高效、可维护的系统。 【描述】"JAVA源码 jsp源代码程序 代码 SSH框架 easyui 进销存管理系统"表明这是一个...

    基于Java ssh框架开发的库存管理系统(Hibernate、 struts2、 spring、 jquery)

    在库存管理系统的前端,jQuery 可以提升用户体验,比如实现动态加载库存数据、表单验证和交互式图表等。 在基于 Java SSH 开发的库存管理系统中,通常会有以下组件和功能: - **用户认证和授权**:使用 Spring ...

    教师登记管理系统(JAVA SSH框架)

    Hibernate是SSH中的持久层框架,它简化了Java应用程序与数据库之间的交互。通过ORM(Object-Relational Mapping)技术,Hibernate允许开发者使用Java对象来操作数据库记录,无需关心SQL的具体实现,极大地提高了开发...

    基于SSH框架与jQuery技术的JavaWeb开发应用

    这种结合了后端技术和前端技术的开发方式正逐渐成为现代Web应用开发的标准之一。未来,随着技术的不断进步和发展,这些框架和技术将会进一步完善,为企业级应用的开发带来更多的便利和可能性。 通过以上分析,可以...

    JSF+SSH开发应用实例

    2. **Spring框架**: Spring是Java企业级应用的核心框架,提供了依赖注入(DI)和面向切面编程(AOP)等特性,简化了应用程序的开发和管理。Spring还提供了对数据库访问的支持,以及事务管理、安全控制等功能。在JSF+...

    java web课程设计+ssh

    总结来说,这个Java Web课程设计旨在让学生掌握SSH框架的使用,理解其在实际开发中的优势,为未来从事企业级应用开发打下坚实基础。通过实践,学生不仅能学习到Web开发的基本流程,还能体会到框架带来的便捷性,提高...

    基于extjs、ssh注解式开发的学生简易管理系统

    【标题】"基于ExtJS、SSH注解式开发的学生简易管理系统"揭示了这个项目的核心技术栈,它结合了两种在Web应用开发中的流行框架:前端的ExtJS和后端的Spring、Struts2以及Hibernate(SSH)框架。ExtJS是一个强大的...

    java web ssh开发常用jar包

    2. **Spring**:Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(DI)、面向切面编程(AOP)和声明式事务管理等功能。常用的Spring相关jar包包括: - `spring-beans.jar`:包含Bean工厂和依赖注入的...

    SSH论坛(java)

    SSH框架是Java开发中的常用组合,尤其在企业级应用开发中,因其强大的功能和灵活性而备受青睐。在这个SSH论坛项目中,数据库管理系统选择的是MySQL,这是一款广泛使用的开源关系型数据库,以其高效、稳定和易用性...

    SSH.rar_javassh

    其中包含的SSH.pdf可能是一份详细的教学文档,涵盖了如何在Java应用程序中使用SSH框架进行开发的各个方面。 首先,JAVAssh框架教程可能会介绍SSH的基本概念和工作原理,包括公钥/私钥认证、密码认证以及SSH隧道的...

    java SSH项目 hibernate annotation

    综上所述,Java SSH项目结合了Struts、Spring和Hibernate的优势,为复杂的企业级Web应用提供了强大而灵活的开发框架。Hibernate注解的使用简化了数据库配置,提高了开发效率,是现代Java开发中常见的技术栈选择。

    ssh+ext龙门物流管理系统

    "SSH+EXT龙门物流管理系统"是一个基于特定技术栈构建的物流行业应用,主要利用Spring、Struts和Hibernate(SSH)三大框架以及EXT前端组件库。这个系统提供了完整的源码和数据库,用户可以直接导入并运行,方便进行二...

    Java ssh经典源码,集成Bootstrap框架开发的HR人事管理系统

    总结来说,这个项目是一个集成了Java SSH和Bootstrap的典型Web应用实例,它展示了如何将后端的业务逻辑处理、数据库操作与前端的用户界面设计有效结合,以实现一个完整的人力资源管理系统。这样的系统对于学习和理解...

    JAVA 开发龙门物流管理系统(Ext+SSH).zip

    综上所述,"JAVA 开发龙门物流管理系统(Ext+SSH)"是一个综合运用了多种Java技术的实践项目,涵盖了从前端界面设计到后端业务逻辑处理的全过程,对于学习和理解Java企业级应用开发具有很高的参考价值。通过这个项目,...

    java实现模拟SSH和telnet登陆(实现命令的发送和接受)

    Java 实现模拟 SSH 和 Telnet 登陆,以及发送与接收命令是网络编程中常见的需求,主要应用于自动化测试、远程系统管理或数据交换等场景。在本文中,我们将深入探讨如何利用 Java 实现这一功能。 首先,SSH(Secure ...

    基于ssh客房信息管理系统

    在这个基于SSH的客房信息管理系统中,这三个框架协同工作,实现了对客房数据的有效管理和交互。 1. **Struts2**:作为MVC(模型-视图-控制器)架构的一部分,Struts2负责处理HTTP请求,并将这些请求映射到相应的...

    ssh常用工具类

    在IT行业中,SSH(Secure Shell)通常指的是用于安全远程登录和数据传输的网络协议,而这里提到的"ssh常用工具类"可能是指一系列Java编程语言编写的类库,用于简化SSH相关的操作。以下是对这些文件名所暗示的类及其...

    基于Java SSH框架,easyui 开发的进销存管理系统

    在进销存系统中,Spring负责业务逻辑的组织和管理,以及与数据库的交互。 2. **Struts**:作为MVC(模型-视图-控制器)架构的一部分,Struts处理HTTP请求,管理用户界面与业务逻辑之间的交互。它定义了请求的处理...

Global site tag (gtag.js) - Google Analytics