欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-07 22:11:45
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:jsch 是ssh2的一个纯java实现。它允许你连接到一个sshd...

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

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

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

有很多基于ssh协议的客户端,例如:putty、openssh、xshell 4等,可以远程连接几乎所有unix平台。同时,可以通过linux命令行ssh uername@host连接到某主机。

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

示例程序

package com.stormma.demo;
 
import java.io.bufferedreader;
import java.io.inputstreamreader;
import java.util.arraylist;
 
import com.jcraft.jsch.channel;
import com.jcraft.jsch.channelexec;
import com.jcraft.jsch.jsch;
import com.jcraft.jsch.jschexception;
import com.jcraft.jsch.session;
 
public class shell {
  //远程主机的ip地址
  private string ip;
  //远程主机登录用户名
  private string username;
  //远程主机的登录密码
  private string password;
  //设置ssh连接的远程端口
  public static final int default_ssh_port = 22; 
  //保存输出内容的容器
  private arraylist<string> stdout;
 
  /**
   * 初始化登录信息
   * @param ip
   * @param username
   * @param password
   */
  public shell(final string ip, final string username, final string password) {
     this.ip = ip;
     this.username = username;
     this.password = password;
     stdout = new arraylist<string>();
  }
  /**
   * 执行shell命令
   * @param command
   * @return
   */
  public int execute(final string command) {
    int returncode = 0;
    jsch jsch = new jsch();
    myuserinfo userinfo = new myuserinfo();
 
    try {
      //创建session并且打开连接,因为创建session之后要主动打开连接
      session session = jsch.getsession(username, ip, default_ssh_port);
      session.setpassword(password);
      session.setuserinfo(userinfo);
      session.connect();
 
      //打开通道,设置通道类型,和执行的命令
      channel channel = session.openchannel("exec");
      channelexec channelexec = (channelexec)channel;
      channelexec.setcommand(command);
 
      channelexec.setinputstream(null);
      bufferedreader input = new bufferedreader(new inputstreamreader
          (channelexec.getinputstream()));
 
      channelexec.connect();
      system.out.println("the remote command is :" + command);
 
      //接收远程服务器执行命令的结果
      string line;
      while ((line = input.readline()) != null) { 
        stdout.add(line); 
      } 
      input.close(); 
 
      // 得到returncode
      if (channelexec.isclosed()) { 
        returncode = channelexec.getexitstatus(); 
      } 
 
      // 关闭通道
      channelexec.disconnect();
      //关闭session
      session.disconnect();
 
    } catch (jschexception e) {
      // todo auto-generated catch block
      e.printstacktrace();
    } catch (exception e) {
      e.printstacktrace();
    }
    return returncode;
  }
  /**
   * get stdout
   * @return
   */
  public arraylist<string> getstandardoutput() {
    return stdout;
  }
 
  public static void main(final string [] args) { 
    shell shell = new shell("xxx.xxx.xxx.xxx", "username", "password");
    shell.execute("uname -s -r -v");
 
    arraylist<string> stdout = shell.getstandardoutput();
    for (string str : stdout) { 
      system.out.println(str); 
    } 
  } 
}

myuserinfo

package com.stormma.demo;
 
import com.jcraft.jsch.userinfo;
 
public class myuserinfo implements userinfo {
 
  @override
  public string getpassphrase() {
    // todo auto-generated method stub
    system.out.println("myuserinfo.getpassphrase()");
    return null;
  }
 
  @override
  public string getpassword() {
    // todo auto-generated method stub
    system.out.println("myuserinfo.getpassword()");
    return null;
  }
 
  @override
  public boolean promptpassphrase(string arg0) {
    // todo auto-generated method stub
    system.out.println("myuserinfo.promptpassphrase()");
    system.out.println(arg0);
    return false;
  }
 
  @override
  public boolean promptpassword(string arg0) {
    // todo auto-generated method stub
    system.out.println("myuserinfo.promptpassword()"); 
    system.out.println(arg0);
    return false;
  }
 
  @override
  public boolean promptyesno(string arg0) {
    // todo auto-generated method stub'
     system.out.println("myuserinfo.promptyesno()"); 
     system.out.println(arg0); 
     if (arg0.contains("the authenticity of host")) { 
       return true; 
     } 
    return true;
  }
 
  @override
  public void showmessage(string arg0) {
    // todo auto-generated method stub
    system.out.println("myuserinfo.showmessage()"); 
  }
 
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!