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

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

}

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

(0)

相关推荐

  • Windows上SSH服务器配置图文教程

    一.ssh服务器安装 1).我们使用免费软件freeSSHd.点击下载 2)安装完成后进入配置界面, (1)Server State中确保SSH服务已打开 如果此处出现不能打开的情况,在SSH界面将Start SSH server on free SSHd startup前边的勾去掉,如图: (2)进入Users界面,Add一个新用户,如slave. Authorization选择公钥形式,并给予Shell权限.选择PassWord需要每次登录填写密码. (3)在Authentication界面

  • python下paramiko模块实现ssh连接登录Linux服务器

    本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法.分享给大家供大家参考.具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功. #!/usr/bin/env python import paramiko hostname='172.28.102.249' username='root' passwor

  • ubuntu16.04服务器配置ssh免密码登录

    在客户端操作 ssh-keygen -t rsa 文件位置写/home/try/.ssh/server_rsa,不使用默认值,我命名为server_rsa担心影响到git的key(因为我的git使用的是默认值) ssh-copy-id root@123.45.56.78(你的服务器ip), 或这使用 cat ~/.ssh/id_rsa.pub | ssh user@123.45.56.78 "mkdir -p ~/.ssh && cat >> ~/.ssh/autho

  • Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上

    Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上 今天同事想在windows上使用winscp上传文件到linux服务器上,又想偷懒想使用批处理来进行上传,还好只固定上传一个php文件,多了还真不好搞. 1.下载winscp 大家可以去网上自己找,我把winscp安装在c:下的 2.把要执行的命令保存到文件winscp.bat里,这个winscp.bat可以自己创建,我是放在d:下的. winscp.bat脚本内容: 复制代码 代码如下: option co

  • 用expect实现ssh自动登录服务器并进行批量管理的实现方法

    shell代码: 复制代码 代码如下: #!/usr/local/bin/expectset PASSWD [lindex $argv 1]set IP     [lindex $argv 0]set CMD [lindex $argv 2]spawn ssh $IP $CMDexpect "(yes/no)?" {send "yesr"expect "password:"send "$PASSWDr"} "pass

  • SSH设置别名访问远程服务器详细介绍

    SSH设置别名访问远程服务器详细介绍 一般使用ssh访问远程服务器的命令是:ssh username@ip地址, 例如:ssh root@112.232.12.12,然后输入密码即可访问. 以Mac OS为例,其他操作系统,根据目录自行查找 设置如下: 使用cd ~/.ssh/ 进入ssh目录,会看到有config.known_hosts两个文件,一般的没有设置的话,只会有known_hosts,可以使用touch config命令创建config文件. 使用vim编辑config文件,添加如下

  • 简单架设SSH+Squid代理服务器的自由上网通道的方法

    而SSH则很好地解决了这个问题.你只需要一个vps,就可以配置了.架设还是挺容易的. 安装webmin webmin是一个可视化管理linux系统的免费软件.我们安装它是为了方便管理squid代理服务器或者linux系统.详细安装地址如下: CentOS 安装Webmin管理系统 安装squid代理服务器 1.在安装squid之前,我们需要安装EPEL软件包. 复制代码 代码如下: rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i38

  • SSH在登录服务器后如何显示基础信息

    前言 本文主要给大家介绍了SSH登录服务器后显示基础信息的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 方法如下: 安装landscape-common,可以在登录时候显示一些基础的信息,例如CPU内存占用等等 sudo apt-get install landscape-common 安装update-notifier-common,当有软件包更新的时候,会在SSH登录成功后提示用户 sudo apt-get install update-notifier-common 效果如下:

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

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器. SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接.SSH提

  • Android执行shell命令详解

    一.方法 复制代码 代码如下: /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"}) * @param workdirectory * 命令执行路径(例如:"system/bin/") * @return 执行结果组成的字符串 * @throws IOException */ public stati

  • Python使用paramiko连接远程服务器执行Shell命令的实现

    需求 在自动化测试场景里, 有时需要在代码里获取远程服务器的某些数据, 或执行一些查询命令,如获取Linux系统版本号 \ 获取CPU及内存的占用等, 本章记录一下使用paramiko模块SSH连接服务器的方法 1. 先安装paramiko库 pip3 install paramiko 2. 代码 #!/usr/bin/env python # coding=utf-8 """ # :author: Terry Li # :url: https://blog.csdn.net

  • python 执行shell命令并将结果保存的实例

    方法1: 将shell执行的结果保存到字符串 def run_cmd(cmd): result_str='' process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result_f = process.stdout error_f = process.stderr errors = error_f.read() if errors: pass result_str =

  • Linux下的crontab定时执行任务命令详解

    在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间. cron的配置文件称为"crontab",是"cron table"的简写. 一.cron服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业.   service crond start    //启动服务   service crond stop     //

  • MySQL 数据库 source 命令详解及实例

    MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数据库导入命令.source 命令的用法非常简单,首先你需要进入 MySQL 数据库的命令行管理界面,然后选择需要导入的数据库,执行 source 命令.如下图所示. MySql 数据库 source 命令 mysql> use test Database changed mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mys

  • Java并发编程之Semaphore(信号量)详解及实例

    Java并发编程之Semaphore(信号量)详解及实例 概述 通常情况下,可能有多个线程同时访问数目很少的资源,如客户端建立了若干个线程同时访问同一数据库,这势必会造成服务端资源被耗尽的地步,那么怎样能够有效的来控制不可预知的接入量呢?及在同一时刻只能获得指定数目的数据库连接,在JDK1.5 java.util.concurrent 包中引入了Semaphore(信号量),信号量是在简单上锁的基础上实现的,相当于能令线程安全执行,并初始化为可用资源个数的计数器,通常用于限制可以访问某些资源(物

  • Java异常处理运行时异常(RuntimeException)详解及实例

      Java异常处理运行时异常(RuntimeException)详解及实例 RuntimeException RunntimeException的子类: ClassCastException 多态中,可以使用Instanceof 判断,进行规避 ArithmeticException 进行if判断,如果除数为0,进行return NullPointerException 进行if判断,是否为null ArrayIndexOutOfBoundsException 使用数组length属性,避免越

  • Java 从Set里面取出有序的记录详解及实例

    Java 从Set里面取出有序的记录详解及实例 Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSet,而不是HashSet,在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,TreeSet在进行排序的时候就是通过比较它们的Comparable接口的实现! 下面是HashSet的无序和TreeSet的有序的比较: Test类: import java.util.HashSet; import java.util.Iterato

  • php中如何执行linux命令详解

    前言 本文主要给大家介绍了关于在php中如何执行linux命令的相关内容,下面话不多说了,来一起看看详细的介绍吧 php如何执行某个命令 ,官方手册在这里 我们先从shell_exec来说 如何使用shell_exec在php里面执行shell命令 先来试一下,使用php执行某个shell命令,该命令是mkdir testdir. <?php $cmd = 'mkdir testdir'; shell_exec($cmd); 在这个php脚本执行之前,目录里面是这样子的: 执行之后,目录里面是如

随机推荐