`
歆渊
  • 浏览: 303526 次
  • 性别: 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长期运行带来的负面影响。

相关推荐

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    学生成绩管理系统(SSH+MYSQL).zip.tar.gz

    通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 Servlet全称“Java Servlet”,中文意思为小服务程序或服务连接器,是运行在Web服务器或应用服务器上的...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    企业费用管理系统(SSH+Oracle).zip.tar.gz

    通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 Servlet全称“Java Servlet”,中文意思为小服务程序或服务连接器,是运行在Web服务器或应用服务器上的...

    龙门物流管理系统(Ext+SSH)130221.rar.tar.gz

    通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 Servlet全称“Java Servlet”,中文意思为小服务程序或服务连接器,是运行在Web服务器或应用服务器上的...

    学生成绩管理系统(SSH+MYSQL)130221.rar.tar.gz

    通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 Servlet全称“Java Servlet”,中文意思为小服务程序或服务连接器,是运行在Web服务器或应用服务器上的...

    java流程自动化工具

    二、环境搭建:以java应用来讲,比如安装jdk,tomcat,zookeeper,mq,hbase,mysql等等都可以实现自动化。 三、应用部署:GIT代码拉取,MAVEN打包,SFTP上传,Linux脚本执行,自动化一气呵成,且轻松实现切换用户等...

    java开源包2

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包7

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

Global site tag (gtag.js) - Google Analytics