Java通过OpenSSH上传文件到远程Windows服务器,并远程解压zip包

简介: Java通过OpenSSH上传文件到远程Windows服务器,并远程解压zip包

目录

1.系统环境准备

2.安装OpenSSH

win10 开启OpenSSH服务

非 win10 安装OpenSSH服务

OpenSSH服务新增用户

OpenSSH验证是否安装成功

3.安装WinRAR--远程解压zip包

WinRAR 解压命令

SSH远程winrar不是内部或外部命令,也不是可运行的程序

问题描述:

解决办法

4. Java通过SSH实现文件上传和解压

依赖包

OpenSSH工具类

远程上传文件

远程解压文件



1.系统环境准备

  • OpenSSH
  • WinRAR


2.安装OpenSSH

OpenSSH是用于使用SSH协议进行远程登录的主要连接工具。它对所有流量进行加密,以消除窃听,连接劫持和其他攻击。此外,OpenSSH还提供了一整套安全的隧道功能,多种身份验证方法和复杂的配置选项。

OpenSSH套件包含以下工具:


win10 开启OpenSSH服务

设置-应用-应用和功能-管理可选功能-添加功能

安装OpenSSH服务器和客户端,提示需要重启完成安装,重启电脑


非 win10 安装OpenSSH服务

1. 下载OpenSSH windows版本

下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases

2  解压到C:\Program Files\OpenSSH (官方要求地址)

3 cmd到OpenSSH服务

1)安装sshd服务

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

2)开放22端口(如果你在windows关闭了防火墙并配置了入站规则可以不执行如下命令,多执行不影响)

netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22

3)配置开机自启sshd服务

sc config sshd start= auto

到此就安装完成

4) 将C:\Program Files\OpenSSH添加到path中,免得每次都要切到C:\Program Files\OpenSSH才能使用ssh,启动ssh服务

net start sshd

新增系统环境变量


启动OpenSSH服务

net start sshd

OpenSSH SSH Server 服务正在启动 .

OpenSSH SSH Server 服务已经启动成功。


OpenSSH服务新增用户

net user root 123456 /add

net user root 123465 /active


OpenSSH验证是否安装成功

安装成功之后,在cmd命令提示符窗口中输入 ssh 即可运行OpenSSH。如下图


3.安装WinRAR--远程解压zip包

1)安装WinRAR解压软件(5.30版本)

2)新增系统环境变量


WinRAR 解压命令

winrar x D:\WebVr\zip\0ebbd570a3cd424fadd6947742e7073f\Train.zip -r D:\WebVr\zip\0ebbd570a3cd424fadd6947742e7073f\


SSH远程winrar不是内部或外部命令,也不是可运行的程序

问题描述:

1.通过ssh远程控制用户

命令:ssh root@10.0.50.236  输入密码后

2.通过winrar命令行解压文件

命令:winrar x 文件路径及文件名 -r wenjian 文件路径

示例:winrar x D:\WebVr\zip\71ee2c8ef24248e9b1368cac6831f16b\Train.zip -r D:\WebVr\zip\71ee2c8ef24248e9b1368cac6831f16b\

提示:


解决办法

根本来说, WinRAR 在系统变量的PATH路径信息没有更新

1.通过ssh远程控制用户

命令:ssh root@10.0.50.236

2.回显环境变量

命令:echo %PATH%

3.查看系统环境变量以及用户环境变量

4.对比系统环境变量与回显环境变量是否一致,不一致为此问题的原因

5.修改系统环境变量,(winrar建议安装在默认位置)

 

6.重启openssh服务,重新加载PATH信息

命令:services.msc

7.回显环境变量,最终检查

命令:echo %PATH%

红色框为新增路径,蓝色框为原来错误路径,蓝色框路径存在不影响

8.解压

命令:winrar x 文件路径及文件名 -r wenjian 文件路径

示例:winrar x D:\WebVr\zip\71ee2c8ef24248e9b1368cac6831f16b\Train.zip -r D:\WebVr\zip\71ee2c8ef24248e9b1368cac6831f16b\

4. Java通过SSH实现文件上传和解压

依赖包

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


OpenSSH工具类

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * @Title:  OpenSSH 工具类
 * @ClassName: com.ruoyi.release.utils.OpenSSHClient.java
 * @Description:
 *
 * @Copyright 2020-2021 - Powered By 研发中心
 * @author: 王延飞
 * @date:  2020/9/4 0004 14:20
 * @version V1.0
 */
public class OpenSSHClient {
    private static final org.slf4j.Logger log = LoggerFactory.getLogger(OpenSSHClient.class);
    public OpenSSHClient(String IP, int port, String username, String passward) {
        this.ip = IP;
        this.port = port;
        this.username = username;
        this.password = passward;
    }
    /**
     * @Title:
     * @MethodName:  execCommand
     * @param command
     * @Return void
     * @Exception
     * @Description:
     *
     * @author: 王延飞
     * @date:  2020/9/4 0004 14:56
     */
    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 == false) {
                log.error("authentication failed");
            }
            log.info("【主机】:{}连接成功,---执行命令:{}", ip, command);
            sess = conn.openSession();
            sess.execCommand(command);
            //将Terminal屏幕上的文字全部打印出来
            InputStream is = new StreamGobbler(sess.getStdout());
            BufferedReader brs = new BufferedReader(new InputStreamReader(is));
            while (true) {
                String line = brs.readLine();
                if (line == null) {
                    break;
                }
                //log.info("【主机】:{}连接成功,---执行命令:{},===返回结果:{}", ip, command, line);
                System.out.println(line);
            }
        } catch (IOException ex) {
            Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);
        }finally {
            //连接的Session和Connection对象都需要关闭
            if (sess != null) {
                sess.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
    public void getFile(String remoteFile, String localTargetDirectory) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                log.error("authentication failed");
            }
            log.info(ip+"【连接成功】");
            SCPClient client = new SCPClient(conn);
            client.get(remoteFile, localTargetDirectory);
            conn.close();
        } catch (IOException ex) {
            Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);
        }
    }
    public void putFile(String localFile, String remoteTargetDirectory) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                log.error("authentication failed");
            }
            log.info(ip+"【连接成功】");
            SCPClient client = new SCPClient(conn);
            client.put(localFile, remoteTargetDirectory);
            conn.close();
        } catch (IOException ex) {
            Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);
        }
    }
    /**
     * @Title: 文件远程上传
     * @MethodName:  putFile
     * @param localFile
     * @param remoteFileName
     * @param remoteTargetDirectory
     * @param mode
     * @Return void
     * @Exception
     * @Description:
     *
     * @author: 王延飞
     * @date:  2020/9/7 0007 16:23
     */
    public void  putFile(String localFile, String remoteFileName,String remoteTargetDirectory,String mode) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                log.error("【文件远程上传】"+ip+"authentication failed");
            }
            log.info("【文件远程上传】"+ip+"【连接成功】");
            SCPClient client = new SCPClient(conn);
            if((mode == null) || (mode.length() == 0)){
                mode = "0600";
            }
            client.put(localFile, remoteFileName, remoteTargetDirectory, mode);
            //重命名
            ch.ethz.ssh2.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+"【上传成功】");
            conn.close();
        } catch (IOException ex) {
            Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);
        }
    }
    public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory) {
        Connection conn = new Connection(ip,port);
        try {
            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username,
                    password);
            if (isAuthenticated == false) {
                log.error("authentication failed");
            }
            log.info(ip+"【连接成功】");
            SCPClient client = new SCPClient(conn);
            client.put(getBytes(localFile), remoteFileName, remoteTargetDirectory);
            conn.close();
        } catch (IOException ex) {
            Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);
        }
    }
    public static byte[] getBytes(String filePath) {
        byte[] buffer = null;
        try {
            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024);
            byte[] b = new byte[1024*1024];
            int i;
            while ((i = fis.read(b)) != -1) {
                byteArray.write(b, 0, i);
            }
            fis.close();
            byteArray.close();
            buffer = byteArray.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }
    private String ip;
    private int port;
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public static String ScannerPortisAlive(int port) {
        String result = "OPEN";
        Socket socket = null;
        try {
            socket = new Socket();
            InetAddress ip = InetAddress.getLocalHost();
            SocketAddress address = new InetSocketAddress(ip, port);
            socket.connect(address, 100);
            socket.close();
//            Socket testPortSocket = new Socket(HostIP, port);
//            testPortSocket.close();
        } catch (IOException e) {
            result = "CLOSE";
        }
        return result;
    }
    public static void main(String[] args) {
        OpenSSHClient scpclient = new OpenSSHClient("10.0.50.236", 22, "root", "123456");
        scpclient.putFile("C:\\Users\\Administrator\\Desktop\\Middle.bat", "Middle.bat", "D:\\WebVr\\zip", null);
    }
}


远程上传文件

OpenSSHClient scpclient = new OpenSSHClient(ip, 22, opensshUsername, opensshPassword);
try {
  // 1.3.2.1 创建远程文件夹
  String makeDirCommand = "mkdir " + uploadPath;
  scpclient.execCommand(makeDirCommand);
  // 1.3.2.2 上传文件到远程服务器
  scpclient.putFile(uploadFullPath, zipFileName, uploadPath, null);
} catch (Exception e) {
  log.error("zip包远程分发失败,{}", e);
  return AjaxResult.error("zip包远程分发失败");
}


远程解压文件

OpenSSHClient scpclient = new OpenSSHClient(ip, 22, opensshUsername, opensshPassword);
// 1.3.2.4 zip包远程解压
// https://blog.csdn.net/huaairen/article/details/88067598
//在服务器上解压zip到指定路径下
// winrar x -r
String unzipCommand = "winrar x " + uploadFullPath + " -r  " + uploadPath;
/**
 * /P 删除每一个文件之前提示确认。
 * /F 强制删除只读文件。
 * /S 从所有子目录删除指定文件。
 * /Q 安静模式。删除全局通配符时,不要求确认。
 * /A 根据属性选择要删除的文件。
 */
String deleteServerCommand = "del /f/s/q " + uploadFullPath;
scpclient.execCommand(unzipCommand);
try {
  // 1.3.2.4 远程zip包删除
  //延迟5秒再删除,可能解压没有结束
  Thread.sleep(5000);
  scpclient.execCommand(deleteServerCommand);
} catch (Exception e) {
  e.printStackTrace();
}

 


目录
相关文章
|
2月前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
43 2
|
1月前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
34 3
java读取linux服务器下某文档的内容
|
24天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
65 4
|
1月前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
91 4
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
51 4
|
2月前
|
Kubernetes Java Maven
揭秘无服务器革命:Quarkus如何让Java应用在云端“零”负担起飞?
本文介绍如何使用Quarkus从零开始开发无服务器应用,通过示例代码和详细步骤引导读者掌握这一技术。无服务器架构让开发者无需管理服务器,具有自动扩展和成本效益等优势。Quarkus作为Kubernetes Native Java框架,优化了Java应用的启动速度和内存使用,适合无服务器环境。文章涵盖环境搭建、项目创建及部署全流程,并介绍了Quarkus的扩展性和监控工具,助力高效开发与应用性能提升。
48 9
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
32 3
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
27 0
|
3月前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known