java通过ssh连接服务器执行shell命令详解及实例

  

<强> java通过ssh连接服务器执行shell命令详解

  

<强> java通过ssh连接服务器执行shell命令:JSch是SSH2的一个纯java实现。它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中,同时该项目也提供一个J2ME版本用来在手机上直连sshd服务器。
  

  

SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议. SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接. SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基于密码的认证比较简单,只要知道远程主机的用户名和密码,就可以进行登录。基于密匙的认证比较麻烦,而且连接比较耗时,这里不详细介绍。

  

有很多基于SSH协议的客户端,例如:腻子,OpenSSH, Xshell 4等,可以远程连接几乎所有UNIX平台,同时,可以通过Linux命令行SSH uername@host连接到某主机。

  

在项目中,如何利用代码实现SSH,远程执行Shell脚本呢? JSch是Java安全通道的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考JSch官网。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包:jsch-0.1.50.jar。

  

示例程序

        包com.stormma.demo;      进口java.io.BufferedReader;   进口java.io.InputStreamReader;   进口java.util.ArrayList;      进口com.jcraft.jsch.Channel;   进口com.jcraft.jsch.ChannelExec;   进口com.jcraft.jsch.JSch;   进口com.jcraft.jsch.JSchException;   进口com.jcraft.jsch.Session;      公共类壳{//远程主机的ip地址   私人字符串ip;//远程主机登录用户名   私人字符串的用户名;//远程主机的登录密码   私人密码字符串;//设置ssh连接的远程端口   公共静态最终int DEFAULT_SSH_PORT=22;//保存输出内容的容器   私人ArrayList标准输出;/* *   *初始化登录信息   * @param ip   * @param用户名   * @param密码   */公共Shell(最终字符串ip,最终字符串的用户名,最终字符串密码){   这一点。ip=ip;   这一点。用户名=用户名;   这一点。密码=密码;   stdout=new ArrayList ();   }/* *   *执行shell命令   * @param命令   * @return   */公共int(最终字符串执行命令){   int returnCode=0;   JSch JSch=new JSch ();   MyUserInfo用户信息=new MyUserInfo ();      尝试{//创建会话并且打开连接,因为创建会议之后要主动打开连接   会话=jsch会话。getSession(用户名、ip DEFAULT_SSH_PORT);   session.setPassword(密码);   session.setUserInfo(用户信息);   session.connect ();//打开通道,设置通道类型,和执行的命令   频道频道=session.openChannel(“执行”);   ChannelExec ChannelExec=(ChannelExec)通道;   channelExec.setCommand(命令);      channelExec.setInputStream(空);   BufferedReader输入=new BufferedReader(新InputStreamReader   (channelExec.getInputStream ()));      channelExec.connect ();   system . out。println(“远程命令是:”+命令);//接收远程服务器执行命令的结果   字符串行;   在((=input.readLine行())!=null) {   stdout.add(线);   }   input.close ();//得到returnCode   如果(channelExec.isClosed ()) {   returnCode=channelExec.getExitStatus ();   }//关闭通道   channelExec.disconnect ();//关闭会话   session.disconnect ();      }捕捉(JSchException e) {//TODO自动生成的catch块   e.printStackTrace ();   }捕捉(异常e) {   e.printStackTrace ();   }   返回returnCode;   }/* *   *把stdout   * @return   */公共ArrayListgetStandardOutput () {   返回标准输出;   }      最后公共静态void main (String [] args) {   壳壳=新的Shell (“xxx.xxx.xxx。xxx”、“用户名”、“密码”);   壳。执行(“uname - s - r - v”);      ArrayListstdout=shell.getStandardOutput ();   (字符串str: stdout) {   System.out.println (str);   }   }   }      之前      

MyUserInfo         包com.stormma.demo;      进口com.jcraft.jsch.UserInfo;      公共类MyUserInfo实现用户信息{      @Override   公共字符串getPassphrase () {//TODO自动生成方法存根   System.out.println (“MyUserInfo.getPassphrase () ");   返回null;   }      @Override   公共字符串getPassword () {//TODO自动生成方法存根   System.out.println (“MyUserInfo.getPassword () ");   返回null;   }      @Override   公共布尔promptPassphrase(字符串arg0) {//TODO自动生成方法存根   System.out.println (“MyUserInfo.promptPassphrase () ");   System.out.println (arg0);   返回错误;   }      @Override   公共布尔promptPassword(字符串arg0) {//TODO自动生成方法存根   System.out.println (“MyUserInfo.promptPassword () ");   System.out.println (arg0);   返回错误;   }      @Override   公共布尔promptYesNo(字符串arg0) {//TODO自动生成方法存根的   System.out.println (“MyUserInfo.promptYesNo () ");   System.out.println (arg0);   如果(arg0)。包含(“宿主”的真实性)){   返回true;   }   返回true;   }      @Override   公共空间showMessage(字符串arg0) {//TODO自动生成方法存根   System.out.println (“MyUserInfo.showMessage () ");   }      }   

java通过ssh连接服务器执行shell命令详解及实例