当前位置: 移动技术网 > IT编程>开发语言>Java > java通过ssh连接服务器执行shell命令详解及实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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()"); 
  }
 
}

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网