java使用jsch连接ssh远程服务器

2023-11-15

java这边没有很好的封装工具连接ssh,jsch使用起来只是略微方便一点,使用的时候可以封装成工具自己使用

jsch有2种方式和客户端进行交互==ChannelShell和ChannelExec

ChannelShell和ChannelExec区别?
参考:https://blog.csdn.net/u013066244/article/details/70911585

ChannelShell

对于ChannelShell,以输入流的形式,提供命令和输入这些命令,这就像在本地计算机上使用交互式shell(它通常用于:交互式使用)

ChannelExec

对于ChannelExec,在调用connect()方法之前这个命令提供了setCommand()方法,并且这些命令作为输入将以输入流的形式被发送出去。(通常,你只能有调用setCommand()方法一次,多次调用只有最后一次生效),但是你可以使用普通shell的分隔符(&,&&,|,||,; , \n, 复合命令)来提供多个命令。这就像在你本机上执行一个shell脚本一样(当然,如果一个命令本身就是个交互式shell,这样就像ChannelShell)

明显:使用命令通道ChannelShell更容易,因为您不需要处理命令提示符。

ChannelShell的使用步骤

一、导入依赖

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

二、实现连接

2.1  连接

public class JSchUtil {

    private String ipAddress;   //主机ip
    private String username;   // 账号
    private String password;   // 密码
    private int port;  // 端口号

    Session session;

    public JSchUtil(String ipAddress, String username, String password, int port) {
        this.ipAddress = ipAddress;
        this.username = username;
        this.password = password;
        this.port = port;
    }

    /**
     *  连接到指定的ip
     */
    public void connect() {
        try {
            JSch jsch = new JSch();
            if (port < 0 || port > 65535){
                //连接服务器,如果端口号错误,采用默认端口
                session = jsch.getSession(username, ipAddress);
            }else {
                session = jsch.getSession(username, ipAddress, port);
            }
            //设置登录主机的密码
            session.setPassword(password);
            //如果服务器连接不上,则抛出异常
            if (session == null) {
                throw new Exception("session is null");
            }
            //设置首次登录跳过主机检查
            session.setConfig("StrictHostKeyChecking", "no");
            //设置登录超时时间
            session.connect(3000);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }

    }
}

2.2 执行命令(交互式)

/**
 * 执行相关的命令(交互式)
 * @param command
 * @return
 */
public int execute(String command) throws IOException {

    int returnCode = 0;
    ChannelShell channel = null;
    PrintWriter printWriter = null;
    BufferedReader input = null;
    Vector<String> stdout  = new Vector<>();
    try {
        //建立交互式通道
        channel = (ChannelShell) session.openChannel("shell");
        channel.connect();

        //获取输入
        InputStreamReader inputStreamReader = new InputStreamReader(channel.getInputStream());
        input = new BufferedReader(inputStreamReader);

        //输出
        printWriter = new PrintWriter(channel.getOutputStream());
        printWriter.println(command);
        printWriter.println("exit");
        printWriter.flush();
        log.info("The remote command is: ");
        String line;
        while ((line = input.readLine()) != null) {
            stdout.add(line);
            System.out.println(line);
        }
    } catch (Exception e) {
        log.error(e.getMessage(),e);
        return -1;
    }finally {
        printWriter.close();
        input.close();
        if (channel != null) {
            //关闭通道
            channel.disconnect();
        }
    }
    return returnCode;
}

public void close(){
    if (session != null) {
        session.disconnect();
    }
}

2.3 上传文件

/*
     * 上传文件到SFTP服务器
     * uploadDire     上传到的服务器文件夹
     * uploadFileName  上传后的文件名  lala_new.txt
     * localFileName  D:\lala_upload.txt
     */
    public  void sftpput(String uploadDire,String uploadFileName,String localFileName)  {
        Channel channel = null;
        try {
            //创建sftp通信通道
            channel = (Channel) this.session.openChannel("sftp");
            channel.connect(1000);
            ChannelSftp sftp = (ChannelSftp) channel;


            //进入服务器指定的文件夹
            sftp.cd(uploadDire);

            //列出服务器指定的文件列表
//            Vector v = sftp.ls("/");
//            for(int i=0;i<v.size();i++){
//                System.out.println(v.get(i));
//            }

            //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
            OutputStream outstream = sftp.put(uploadFileName);
            InputStream instream = new FileInputStream(new File(localFileName));

            byte b[] = new byte[1024];
            int n;
            while ((n = instream.read(b)) != -1) {
                outstream.write(b, 0, n);
            }

            outstream.flush();
            outstream.close();
            instream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
            channel.disconnect();
        }
    }

2.4 下载文件

/*
 * 从SFTP服务器下载文件
 * @param ftpHost SFTP IP地址
 * @param ftpUserName SFTP 用户名
 * @param ftpPassword SFTP用户名密码
 * @param ftpPort SFTP端口
 * @param ftpPath SFTP服务器中文件所在路径 格式: ftptest/aa
 * @param localPath 下载到本地的位置 格式:H:/download
 * @param fileName 文件名称
 */
public  void downloadSftpFile(String ftpPath, String localPath,
                                    String fileName) throws JSchException {
    String ftpHost = this.ipAddress;
    String ftpUserName = this.username;
    String ftpPassword = this.password;
    int ftpPort = this.port;

    Session session = null;
    Channel channel = null;

    JSch jsch = new JSch();
    session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
    session.setPassword(ftpPassword);
    session.setTimeout(100000);
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect();

    channel = session.openChannel("sftp");
    channel.connect();
    ChannelSftp chSftp = (ChannelSftp) channel;

    String ftpFilePath = ftpPath + "/" + fileName;
    String localFilePath = localPath + File.separatorChar + fileName;

    try {
        chSftp.get(ftpFilePath, localFilePath);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        chSftp.quit();
        channel.disconnect();
        session.disconnect();
    }

}

参考:java程序使用Jsch 实现 ssh连接_渣渣苏的博客-CSDN博客_jsch ssh

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

java使用jsch连接ssh远程服务器 的相关文章

  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 如何从外部模块导出符号?

    我在内核源代码树之外进行编码 有两个模块 第一个printt有一个功能printtty 将字符串打印到当前 tty 以及第二个模块hello这会调用printtty 在初始化期间 我已经添加了EXPORT SYMBOL printtty 在
  • 如何通过主机从外部 SSH 到 VirtualBox 来宾? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个在 Windows 7 计算机上运行的 Ubuntu 虚拟机 如何设置才能通过 SSH 从外部访问 Web 服务器 我找到了步骤
  • VSCODE 在 Linux 上不适用于我

    刚刚了解 VSCODE 很高兴尝试一下 我下载 解压并运行可执行文件 我得到 Code 2183 0429 201254 ERROR browser main loop cc 170 Running without the SUID san
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何更改 Kubernetes 中的文件系统观察程序限制 (fs.inotify.max_user_watches)

    我在用着pm2 https github com Unitech pm2查看保存我的应用程序服务器的 NodeJS 程序源代码的目录 该程序在 Kubernetes 集群中运行 但是 我收到此错误 ENOSPC System limit f
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 无法使用 tar -cvpzf 解压完整目录

    把我的头敲在这上面 I used tar cvpzf file tar gz压缩一个完整的目录 我将文件移动到另一台服务器 并尝试解压缩复制存档的目录 无法使其发挥作用 bash 3 2 tar xvpzf news tar gz tar
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截
  • 在 Windows 上为 Bitbucket 设置 SSH 密钥

    首先 我对 git repos 和命令行绝对是菜鸟 我在 Bitbucket 上有仓库 我基本上希望能够通过 gitbash 推送到存储库 而无需每次输入密码 我拥有的 Bitbucket 上的存储库已设置好代码 克隆存储库的本地目录 通过
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 我如何知道 std::map 插入成功还是失败?

    我在多线程应用程序中有一个映射 将名为 uuid 的类映射到指针 我想知道插入操作是否成功或失败 e g mymap insert hint MyMap value type entry uuid itemptr 如果失败的话会抛出异常或者
  • Mongo:无法连接到服务器 127.0.0.1:27017 位于 src/mongo/shell/mongo.js:145

    当我尝试在 ubuntu 中的 shell 中运行 mongo 或打开 rockmongo 时 我看到以下错误 couldn t connect to server 127 0 0 1 27017 at src mongo shell mo
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一

随机推荐

  • Linux--信号

    文章目录 信号入门 生活角度的信号 技术应用角度的信号 注意 信号概念 使用kill l命令可以查看系统定义的信号列表 信号处理常见的方式 产生信号 1 通过终端按键产生信号 Core Dump 使用core dump进行事后调试 2 系统
  • How far away ? 【HDU - 2586】【在线LCA算法讲解】

    题目链接 做些LCA的算法 还是很提高代码能力的 这道题就是典型的LCA模板 所以用它来练一下我的LCA算法还是很好的 我们要求的是在一棵树上的任意两点的相互距离 既然在一棵树上 就可以直接调用LCA来解了 我们先任取一根节点 我取的是1
  • Tensorflow高级API

    本文个人博客地址 点击查看 一 Estimator 1 介绍 编程堆栈 Estimator 代表一个完整的模型 Estimator API 提供一些方法来训练模型 判断模型的准确率并生成预测 数据集 构建数据输入管道 Dataset API
  • ORA-01861错误

    ORA 01861 错误一般是日期 字符 数字类型互换时产生的错误 日期型数据有误或者安装Oracle时设置NLS DATE LANGUAGE为美国 或其他国家 也有可能导致ORA 01861错误 因为的日期写法有些不一样 亚洲是 RR M
  • Oracle数据库sql语句处理业务表重复数据取其一

    背景 在日常的工作中 我们会遇见一张表中存在重复的数据 这个重复的数据是指几个字段组成一个唯一索引的 但是因为在加工数据的过程中 会去掉这个唯一索引 但是在迁移到业务表中需要这个唯一索引 或者是业务要求等条件的 如下就演示了如何取其一 如下
  • css滚动条不占用宽度_CSS隐藏滚动条并可以滚动内容的几种方式

    前言 当我们的内容超出了我们的 div 往往会出现滚动条 影响美观 尤其是当我们在做一些导航菜单的时候 滚动条一出现就破坏了 UI 效果 我们不希望出现滚动条 也不希望超出去的内容溢出 就要保留鼠标滚动的效果 我们经常在前端开发中遇到这种情
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 有关python 输出彩色字符,不按颜色显示的问题

    因工作需要 做了一些小程序 python有助于工作效率 能处理WORD excel等常用办公文件 在小程序中 往往为了提示 做一些提示 但提示一多 个别重要信息就无法起到作用 对于些重要的提示 想加一些颜色显示 找了N多的网站和帖子 大多数
  • 位运算n & (n-1)的妙用

    本文转自 http blog csdn net zheng0518 article details 8882394 按位与的知识 n n 1 作用 将n的二进制表示中的最低位为1的改为0 先看一个简单的例子 n 10100 二进制 则 n
  • 行指针(对二维数组,多维数组的深层理解)

    行指针 定义 对二维数组的理解 多维数组的理解 二维数组 多维数组向函数传递参数 二维数组 三维数组 定义 声明行指针的语法 数据类型 行指针名 行的大小 行的大小即数组长度 int p1 3 p1是行指针 用于指向数组长度为3的int型数
  • 【周末闲谈】文心一言,模仿还是超越?

    个人主页 个人主页 系列专栏 周末闲谈 周末闲谈 第一周 二进制VS三进制 文章目录 周末闲谈 前言 一 背景环境 二 文心一言 三 文心一言的优势 四 文心一言能否为百度止颓 五 总结 前言 经过了一周的忙碌 周末如期而至 今天我们来聊聊
  • 如何写简历,Web前端简历

    面试官到底想看什么样的简历 面试一直是程序员跳槽时期非常热门的话题 虽然现在已经过了跳槽的旺季 下一轮跳槽需要年底才会出现 但是当跳槽季的时候你再看这篇文章可能已经晚了 过冬的粮食永远不是冬天准备的 而是秋收的时候 点个关注 点个收藏 需要
  • 【计算机视觉

    文章目录 一 GreedyNAS C 二 RegionViT 三 DenseNAS B 四 DenseNAS C 五 DiCENet 六 uNetXST 七 CSPPeleeNet 八 PocketNet 九 OODformer 十 Dee
  • 红外热成像+可见光双光可融合单IP相机

    红外和可见光同时拍摄双光单IP相机可为无人机 机器人 科研机构等提供可靠的视觉效果和数据分析 相机参数可实现定制化服务 让项目达到最佳效果 常规参数如下 相机双光图像单IP输出 可实现视频图像无缝融合 不仅能够看得清 还能看得准 相机数据可
  • android 点击浏览大图,一个图片浏览器,支持超大图、超长图 BigImageViewPager

    BigImage ImageView ViewPager BigImageViewPager 一个图片浏览器 支持超大图 超长图 支持手势放大 支持查看原图 下载 加载百分比进度显示 采用区块复用加载 优化内存占用 有效避免OOM 截图 功
  • Stream调试

    java的stream即流式处理 编码十分简洁 但是却给调试带来了极大的不便 idea推出了streamtrace功能 可以详细看到每一步操作的关系 结果 非常方便进行调试 初遇StreamTrace 这里简单将字符串转成它的字符数 并设置
  • 银屑病药物争相涌现,将惠及国内600万以上银屑病患者

    origin https www jiemian com article 3629136 html 生物制剂在重度银屑病患者中 清除率高且副作用小 但要如何增加可及性 金淼Jemma 2019 10 30 10 44浏览 2 9w来源 界面
  • 【滑动窗口】算法实战

    文章目录 一 算法原理 二 算法实战 1 leetcode209 长度最小的子数组 2 leetcode3 无重复字符的最长子串 3 leetcode1004 最大连续1的个数 4 leetcode1685 将x减到0的最小操作数 5 le
  • log4j中appender的简介说明

    转自 log4j中appender的简介说明 下文笔者将讲述log4j中的appender的简介说明 如下所示 log4j的appender的功能 log4j中appender的功能 用于定义输出文件的方式 有以下5种输出方式可定义 1 o
  • java使用jsch连接ssh远程服务器

    java这边没有很好的封装工具连接ssh jsch使用起来只是略微方便一点 使用的时候可以封装成工具自己使用 jsch有2种方式和客户端进行交互 ChannelShell和ChannelExec ChannelShell和ChannelEx