Java 交互管理工具——SecureJSH 发布

  • 田乐

2007 年 7 月 26 日

话题:Java安全语言 & 开发架构

JavaEye 上活跃的开发者 Complystill(歆渊)最近发布了自己的开源SecureJSH 项目,提供了一个通过 SSH 交互进行 Java 应用开发或者管理的工具。

在项目的介绍中可以得知,SecureJSH 与 Ptyhon 里面的 ipython 或者 Ruby 里面的 irb 非常相似。它们都允许交互式运行语言的代码,以方便跟踪或者调试应用。但是,Java 与 Ruby、Python 不同,后者是动态脚本语言,它们天生具有解释执行的特点(注意:当然 Python 支持预编译,Ruby 也将在 YARV 中开始支持,这里指它们的解释执行状态)。我们常见的 Python 和 Ruby 发行版本基本上都包括自己的解释器(这也是它们的核心组件),但是 Java 是一种需要中间编译过程的语言,默认情况下它无法直接解释运行,也没有相应的解释器。

那么 SecureJSH 是如何实现的呢?读者首先会想到 JSR-223,这个 API 可以自己扩展脚本语言支持,比如 rhino 是 Javascript 解释引擎。但是使用它难以实现交互操作,因为它必须输入一个相对完整的脚本才可以运行,这样会丧失一部分交互性。SecureJSH 实际上是使用了 JDK 6.0 的新特性 Java Compiler API(JSR-199),它提供了一组 API 来让程序可以动态地访问 Java 编译器的接口,这样就可以使用 Java 编译器动态检查代码语法或者动态根据 Java 源码生成可以执行的字节码。这种方式与 ASM 的编程直接生成字节码不同,它能直接将 Java 源码转换为字节码,XRuby 的主力开发者郑晔(网名 dreamhead)在他的 Blog 中这样对比了两种方案

之前,刚刚在 Blog 中提到 ASM,里面的代码生成工作是通过直接写 字节码完成的。现在有了 Compiler API,可以考虑生成代码以 Java 源码的形式完成,然后,通过调用 Compiler API 对源码进行动态编译,这样,可以达到同直接写字节码类似的作用。使用 Compiler API,肯定不如直接生成字节码来得高效,但对于不了解 JVM 指令的人来说这也许是一种解决方案。

可见 JSR-199 不是最高效的字节码生成方案,但是更方便使用。Java Compiler API 不是为了取代 ASM 这样的方案的,它的本意是以编程的方式实现实时编译及信息反馈。Java 目前的主要架构师之一 Peter von der Ahé曾经在他的 Blog 对谁需要使用 Java Compiler API 这个问题做了如下解释

99% 的 Java 开发者都不需要了解 Java Compiler API。只有少数的开发者会直接应用这个 API。但是 IDE、Java EE 应用程序服务器、Maven 或者 Ant 还有测试框架的开发者却不一样,他们有一个共同点,就死需要调用编译器将 Java 源码转换为类文件(他们是这个 API 的潜在用户)。

可见 JSR-199 的产生主要是面向热部署或者增量编译这样的场合,但是 SecureJSH 的产生扩展了 Java Compiler API 的应用场景,同时也增强了 Java 和 JVM 的交互性。Complystill 这样介绍了SecureJSH 的应用场景和需求

SecureJSH 允许 Java 编写的服务器端应用程序为管理员、客户、开发者和客户端服务提供一个安全 shell,这里可以交互性地让 Java 语言逐句运行。SecureJSH 需要 JDK 6.0 或者 JRE 6.0 加 JAVAC(在 classpath 中)来运行。
SecureJSH 的官方首页这样描述了它的主要特性:
  • 安全:SecureJSH 在服务器端实现了 RFC-4251,SSH 2.0 协议,支持公钥认证,这种方式方便安全(不需要每次输入密码)。
  • 交互式执行:传统的方式下,在运行 Java 源代码之前你必须将它们编译为字节码。但是使用 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。

作为一个开源项目,SecureJSH 使用了 ganymed 的纯 Java 实现的 SSH 2.0 库,并使用 Java NIO 编写了网络服务,代码质量很高。据 Comply Still 介绍,SecureJSH 最初是为内存数据库 TOB 设计的,为这个面向对象数据库提供交互访问的接口,但是后来作者发现它可以被应用在很多场合,所以单独开源发布。作为 Java 开发者,您可以从这里下载源码从中学习 SSH 2.0、NIO 网络服务、Java Compiler API 的使用方法,相信一定会有所收获。

Java安全语言 & 开发架构