您的位置:首页 > 运维架构 > Shell

java方式ssh协议远程调用shell

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

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

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


OrionSSH2

一概述

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


Jar包

wgethttp://172.29.62.152/software/tools/orion-ssh2-214.jar


源码包
wgethttp://172.29.62.152/software/tools/orion-ssh2-214.tar.gz


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


二原理介绍

 SSH协议是建立在应用层和传输层基础上的安全协议,它主要由以下三部分组成,共同实现SSH的安全保密机制。
  传输层协议,它提供诸如认证、信任和完整性检验等安全措施,此外它还可以任意地提供数据压缩功能。通常情况下,这些传输层协议都建立在面向连接的TCP数据流之上。
  用户认证协议层,用来实现服务器的跟客户端用户之间的身份认证,它运行在传输层协议之上。
  连接协议层,分配多个加密通道至一些逻辑通道上,它运行在用户认证层协议之上。
当安全的传输层连接建立之后,客户端将发送一个服务请求。当用户认证层连接建立之后将发送第二个服务请求。这就允许新定义的协议可以和以前的协议共存。连接协议提供可用作多种目的通道,为设置安全交互Shell会话和传输任意的TCP/IP端口和X11连接提供标准方法






验证方式的介绍:

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

RSAkeyfingerprintis98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d

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

$tail-1$HOME/.ssh/known_hostsssh-server.example.com,12.18.429.21ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAIEA06jFqviLMMJ/GaJNhGx/P6Z7+4aJIfUqcVjTGQasS1daDYejcfOAWK0juoD+zS3BsGKKYKPA5Gc5M8v+3NHLbPn1yTpDBgl6UzA0iiMPCbwnOLx61MrBTk+/qJI9kyDaJf4LEY6Chx4IJP0ZN5NmAlCtXQsca3jwFAF72mqPbF8=


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

普通主要使用方式:

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

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


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


三例子使用说明(参考例子Basic.java,PublicKeyAuthentication.java)

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

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

Connectionconn=newConnection(ip);
conn.connect();

<2>登录用户验证

booleanisAuthenticated=conn.authenticateWithPassword(username,password);


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

Sessionsess=conn.openSession();


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

sess.execCommand(command);


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

InputStreamstdout=newStreamGobbler(sess.getStdout());
BufferedReaderbr=newBufferedReader(newInputStreamReader(stdout));


<6>释放资源

sess.close();
conn.close();



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

<1>使用的私钥文件,以及密码短语(如果无密码登录的,是为空的)
Filekeyfile=newFile("~/.ssh/id_rsa");//or"~/.ssh/id_dsa"
StringkeyfilePass="joespass";//willbeignoredifnotneeded

<2>验证时以密钥来代替实际的密码
booleanisAuthenticated=conn.authenticateWithPublicKey(username,keyfile,keyfilePass);

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

3其他使用方式
主要有使用代理,端口转发功能,,使用host-key来验证,可能用的不多
hesei��g@^�_ollectorisnotaffected.ApplicationsmostlikelytobeaffectedbythisissuearethosethatallocateverylargeobjectswhichwouldnotnormallyfitinEden,orthosethatmakeextensiveuseofJNICriticalSections(JNIGet/Release*Critical).

ThisissuewillbefixedinthenextJavaSE6update.

Meanwhile,asaworkaroundtotheissue,usersshoulddisablethisperformanceoptimizationby-XX:-ReduceInitialCardMarks.

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

总结:
JVMcrash时,充分分析JVM自动生成的hs_err_pid.log文件;如果确定是JVM的问题后,去网上google,并且上Sun的官网。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: