一 概述

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


Jar

orion-ssh2-214.jar


源码包

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=

        之后,就是验证登录用户的合法性,一般有以下方式普通主要使用方式:

 

 P.S.关于ssh host key protection,可参考:http://www.symantec.com/connect/articles/ssh-host-key-protection

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

第二种方式(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上(一般存在服务器的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> 登录后,其他步骤一样


其他使用方式

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