java使用jsch连接ssh服务并远程执行命令、上传、下载操作

2023-11-15

java使用jsch连接ssh服务并远程执行命令、上传、下载操作

关键依赖:jsch-0.1.54.jar

第一,使用用户名和密码连接
	/**
     * 使用用户名和密码连接
     */
    @Test
    public void test1() throws JSchException {
        //创建一个ssh通讯核心类
        JSch jSch = new JSch();

        //传主机、端口、用户名获得一个会话
        Session session = jSch.getSession("admin", "your host", 22);

        //不进行严格模式检查
        Properties config = new Properties();
        config.put("StrictHostKeyChecking","no");

        //设置密码
        session.setPassword("your password");
        session.setConfig(config);

        //连接会话
        session.connect();

        log.debug("是否连接:" + session.isConnected());
        log.debug("会话:" + session);

        //断开连接
        session.disconnect();

        log.debug("是否连接:" + session.isConnected());

    }

在这里插入图片描述

第二,使用用户名和密钥连接
	/**
     * 使用用户名和私钥连接
     * @throws JSchException
     */
    @Test
    public void test2() throws JSchException {
        //创建一个ssh通讯核心类
        JSch jSch = new JSch();

        //设置私钥路径
        jSch.addIdentity("D:\\hehui\\jsch\\admin_private.ppk");

        //传主机、端口、用户名获得一个会话
        Session session = jSch.getSession("admin", "your host", 22);

        //不进行严格模式检查
        Properties config = new Properties();
        config.put("StrictHostKeyChecking","no");

        session.setConfig(config);

        //连接会话
        session.connect();

        log.debug("是否连接:" + session.isConnected());
        log.debug("会话:" + session);

        //断开连接
        session.disconnect();

        log.debug("是否连接:" + session.isConnected());

    }

在这里插入图片描述

第三,远程执行命令
	/**
     * 远程执行命令
     * @throws JSchException
     * @throws IOException
     */
    @Test
    public void test3() throws JSchException, IOException {

        log.debug("会话:\r\n" + session);

        ChannelExec channelExec = (ChannelExec)session.openChannel("exec");

        channelExec.setCommand("df -h");
        channelExec.connect();

        InputStream inputStream = channelExec.getInputStream();

        //命令执行结果
        String result = IOUtils.toString(inputStream);

        log.debug("执行结果:\r\n" + result);

    }

在这里插入图片描述
在这里插入图片描述

第四,文件上传
	/**
     * 文件上传
     */
    @Test
    public void test4() {
        try {
            //使用ssh会话开启一个sftp文件传输的通道,Channel为抽象类
            Channel channel = session.openChannel("sftp");

            //强转为ChannelSftp
            ChannelSftp channelSftp = (ChannelSftp) channel;

            //连接该通道
            channelSftp.connect();

            String filePath = "D:\\hehui\\jsch\\apache-tomcat-9.0.35.tar.gz";

            String fileName = "apache-tomcat-9.0.35.tar.gz";

            //服务文件夹路径,只支持绝对路径
            String serverDir = "/home/admin/jsch/";

            AtomicReference<String> dir = new AtomicReference<>("/");

            Stream.of(serverDir.split("\\/")).forEach(p -> {
                try {
                    if (StringUtils.isNotEmpty(p)) {
                        String existDir = dir.get();
                        if (StringUtils.equals(existDir,"/")) {
                            dir.set(existDir + p);
                        } else {
                            dir.set(existDir + "/" + p);
                        }
                        channelSftp.cd(dir.get());
                    }

                } catch (SftpException e1) {
                    log.debug("创建目录:" + p);
                    try {
                        channelSftp.mkdir(dir.get());
                        channelSftp.cd(dir.get());
                    } catch (SftpException e2) {
                        log.error("error:",e2);
                        throw new RuntimeException(e2);
                    }
                }
            });

            FileInputStream in = new FileInputStream(filePath);

            //上传
            channelSftp.put(in,fileName);

            //关闭传输通道
            channelSftp.disconnect();

        } catch (JSchException e) {
            log.error("error",e);
        } catch (FileNotFoundException e) {
            log.error("error:",e);
        } catch (SftpException e) {
            log.error("error",e);
        }
    }

在这里插入图片描述
在这里插入图片描述

第五,文件下载
	/**
     * 文件下载
     */
    @Test
    public void test5(){
        try {
            //使用ssh会话开启一个sftp文件传输的通道,Channel为抽象类
            Channel channel = session.openChannel("sftp");

            //强转为ChannelSftp
            ChannelSftp channelSftp = (ChannelSftp) channel;

            //连接该通道
            channelSftp.connect();

            String serverDir = "/home/admin/jsch/";
            String serverFile = "apache-tomcat-9.0.35.tar.gz";

            FileOutputStream out = new FileOutputStream("D:\\hehui\\jsch\\apache-tomcat-9.0.35_download.tar.gz");

            channelSftp.cd(serverDir);

            channelSftp.get(serverFile,out);

            //关闭通道
            channelSftp.disconnect();

        } catch (JSchException e) {
            log.error("error:",e);
        } catch (FileNotFoundException e) {
            log.error("error:",e);
        } catch (SftpException e) {
            log.error("error:",e);
        }
    }

在这里插入图片描述
在这里插入图片描述

全部Demo

package com.day0707;

import com.jcraft.jsch.*;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Stream;

/**
 * JSch(java ssh channel)java连接ssh服务示例
 * 远程执行命令、上传、下载
 * @author hehui
 * @date 2020/7/7
 */
public class JSchDemo {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    private Session session = null;

    @Before
    public void open() throws JSchException {
        log.debug("开启会话");
        //创建一个ssh通讯核心类
        JSch jSch = new JSch();

        //设置私钥路径
        jSch.addIdentity("D:\\hehui\\jsch\\admin_private.ppk");

        //传主机、端口、用户名获得一个会话
        Session session = jSch.getSession("admin", "your host", 22);

        //不进行严格模式检查
        Properties config = new Properties();
        config.put("StrictHostKeyChecking","no");

        session.setConfig(config);

        //连接会话
        session.connect();

        this.session = session;
    }

    @After
    public void close(){
        log.debug("关闭会话");
        //关闭连接
        this.session.disconnect();
    }

    /**
     * 使用用户名和密码连接
     */
    @Test
    public void test1() throws JSchException {
        //创建一个ssh通讯核心类
        JSch jSch = new JSch();

        //传主机、端口、用户名获得一个会话
        Session session = jSch.getSession("admin", "your host", 22);

        //不进行严格模式检查
        Properties config = new Properties();
        config.put("StrictHostKeyChecking","no");

        //设置密码
        session.setPassword("your password");
        session.setConfig(config);

        //连接会话
        session.connect();

        log.debug("是否连接:" + session.isConnected());
        log.debug("会话:" + session);

        //断开连接
        session.disconnect();

        log.debug("是否连接:" + session.isConnected());

    }

    /**
     * 使用用户名和私钥连接
     * @throws JSchException
     */
    @Test
    public void test2() throws JSchException {
        //创建一个ssh通讯核心类
        JSch jSch = new JSch();

        //设置私钥路径
        jSch.addIdentity("D:\\hehui\\jsch\\admin_private.ppk");

        //传主机、端口、用户名获得一个会话
        Session session = jSch.getSession("admin", "your host", 22);

        //不进行严格模式检查
        Properties config = new Properties();
        config.put("StrictHostKeyChecking","no");

        session.setConfig(config);

        //连接会话
        session.connect();

        log.debug("是否连接:" + session.isConnected());
        log.debug("会话:" + session);

        //断开连接
        session.disconnect();

        log.debug("是否连接:" + session.isConnected());

    }

    /**
     * 远程执行命令
     * @throws JSchException
     * @throws IOException
     */
    @Test
    public void test3() throws JSchException, IOException {

        log.debug("会话:\r\n" + session);

        ChannelExec channelExec = (ChannelExec)session.openChannel("exec");

        channelExec.setCommand("df -h");
        channelExec.connect();

        InputStream inputStream = channelExec.getInputStream();

        //命令执行结果
        String result = IOUtils.toString(inputStream);

        log.debug("执行结果:\r\n" + result);

    }

    /**
     * 文件上传
     */
    @Test
    public void test4() {
        try {
            //使用ssh会话开启一个sftp文件传输的通道,Channel为抽象类
            Channel channel = session.openChannel("sftp");

            //强转为ChannelSftp
            ChannelSftp channelSftp = (ChannelSftp) channel;

            //连接该通道
            channelSftp.connect();

            String filePath = "D:\\hehui\\jsch\\apache-tomcat-9.0.35.tar.gz";

            String fileName = "apache-tomcat-9.0.35.tar.gz";

            //服务文件夹路径,只支持绝对路径
            String serverDir = "/home/admin/jsch/";

            AtomicReference<String> dir = new AtomicReference<>("/");

            Stream.of(serverDir.split("\\/")).forEach(p -> {
                try {
                    if (StringUtils.isNotEmpty(p)) {
                        String existDir = dir.get();
                        if (StringUtils.equals(existDir,"/")) {
                            dir.set(existDir + p);
                        } else {
                            dir.set(existDir + "/" + p);
                        }
                        channelSftp.cd(dir.get());
                    }

                } catch (SftpException e1) {
                    log.debug("创建目录:" + p);
                    try {
                        channelSftp.mkdir(dir.get());
                        channelSftp.cd(dir.get());
                    } catch (SftpException e2) {
                        log.error("error:",e2);
                        throw new RuntimeException(e2);
                    }
                }
            });

            FileInputStream in = new FileInputStream(filePath);

            //上传
            channelSftp.put(in,fileName);

            //关闭传输通道
            channelSftp.disconnect();

        } catch (JSchException e) {
            log.error("error",e);
        } catch (FileNotFoundException e) {
            log.error("error:",e);
        } catch (SftpException e) {
            log.error("error",e);
        }
    }

    /**
     * 文件下载
     */
    @Test
    public void test5(){
        try {
            //使用ssh会话开启一个sftp文件传输的通道,Channel为抽象类
            Channel channel = session.openChannel("sftp");

            //强转为ChannelSftp
            ChannelSftp channelSftp = (ChannelSftp) channel;

            //连接该通道
            channelSftp.connect();

            String serverDir = "/home/admin/jsch/";
            String serverFile = "apache-tomcat-9.0.35.tar.gz";

            FileOutputStream out = new FileOutputStream("D:\\hehui\\jsch\\apache-tomcat-9.0.35_download.tar.gz");

            channelSftp.cd(serverDir);

            channelSftp.get(serverFile,out);

            //关闭通道
            channelSftp.disconnect();

        } catch (JSchException e) {
            log.error("error:",e);
        } catch (FileNotFoundException e) {
            log.error("error:",e);
        } catch (SftpException e) {
            log.error("error:",e);
        }
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java使用jsch连接ssh服务并远程执行命令、上传、下载操作 的相关文章

  • elk笔记16--aggs-Metrics Aggregations

    elk笔记16 aggs Metrics Aggregations 1 Metrics Aggregations 简介 2 Metrics Aggregations 分类 2 1 Avg Aggregation 2 2 Weighted A
  • python: 理解__str__

    以下是我的理解 如果有错我的地方 请务必告诉我 不胜感激 在python语言里 str 一般是格式是这样的 class A def str self return this is in str 事实上 str 是被print函数调用的 一般
  • matplotlib绘制出光滑曲线

    用matplotlib库绘制光滑的曲线图 注意点 坐标要是用range 表示的话用这个方法拟合平滑曲线会报错 查了别人说的把range 转化成list range 感觉并没有用 所以还是用了穷举法表示的x坐标 import numpy as
  • MOM和MES区别

    对于工业软件 中国的制造业企业并不模式 尤其是在生产排产过程中 MES 制造执行系统 的应用早已普及 不过 SiemensPLM Software DER业务中国区总经理戚锋近日在接受记者采访时表示 MES已经无法跟上时代潮流 MES 的升
  • 机器学习(周志华) 习题 参考答案 第十六章

    周志华老师的 机器学习 的第16章的习题答案较少 网上的参考答案链接分别为答案一和答案二 以下是个人对这章的习题的理解 如有问题 欢迎指正 16 1比较UCB方法与 贪心法和Softmax方法的异同 1 UCB选则值最大的摇臂 是100 选
  • python 词频统计

    python 词频统计 描述 谁动了我的奶酪 是美国作家斯宾塞 约翰逊创作的一个寓言故事 该书首次出版于1998年 书中主要讲述4个 人物 两只小老鼠 嗅嗅 Sniff 匆匆 Scurry 和两个小矮人 哼哼 Hem 唧唧 Haw 找寻奶酪
  • Use gitk to understand git

    https lostechies com joshuaflanagan 2010 09 03 use gitk to understand git
  • 红帽认证-RHCSA

    目录 RHCSA认证考的是 Server A 题目 一 按要求配置网络 二 配置系统使用默认存储库 三 调试SELinux 四 创建用户账户 五 配置cron 作业 六 创建协作目录 七 配置NTP 八 配置 autofs 九 配置 var
  • 牛客网-华为机考-HJ30 字符串合并处里--详细解题思路,并有详细解题代码和注解

    注意 代码和解题思路在后面 HJ30 字符串合并处理 描述 按照指定规则对输入的字符串进行处理 详细描述 第一步 将输入的两个字符串str1和str2进行前后合并 如给定字符串 dec 和字符串 fab 合并后生成的字符串为 decfab
  • 排序之sort排序

    C 的STL里面有个sort函数 可以直接对数组排序 复杂度为n log2 n 使用这个函数 需要包含头文件
  • 【计算机毕业设计】228图书商城网站

    一 系统截图 需要演示视频可以私聊 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书商城网站就是在这样的大环境下诞生 其可以帮助管理者在短时间内处理完毕庞大
  • ModuleNotFoundError: No module named 'cv2' (安装cv2)

    1 问题 ModuleNotFoundError No module named cv2 Pycharm 中 import cv2 出现错误 2 解决 安装cv2 pip install opencv python 如果只用主模块 使用这个
  • vulnhub靶机Looz

    下载地址 Looz 1 VulnHub 主机发现 arp scan l 端口扫描 nmap min rate 10000 p 192 168 21 155 扫描端口信息 nmap sV sT O p22 80 139 3306 8081 1
  • flask中文学习教程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt http flask123 sinaapp com 转载于 https my oschina net 935572630 blog 371473
  • vue中 关于 同一个 页面 使用搜索功能 数据不更新

    注意 我这里的搜索是在 公共的头部里面如图 我这里点击搜索是跳到搜索页面 并且传参 代码如下 div class search div
  • mipi协议_学习共享——MIPI

    点击上方蓝字 记得关注我们 MIPI名词解释 MIPI Mobile Industry Processor Interface 移动行业处理器接口 是2003年由ARM Nokia ST TI等公司成立的一个联盟发起的为移动应用处理器定制的
  • 3D纹理,立体纹理,三维纹理示例配置

    1 下载freeglut并使用cmake配置 编译安装 https github com FreeGLUTProject freeglut git clone https github com FreeGLUTProject freeglu
  • c++学习——构造函数和析构函数

    构造函数和析构函数 简要概述 构造函数和析构函数的简单调用 构造函数和析构函数能够函数重载 默认的构造函数和析构函数 拷贝构造 构造函数的分类和调用 匿名对象 拷贝构造函数的调用时机 构造函数的调用规则 多个对象的构造函数和析构函数 深浅拷
  • 数组越界访问会发生什么错误?怎样避免该错误?_后缀数组跳坑笔记

    记点写题的时候遇到的坑 可能会更新 多组数据相关 1 h数组需要清空 别的一般不需要 除了倍增算法中为简化代码把上一迭代的rk数组开成两倍的情况 那个场合会有因为字符串长度不同而导致访问到以前填写的不知道什么鬼东西的情况导致rk算错 大概就
  • [790]win环境Maven安装配置

    文章目录 什么是Maven Maven是一个项目管理和整合的工具 Maven为开发者提供了一套完整的构建生命周期框架 开发团队基本不用花多少时间就能自动完成工程的基础构建配置 因为Maven使用了一个标准的目录结构和一个默认的构建生命周期

随机推荐

  • 【UE4】多视角相机捕获图像如何同屏拼接在一起

    前段时间有个Demo移植的需求 需要把实时裸眼3D多视角立体显示的Unity版本移植到UE4 主要包含后处理Shader 相机矩阵变换 多视角画面平铺拼接三大部分 10 10 多视角相机捕获图拼接效果 对现有的多窗口显示方法进行查阅后 发现
  • 不一样的视角,不一样的Kinect for Windows 2.0

    随着科技的发展 智能硬件已经越来越多的出现在我们的生活当中 侦探片中的无线内耳耳机已经变成了蓝牙耳机 而 少数派报告 中手势操作的荧幕界面也已变成现实 对人机交互有很高要求的开发者来讲 于7月正式发售的Kinect for Windows
  • pytorch 线性回归拟合sin函数

    目录 1 库文件 2 定义超参数 3 获取数据集 4 加载训练集 测试集 5 搭建线性网络 6 实例化网络和优化器 7 训练网络 8 可视化 9 结果展示 10 完整代码 1 库文件 os 文件是为了消除matplotlib 绘图的错误 T
  • Yolox_s可视化网络结构图

    Yolox共有七种网络结构 包含2种轻量级网络 和5种标准网络 轻量级网络 1 Yolox Nano可视化网络结构图 点击查看 2 Yolox Tiniy可视化网络结构图 点击查看 标准网络 1 Yolox s可视化网络结构图 点击查看 2
  • Java中对象实例化过程中的多态特性

    通过上述代码 始终明确调用的方法必须是实例化子类中重写的方法 首先 在main函数中 new B new了一个B类的实例化对象 在实例化对象时 调用了B类中的构造函数 执行 super 5 也就是public A int v gt setV
  • 14.应用层HTTP协议

    目录 一 OSI七层协议 vs TCP IP五层协议 二 HTTP协议 URL 1 1URL 中的可省略部分 2 请求消息Request 2 1请求行 2 2请求头 2 3空行 2 4请求数据 2 5HTTP 请求方法 3 响应消息Resp
  • sql developer默认是不自动提交事务的,如何查询未被提交的事务

    select SQL TEXT status from v sql v transaction where LAST ACTIVE TIME START DATE 上面的语句可以查询未被提交的事务 如果你查询或更新时很长时间没反应 一般是另
  • 二分查找BinarySearch

    二分查找 在包含size个元素 从小到大排序的int数组array里查找元素p 如果找到返回下标 如果未找到返回 1 int BinarySearch int array int size int p int left 0 查找区间的左端点
  • 5.7及以上版本的MySQL下载、安装及配置教程

    对版本的说明 之所以说是MySQL5 7及以上版本 是因为从MySQL5 7版本之后 其安全机制有所改变 在安装完成后 登陆MySQL时 需要输入一个密码 这个密码其实是在配置MySQL的过程中生成的一个随机密码 而我们必须找到这个随机密码
  • Eclipse中启动Tomcat无任何反应

    推动了软件业不断发展的可以说有3个方面的东西 过程 方法 技术 方法附会到哲学上应该就是方法论了 做很多事情都是需要方法的 比如写一篇案例 随心随意写也可以写出来 但是别人能否理解 如何检测自己描述清晰都是没有参考的 如果有个模板的 这样按
  • 韩顺平_java 学习路线

    链接 目录 阶段一 Java基础 阶段二 Java高级 阶段三 Java Web 阶段四 主流框架 项目管理相关的技术 阶段五 分布式 微服务 并行架构 阶段六 DevOps 开发运维一体化 自动部署项目管理 解决 CI CD 阶段七 大数
  • 【目标检测】单阶段算法--YOLOv3详解

    论文题目 YOLOv3 An Incremental Improvement 论文地址 https pjreddie com media files papers YOLOv3 pdf 一文读懂YOLOv1 YOLOv1 一文读懂YOLOv
  • 链表(详解)

    一 链表 1 1 什么是链表 1 链表是物理存储单元上非连续的 非顺序的存储结构 数据元素的逻辑顺序是通过链表的指针地址实现 有一系列结点 地址 组成 结点可动态的生成 2 结点包括两个部分 1 存储数据元素的数据域 内存空间 2 存储指向
  • gitee最详细使用教程,汇总了全网,看这一篇就够了

    1 gitee是什么 基于git的代码托管协助平台 2 git网站上的注册登录 打开gitee官网Gitee 基于 Git 的代码托管和研发协作平台打开注册登录即可 邮箱注册最好 非邮箱在个人 设置里添加自己的邮箱 新手请公开自己的邮箱 如
  • 《Vision Transformer (ViT)》论文精度,并解析ViT模型结构以及代码实现

    AN IMAGE IS WORTH 16X16 WORDS TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 论文共有22页 表格和图像很多 网络模型结构解释的很清楚 并且用四个公式展示了模型的计算过程
  • springboot枚举反序列化,@JsonCreator注解各种报错解决方案

    你多努力一点 获得的打击就多一点 今天使用枚举传参就出现了各种报错 比如这样的 org springframework http converter HttpMessageNotReadableException JSON parse er
  • Android Fragment之间跳转

    1 创建一个接口 public interface ChangeFragment void changge int postion 2 设置一个全局变量 public class GlobalParms private static Hom
  • OpenCV在图片中输出中文乱码解决方案

    转自 http www jeepxie net article 789204 html 一 缘起 在一个项目中需要把中文字符输出到图片上 也就是输出到Mat上 OpenCV 的putText函数不能输出中文 通过搜索 网上普遍的解决方案是使
  • C++不定参数函数实现方式

    文章目录 define 函数定义 VA LIST栈 c 11初始化列表 c 11 变长参数模板template
  • java使用jsch连接ssh服务并远程执行命令、上传、下载操作

    java使用jsch连接ssh服务并远程执行命令 上传 下载操作 关键依赖 jsch 0 1 54 jar 第一 使用用户名和密码连接 使用用户名和密码连接 Test public void test1 throws JSchExcepti