春春同学的邮件,发送时间: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连接提供标准方法
![SSH协议中的通道机制和TCP/IP端口转发(转载)](file:///C:\DOCUME~1\KEJU~1.WAN\LOCALS~1\Temp\msohtmlclip1\01\clip_p_w_picpath001.gif)
![SSH协议中的通道机制和TCP/IP端口转发(转载)](file:///C:\DOCUME~1\KEJU~1.WAN\LOCALS~1\Temp\msohtmlclip1\01\clip_p_w_picpath002.gif)
验证方式的介绍:
第一次连接机器时,服务端会返回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.java,PublicKeyAuthentication.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来验证,可能用的不多
- 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的官网。