浏览 14086 次
锁定老帖子 主题:通过SSH的交互式Java应用开发和管理
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-11
附件为代码包 (请到 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 ]$ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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长期运行带来的负面影响。 |
|
返回顶楼 | |
发表时间:2007-07-26
博主你好。关于这个项目不知道你熟悉吗,有些问题想请教你。我现在运行起这个项目的demo,但是使用SecureCrt无法指定公钥文件链接到server程序,希望博主能指点一二。另外如果我希望把认证方式改为传统的user/password方式,不知道这个项目是否实现了这种认证方式。
|
|
返回顶楼 | |
发表时间:2007-07-26
|
|
返回顶楼 | |
发表时间: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; } 在这里加入你的代码校验用户密码就可以了. |
|
返回顶楼 | |