Java implements SCP to carry password copy file

Background Note

In the scenario involving file copy between machines through a program, we generally use ssh to connect to the machine and copy files through the scp command.

The premise of this solution is that password-free communication between machines must be configured in advance.

However , if there are too many machines on site, it will be troublesome to configure secret-free operation; or for security reasons, the customer does not allow secret-free access between machines.

At this time, it is necessary to find another way and find other solutions to achieve it.

Requirement scenario: Provide the machine's IP, login user name, and login password, but do not configure secret-free login between machines to realize file transfer between machines.


Java implementation

1. Tools

ScpUtil.java

package com.miracle.luna.scp;

import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.scp.client.ScpClient;
import org.apache.sshd.scp.client.ScpClientCreator;

/**
 * @author Miracle Luna
 * @date 2021/7/19
 */
public class ScpUtil {
    
    

//    private static String host = "192.168.67.48";
    private static String host = "192.168.67.39";
//    private static String host = "192.168.71.29";
    private static String username = "root";
    private static String password = "password";
    private static Integer port = 22;

//    private static String local = "F:\\miracle\\*";
    private static String local = "/home/miracle/*";
    private static String remote = "/home/luna/";
//    private static String remote = "F:\\luna\\";

    public static void scpFile(String local, String remote) throws Exception {
    
    
        long startTime = System.currentTimeMillis();

        // 创建 SSH客户端
        SshClient client = SshClient.setUpDefaultClient();
        // 启动 SSH客户端
        client.start();
        // 通过主机IP、端口和用户名,连接主机,获取Session
        ClientSession session = client.connect(username, host, port).verify().getSession();
        // 给Session添加密码
        session.addPasswordIdentity(password);
        // 校验用户名和密码的有效性
        boolean isSuccess = session.auth().verify().isSuccess();

        // 认证成功
        if (isSuccess) {
    
    
            long middleTime = System.currentTimeMillis();
            System.out.println("Connect host cost time: " + (middleTime - startTime) / 1000.0 + "s.");

            ScpClientCreator creator = ScpClientCreator.instance();
            // 创建 SCP 客户端
            ScpClient scpClient = creator.createScpClient(session);

            System.out.println("Scp beginning.");
            // ScpClient.Option.Recursive:递归copy,可以将子文件夹和子文件遍历copy
            scpClient.upload(local, remote, ScpClient.Option.Recursive);
            System.out.println("Scp finished.");

            // 释放 SCP客户端
            if (scpClient != null) {
    
    
                scpClient = null;
            }

            // 关闭 Session
            if (session != null && session.isOpen()) {
    
    
                session.close();
            }

            // 关闭 SSH客户端
            if (client != null && client.isOpen()) {
    
    
                client.stop();
                client.close();
            }
        }

        long endTime = System.currentTimeMillis();
        System.out.println("Total Cost time: " + (endTime - startTime) / 1000.0 + "s.");
    }

    public static void main(String[] args) throws Exception {
    
    
        scpFile(local, remote);
    }
}

2. Running results

Connect host cost time: 6.519s.
Scp beginning.
Scp finished.
Total Cost time: 9.569s.

3. Maven dependency

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-common -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-common</artifactId>
    <version>2.7.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-core -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-core</artifactId>
    <version>2.7.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-scp -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-scp</artifactId>
    <version>2.7.0</version>
</dependency>

Supplementary Note

This method is applicable to file copy between Linux to Linux, Linux to Windows, Windows to Linux, and Windows to Windows.

(The prerequisite for file interaction with Windows is: Windows has an SSH server installed, such as OpenSSH, FreeSSHd, Bitvise SSH Server, etc.)


Guess you like

Origin blog.csdn.net/aikudexiaohai/article/details/132126664