基于Java实现ssh命令登录主机执行shell命令过程解析

这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、SSH命令

SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。

实际工作中,我们经常使用客户端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主机上,执行一些操作命令。

如何使用Java语言实现SSH 连接主机,并执行Shell命令呢?

2、Java 实现 SSH命令

1)代码实现如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;

import org.apache.commons.lang3.StringUtils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class SshUtil {
 private static String DEFAULT_CHAR_SET = "UTF-8";
 private static String tipStr = "=======================%s=======================";
 private static String splitStr = "=====================================================";

 /**
  * 登录主机
  * @return
  *  登录成功返回true,否则返回false
  */
 public static Connection login(String ip, String userName, String password){
  boolean isAuthenticated = false;
  Connection conn = null;
  long startTime = Calendar.getInstance().getTimeInMillis();
  try {
   conn = new Connection(ip);
   conn.connect(); // 连接主机

   isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证
   if(isAuthenticated){
    System.out.println(String.format(tipStr, "认证成功"));
   } else {
    System.out.println(String.format(tipStr, "认证失败"));
   }
  } catch (IOException e) {
   System.err.println(String.format(tipStr, "登录失败"));
   e.printStackTrace();
  }
  long endTime = Calendar.getInstance().getTimeInMillis();
  System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
  return conn;
 }

 /**
  * 远程执行shell脚本或者命令
  * @param cmd
  *  即将执行的命令
  * @return
  *  命令执行完后返回的结果值
  */
 public static String execute(Connection conn, String cmd){
  String result = "";
  Session session = null;
  try {
   if(conn != null){
    session = conn.openSession(); // 打开一个会话
    session.execCommand(cmd);  // 执行命令
    result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);

    //如果为得到标准输出为空,说明脚本执行出错了
    if(StringUtils.isBlank(result)){
     System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd);
     result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
    }else{
     System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd);
    }
   }
  } catch (IOException e) {
   System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage());
   e.printStackTrace();
  } finally {
   if (conn != null) {
    conn.close();
   }
   if (session != null) {
    session.close();
   }
  }
  return result;
 }

 /**
  * 解析脚本执行返回的结果集
  * @param in 输入流对象
  * @param charset 编码
  * @return
  *  以纯文本的格式返回
  */
 private static String processStdout(InputStream in, String charset){
  InputStream stdout = new StreamGobbler(in);
  StringBuffer buffer = new StringBuffer();
  try {
   BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
   String line = null;
   while((line = br.readLine()) != null){
    buffer.append(line + "\n");
   }
  } catch (UnsupportedEncodingException e) {
   System.err.println("解析脚本出错:" + e.getMessage());
   e.printStackTrace();
  } catch (IOException e) {
   System.err.println("解析脚本出错:" + e.getMessage());
   e.printStackTrace();
  }
  return buffer.toString();
 }

 public static void main(String[] args){
  String ip = "192.168.123.234"; // 此处根据实际情况,换成自己需要访问的主机IP
  String userName = "root";
  String password = "password";
  Connection conn = SshUtil.login(ip, userName, password);

  String cmd = "cd /home/miracle&&pwd&&ls&&cat luna.txt";
  String result = SshUtil.execute(conn, cmd);
  System.out.println(splitStr + "\n执行的结果如下: \n" + result + splitStr);
 }
}

2)运行结果如下:

=======================认证成功=======================
登录用时: 0.859s
=====================================================
【执行命令成功】
执行的命令如下:
cd /home/miracle&&pwd&&ls&&cat luna.txt
=====================================================
执行的结果如下:
/home/miracle
luna.txt
Hello, I'm SshUtil.
Nice to meet you.^_^
=====================================================

3)pom.xml 引用添加如下:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.9</version>
  </dependency>

  <!-- ssh -->
  <dependency>
   <groupId>ch.ethz.ganymed</groupId>
   <artifactId>ganymed-ssh2</artifactId>
   <version>262</version>
  </dependency>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java编程ssh整合常见错误解析

    1. org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.UnsupportedOperationException: Not supported by BasicDataSource Spring不能为JAP创建事务.原因是bean.xml设定了数据源per

  • java-SSH2实现数据库和界面的分页

    分页应该是在我们开发web应用时经常要做的工作,能够比较简洁的实现数据库和视图层的分页十分重要. 在数据库层利用hibernate进行数据库的分页,将从数据库中查询出的数据封装为javabean:在视图层就可以方便的实现分页. 创建PageBean package com.fishing.common.bean; import java.util.List; @SuppressWarnings("unchecked") public class PageBean { private L

  • Java的web开发中SSH框架的协作处理应用笔记

    相信SSH没人不知道了吧,struts2+spring+hibernate,企业开发的"基础"架构,为什么基础标上引号,因为这个基础只是很多人自以为的而已,最基础的是servlet,很多培训机构很多基础都不教,直接上来就三大框架了,SSH不然就SSI,搞得很多人以为JAVAWEB开发就一定要框架,没框架就跟没了手一个样.三大框架没有什么坏处,实用,很多公司都在用,直接上手开发.但毕业以为真的好久没用三大框架了,spring倒是有用,特别是springMVC,感觉用起来比struts2爽

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

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

  • Java实现SSH模式加密

    Java实现SSH模式加密的实现原理思路分享给大家. 一.SSH加密原理 SSH是先通过非对称加密告诉服务端一个对称加密口令,然后进行验证用户名和密码的时候,使用双方已经知道的加密口令进行加密和解密,见下图: 解释:SSH中为什么要使用非对称加密,又使用对称加密,到底有什么用处?到底安全不安全?既然后来又使用了对称加密,开始的时候为什么还要用非对称加密?反过来,既然用非对称加密,为什么又要使用对称加密呢? 非对称加密,是为了将客户端产生的256位随机的口令传递到服务端,那么在传递的过程中,使用公

  • 详解Java使用Jsch与sftp服务器实现ssh免密登录

    一.什么是SFTP? SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的.但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP. 二.什么是Jsch以及它的作用? Jsch是一个纯粹的用java实现SSH功能的java library.如果要知道Jsch的功

  • SSH框架网上商城项目第25战之使用java email给用户发送邮件

    当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息,邮箱地址是从用户的基本信息中获取,好了,首先我们来看一下java中发送邮件的方法. 1. java中发送email的方法 在完善这个项目之前,先来回顾一下java中是如何发送邮件的,首先肯定需要发送邮件的jar包:mail.jar,导入到lib目录下,好了,下面我们先写一个普通的java程序来回顾一下java email的知识点: public class SendEmailDemo { public static vo

  • 详解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的持久化规范(接口) (3)数据库驱动 2.struts2 (1)struts-blank.war/WEB-INF/lib/* 注意:javassist-3.18.1-GA.jar包与hibernate中的重复(只保留高版本即可) (2)struts整合spring插件包 注意:这个包一旦导入,那么s

  • Java框架SSH结合Easyui控件实现省市县三级联动示例解析

    Easyui调用数据库实现省市县区三级联动的效果如果下 1.首先要设计数据库,如图所示.一个有4个字段code,note,pycode.code:行政区划代码,note:中文注释,pycode:拼音缩写. 其中code是由6个字段组成.如果是省级最后4位是0000,如果是地级市最后2位是00,其他是县区. 我已经把相关数据库代码上传到我的csdn资源中,需要的同学自行下载. 2.我用的是java.SSH框架结合Easyui控件 3.html代码如下 <tr> <td class=&quo

  • 基于Java实现ssh命令登录主机执行shell命令过程解析

    这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.SSH命令 SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH最初是UNI

  • js执行shell命令的几种方式(Node)

    目录 前言 调起shell的几种方式介绍(不限于这几种) 1.child_process 2.shelljs 3.simple-git 总结 在做一个客户端基建项目的时候,多处需要用到JS调取命令行执行shell脚本,这里对shell命令.JS执行shell命令做一个简单的介绍和总结. 前言 一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求.(electron这个客户端框架本身就内置了node的很多方法).因此下

  • Python实现ssh批量登录并执行命令

    局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件,拷贝某些文件,批量关机等.如果一台一台得手工去操作,费时又费力,如果要进行多个操作就更麻烦啦. 或许你会想到网络同传,网络同传是什么?就是在一台电脑上把电脑装好,配置好,然后利用某些软件,如"联想网络同传"把系统原样拷贝过去,在装系统时很有用,只要在一台电脑上装好,同传以后所有的电脑都装

  • python SSH模块登录,远程机执行shell命令实例解析

    用python SSH模块登录,并在远程机执行shell命令 (在CentOS 7 环境试验成功, Redhat 系列应该是兼容的.) 先安装必须的模块 # yum install python-dev # yum install python-devel # pip install pycrypto # pip install paramiko # pip install ssh 这些都成功后, 编写一个Python脚本 # vim remote_run.py import ssh # 新建一

  • python ssh 执行shell命令的示例

    # -*- coding: utf-8 -*- import paramiko import threading def run(host_ip, username, password, command): ssh = paramiko.SSHClient() try: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host_ip, 22, username, password) print('====

  • Java JSch远程执行Shell命令的方法

    目录 背景 JSch简介 使用示例 需要注意的点 参考文档 背景 项目需求,需要远程 ssh 登录到某个节点执行 shell 命令来完成任务.对于这种需求,如果不用 java 程序,直接 linux 的 ssh 命令就可以完成,但是在编码到程序中时需要相关的程序包来完成,本文主要介绍在 java 中如何使用 JSch 包实现 ssh 远程连接并执行命令. JSch 简介 JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器

  • 基于Java实现扫码登录的示例代码

    目录 基本介绍 原理解析 1. 身份认证机制 2. 流程概述 代码实现 1. 环境准备 2. 主要依赖 3. 生成二维码 4. 扫描二维码 5. 确认登录 6. PC 端轮询 7. 拦截器配置 效果演示 1. 工具准备 2. 数据准备 3. 扫码登录流程展示 结语 基本介绍 相信大家对二维码都不陌生,生活中到处充斥着扫码登录的场景,如登录网页版微信.支付宝等.最近学习了一下扫码登录的原理,感觉蛮有趣的,于是自己实现了一个简易版扫码登录的 Demo,以此记录一下学习过程. 实际上是面试的时候被问到

  • Java代码执行shell命令的实现

    本文描述两种方式使用java代码执行shell命令,首先使用Runtime类调用exce方法,其次使用ProcessBuilder实例实现更灵活的方式. 1. 环境准备 执行shell命令之前,我们需要获取jvm底层操作系统,同时定义通用消费流的类. 1.1. 操作系统依赖 在创建进场执行shell命令之前,我们需要获取jvm运行在具体哪个操作系统之上.因为Windows执行shell命令是cmd.exe,而其他操作系统发布标准shell是sh: boolean isWindows = Syst

  • java在linux本地执行shell命令的实现方法

    目录 一.以springboot为例,建立代码 1.IExecCommandServer: 2.ExecCommandServerImp: 3.ExecCommandController: 二,执行示例 一.以springboot为例,建立代码 1.IExecCommandServer: public interface IExecCommandServer { void execCommand(String cmd); } 2.ExecCommandServerImp: @Service pu

随机推荐