Java通过OpenSSH(ssh2/ScpClient)远程连接Windows10实现传输文件、解压缩包、执行命令等操作

这篇具有很好参考价值的文章主要介绍了Java通过OpenSSH(ssh2/ScpClient)远程连接Windows10实现传输文件、解压缩包、执行命令等操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境准备

远程机器A:Windows 10 专业版 22H2
本地环境:jdk8

安装OpenSSH 服务

1、安装

设置 --> 应用 --> 应用和功能 --> 可选功能 --> 添加功能
java ssh,java,linux,ssh2,scpclient,传输文件

java ssh,java,linux,ssh2,scpclient,传输文件

由于我已经安装,在以安装功能里面即可找到。未安装的用户选择添加功能添加即可

2、开启服务

win + r 输入 services.msc

java ssh,java,linux,ssh2,scpclient,传输文件

启动 OpenSSH SSH Server 服务

java ssh,java,linux,ssh2,scpclient,传输文件

3、验证是否安装成功

输入ssh 出现如下提示即安装成功

C:\Users\SERVER>ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

代码开发

1、pom文件引入

<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
 </dependency>

2、OpenSshClient 工具类

package com.ncst;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.Objects;


/**
 * @Author: Lisy
 * @Date: 2023/05/30/14:44
 * @Description: ssh2工具类
 */
@Slf4j
public class OpenSshClient {

    private final String ip;
    private final int port;
    private final String username;
    private final String password;

    public OpenSshClient(String ip, int port, String username, String password) {
        this.ip = ip;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    public OpenSshClient(String ip, String username, String password) {
        this.ip = ip;
        this.port = 22;
        this.username = username;
        this.password = password;
    }

    public void execCommand(String command) {
        Connection conn = new Connection(ip, port);
        Session sess = null;
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            if (isAuthenticated) {
                log.info("【远程执行命令】:{} 连接成功,---执行命令:{}", ip, command);
            } else {
                log.info("【远程执行命令】:{} 连接失败,请检查用户密码是否正确", ip);
            }
            sess = conn.openSession();
            sess.execCommand(command);

            //回显信息
            InputStream is = new StreamGobbler(sess.getStdout());
            BufferedReader brs = new BufferedReader(new InputStreamReader(is));
            while (true) {
                String line = brs.readLine();
                if (line == null) {
                    break;
                }
                System.out.println(line);
            }
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        } finally {
            if (Objects.nonNull(sess)) {
                sess.close();
            }
            conn.close();
        }
    }

    public void getFile(String remoteFile, String localTargetDirectory) {
        Connection conn = new Connection(ip, port);
        try {
            SCPClient client = getScpClient(conn);
            client.get(remoteFile, localTargetDirectory);
            conn.close();
            log.info("【获取文件成功】{}:{}", ip, remoteFile);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        }
    }

    /**
     * 上传文件
     * @param localFile             本地文件位置
     * @param remoteTargetDirectory 远程机器接收文件目录
     */
    public void putFile(String localFile, String remoteTargetDirectory) {
        Connection conn = new Connection(ip, port);
        try {
            SCPClient client = getScpClient(conn);
            client.put(localFile, remoteTargetDirectory);
            log.info("【文件远程上传】{} 上传成功", ip);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        } finally {
            conn.close();
        }
    }

    /**
     * 上传文件并对远程机器上的文件重命名
     * @param localFile
     * @param remoteFileName
     * @param remoteTargetDirectory
     * @param mode
     */
    public void putFileRename(String localFile, String remoteFileName, String remoteTargetDirectory, String mode) {
        Connection conn = new Connection(ip, port);
        try {
            SCPClient client = getScpClient(conn);
            if ((mode == null) || (mode.length() == 0)) {
                mode = "0600";
            }
            client.put(localFile, remoteFileName, remoteTargetDirectory, mode);

            //重命名
            Session sess = conn.openSession();
            String tmpPathName = remoteTargetDirectory + File.separator + remoteFileName;
            String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf("."));
            sess.execCommand("mv " + remoteFileName + " " + newPathName);

            log.info("【文件远程上传】{} 上传成功", ip);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        } finally {
            conn.close();
        }
    }

    public void putFile(String localFile, String remoteFileName, String remoteTargetDirectory) {
        Connection conn = new Connection(ip, port);
        try {
            SCPClient client = getScpClient(conn);
            client.put(getBytes(localFile), remoteFileName, remoteTargetDirectory);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        } finally {
            conn.close();
        }
    }

    /**
     * 将文件输入到字节数组
     *
     * @param filePath 文件路径
     * @return 字节数组
     */
    private byte[] getBytes(String filePath) {
        byte[] buffer = null;
        File file = new File(filePath);
        try (FileInputStream fis = new FileInputStream(file);
             ByteArrayOutputStream bos = new ByteArrayOutputStream(1024 * 1024)) {

            byte[] b = new byte[1024 * 1024];
            int i;
            while ((i = fis.read(b)) != -1) {
                bos.write(b, 0, i);
            }
            buffer = bos.toByteArray();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return buffer;
    }

    private SCPClient getScpClient(Connection conn) throws IOException {
        conn.connect();
        boolean isAuthenticated = conn.authenticateWithPassword(username, password);
        if (isAuthenticated) {
            log.info("【文件远程上传】{} 连接成功", ip);
        } else {
            log.error("【文件远程上传】{} 验证失败", ip);
        }

        return new SCPClient(conn);
    }

}

3、安装7z

编写 bat 脚本,在远程机器上面静默安装,命名为 install7z.bat

start /wait E:\\7z.exe /S

4、准备7z.exe 安装包

在官网下载文章来源地址https://www.toymoban.com/news/detail-627764.html

4、测试类

	/**
     * 传输压缩包和7z并在远程机器上面解压并执行命令
     */
     public static void main(String[] args) {
        OpenSshClient winClient = new OpenSshClient("192.168.22.40", 22, "Admin", "123456");
        String remoteDir = "E:\\";
        String fileName = "a.zip";

        // 传输7z.exe 和安装7z.exe脚本
        winClient.putFile("E:\\testTmp\\7z.exe", "7z.exe", remoteDir);
        winClient.putFile("E:\\testTmp\\install7z.bat", "install7z.bat", remoteDir);

        // 安装7z.exe
        winClient.execCommand(remoteDir + "install7z.bat");

        // 传输客户端
        winClient.putFile("E:\\testTmp\\" + fileName, fileName, remoteDir);
        // 解压脚本
        winClient.execCommand("C:\\\"Program Files\"\\7-Zip\\7z x E:\\a.zip -oE:\\");

        // 删除安装包
        winClient.execCommand("del E:\\a.zip");
        winClient.execCommand("del E:\\7z.exe");
    }

到了这里,关于Java通过OpenSSH(ssh2/ScpClient)远程连接Windows10实现传输文件、解压缩包、执行命令等操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pycharm通过ssh远程连接服务器

    笔记本没有英伟达独显,需要跑深度学习的代码,可以使用pycharm远程连接服务器,将本机代码同步到实验室服务器中运行, 注意: (1)只有专业版的pycharm才可以远程连接服务器;(2)专业版pycharm可以通过学校电子邮箱申请免费版,或者搜一下相关版本的破解码,自己使用

    2024年01月23日
    浏览(51)
  • 如何通过ssh远程连接自己的主机(Linux)?

    可以看到,有多块网卡在工作,其中eno1是有线网卡,UP表示开启了,但没有运行(RUNNING),因为此时主机并没有连接有线网络。 lo是本地虚拟网卡,所有设备都为127.0.0.1,可以在没有网络的环境中用来测试。 wlp4s0是无线网卡,它被开启(UP),且正在工作(RUNNING)。第二行

    2024年02月04日
    浏览(41)
  • 【保姆级教程】PyCharm通过SSH远程连接ModelArts

    首先,找到 云资源 下面的 ModelArts ,然后点击并进入 ModelArts控制台 。 在 ModelArts控制台 中,点击 开发环境 下的 Notebook 。然后点击 创建 ,创建一个 Notebook。 根据个人需求设置名称、选择资源规格等。然后,勾选 SSH远程开发 ,点击 密钥对 右侧的“ 立即创建 ”。 创建 密

    2024年02月12日
    浏览(55)
  • pycharm通过ssh远程连接服务器,并运行代码

    首先连接远程服务器,tool-deplayment-configuration 连接ssh,点击+,选择SFTP,然后取名 点击ssh后面的...,依次输入远程服务器的IP,用户名,密码 点击test connection,测试是否连接成功 点击确定回到上个界面,root path 是服务器的路径,可以不选,但之后remote host后会过于冗长,可以根据

    2024年02月05日
    浏览(97)
  • 使用SSH通过FinalShell远程连接Ubuntu服务器

    Windows系统 Ubuntu16.04.6(以上版本通用) 虚拟机、服务器 安装SSH服务 首先执行sudo以root的身份执行指令: 接下来需要在Ubuntu服务器端安装SSH服务,在Ubuntu终端输入以下指令: tips:在执行上述指令时,可能会遇到安装失败的情况,此时输入以下指令: 然后再输入以下指令:

    2024年02月03日
    浏览(55)
  • vscode通过ssh连接远程服务器+免密登录(图文)

    1.打开Visual Studio Code,进入拓展市场(Ctrl+Shift+X),下载拓展Remote - SSH 2. 点击远程资源管理器选项卡,并选择远程(隧道/SSH)类别 3. 点击ssh配置 4.在弹出的选择配置文件中,点击第一个  5.在config文件中输入以下内容 如: 6.保存后点击左边刷新按钮  7.这时展开SSH,就能看到刚刚

    2024年02月14日
    浏览(60)
  • 0404---通过SSH连接远程服务器运行图形界面程序问题

    ​ 通常部署在数据中心机房中的服务器是没有图形桌面的,对服务器的日常运维也往往通过远程客户端命令窗口来进行,但有时候往往需要在服务器上远程安装或运行图形窗口类软件,图形窗口的本地显示往往困扰很多人,譬如在远程安装 oracle数据库系统的时候,因安装系

    2024年02月14日
    浏览(43)
  • windows下ssh远程连接服务器

    -p:选择端口号,这里选择端口号22 @之前为用户名,之后为服务器IP地址 服务器一般只能通过内网连接,如果pc没有连接内网,需要先登录能通过公网访问的跳板机,在连接到服务器。 username@192.168.24.105是用户名和目标主机ip -J之后是跳板机用户名和跳板机ip 打开vscode,点击远

    2024年02月06日
    浏览(46)
  • 通过navcat的ssh连接 将一个服务器当作跳板连接远程mysql

    简单来说 一共三台机器 windows Linux(入口) Linux(mysql) windows 可以通过ssh 私钥连接Linux(入口) Linux(入口)可以连接 Linux(mysql) 但是windows 不能直接 访问Linux(mysql) 于是 长话短说 3张图教你通过使用navcat的ssh连接 1.新建MySql连接 2.选择上方的ssh选项 选择你可以通过ss

    2024年02月03日
    浏览(46)
  • Jenkins通过SSH远程执行Windows批处理bat程序

    确保Windows上成功安装了OpenSSH,可参考:Windows系统下安装OpenSSH-CSDN博客 自行百度 系统管理系统配置,找到Publish over SSH,点击新增 点击 Test Configuration,提示Success,即成功。 关于Remote Directoy参数: 1.为空或不填,会工作在C:UsersAdministrator目录下,即Username对应的目录下 2.如

    2024年04月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包