春春同学的邮件,发送时间:2010-11-30 (星期二) 10:22 上午

主要作用是可以简单的使用java,以ssh协议,远程登录linux,执行shell命令,或者脚本;可以方便的实现一些特殊的用例,可以持续集成起来,自动的执行

下面简单介绍了前一段时间我学的内容,比较简单,如有什么问题,欢迎提出来

 

Orion SSH2

一 概述

               Orion SSH2 是一个纯 Java 实现的 SSH-2 协议包,可让 Java 程序透过 SSH 协议连接到服务器上执行远程命令和文件传输功能。

 

Jar

wget http://172.29.62.152/software/tools/orion-ssh2-214.jar

 

源码包

wget http://172.29.62.152/software/tools/orion-ssh2-214.tar.gz

 

源码包下有example目录,包含所有最常用的使用方式,下面的说明也是参考这个的。

 

二 原理介绍

       SSH协议是建立在应用层和传输层基础上的安全协议,它主要由以下三部分组成,共同实现SSH的安全保密机制。

     传输层协议,它提供诸如认证、信任和完整性检验等安全措施,此外它还可以任意地提供数据压缩功能。通常情况下,这些传输层协议都建立在面向连接的TCP数据流之上。

     用户认证协议层,用来实现服务器的跟客户端用户之间的身份认证,它运行在传输层协议之上。

     连接协议层,分配多个加密通道至一些逻辑通道上,它运行在用户认证层协议之上。

当安全的传输层连接建立之后,客户端将发送一个服务请求。当用户认证层连接建立之后将发送第二个服务请求。这就允许新定义的协议可以和以前的协议共存。连接协议提供可用作多种目的通道,为设置安全交互Shell会话和传输任意的TCP/IP端口和X11连接提供标准方法

验证方式的介绍:

               第一次连接机器时,服务端会返回host key ,并以fingerprint的形式显示出来,让你确认,如下

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d

               确认能够连接该机器后,会将服务器的host key存到本地文件know_hosts中,以后再次访问时,直接会使用存的host key来验证服务器的合法性

   $ tail -1 $HOME/.ssh/known_hosts   ssh-server.example.com,12.18.429.21 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0     6jFqviLMMJ/GaJNhGx/P6Z7+4aJIfUqcVjTGQasS1daDYejcfOAWK0juoD+zS3BsGKKYKPA     5Gc5M8v+3NHLbPn1yTpDBgl6UzA0iiMPCbwnOLx61MrBTk+/qJI9kyDaJf4LEY6Chx4IJP0     ZN5NmAlCtXQsca3jwFAF72mqPbF8= 

 

               之后,就是验证登录用户的合法性,一般有以下方式

普通主要使用方式:

第一种方式(基于口令的安全验证),只要你知道自己的帐号和口令,就可以登录到远程主机

第二种方式(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上(一般存在服务器的authorized_keys文件中)

 

               之后,就可以通过一个连接,建立多个session(即一个连接,可对应于多个通道),来执行命令,或者脚本。

 

三 例子使用说明(参考例子Basic.javaPublicKeyAuthentication.java

1通过ssh协议,登录机器执行命令或者脚本(注意环境变量,ssh登录只读取shell的配置,即.bashrc

<1>新建一个物理的TCP/IP连接

Connection conn = new Connection(ip);  

conn.connect();        

 

<2>登录用户验证

boolean isAuthenticated = conn.authenticateWithPassword(username, password);  

 

<3>创建一个会话,底层为通道机制,一个连接可以有多个通道,即多个会话

Session sess = conn.openSession();

 

<4>在会话中执行某个命令,或者脚本,一个会话仅支持一次命令的执行。想要执行多个命令的话,可以合成一个复杂命令;或者封装为一个脚本,或者使用多个会话,一个会话一条命令

sess.execCommand(command);

 

<5>读取会话的执行结果,注意有标准输出与错误输出两个

InputStream stdout = new StreamGobbler(sess.getStdout());

BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

 

<6>释放资源

sess.close();

conn.close();             

 

 

2使用公私密钥来ssh用户验证,实现无密码登录

<1>使用的私钥文件,以及密码短语(如果无密码登录的,是为空的)

File keyfile = new File("~/.ssh/id_rsa"); // or "~/.ssh/id_dsa"

String keyfilePass = "joespass"; // will be ignored if not needed

 

<2>验证时以密钥来代替实际的密码

boolean isAuthenticated = conn.authenticateWithPublicKey(username, keyfile, keyfilePass);

 

<3>登录后,其他步骤一样

 

3其他使用方式

主要有使用代理,端口转发功能,,使用host-key来验证,可能用的不多

he sei��g@^�_ollector is not affected. Applications most likely to be affected by this issue are those that allocate very large objects which would not normally fit in Eden, or those that make extensive use of JNI Critical Sections (JNI Get/Release*Critical).  
  • This issue will be fixed in the next Java SE 6 update.  
  • Meanwhile, as a workaround to the issue, users should disable this performance optimization by -XX:-ReduceInitialCardMarks.   

 

 

 

解决方案:通过jdk 增加这个 -XX:-ReduceInitialCardMarks 项,避免这个问题。

  

总结:

JVM crash时,充分分析JVM自动生成的hs_err_pid.log文件;如果确定是JVM的问题后,去网上google,并且上Sun的官网。