文章目录

  • 什么是SCP命令
  • 1. SCP命令的基本语法
  • 2. 从本地复制到远程
  • 3. 从远程复制到本地
  • Java实现远程文件复制
  • 步骤1:准备环境
  • 步骤2:创建代码
  • 步骤3:运行代码
  • 结论


本文主要介绍SCP命令以及如何使用Java在不同的远程服务器之间使用SCP命令(安全复制协议)复制文件/文件夹。

什么是SCP命令

SCP是Secure Copy的简写,用于在Linux下进行远程拷贝文件的命令。它的主要优点是可以在不泄露敏感信息的情况下在远程服务器计算机之间传输文件。因为是基于SSH协议的,所以具有很强的安全性。

1. SCP命令的基本语法

SCP命令的基本语法如下:

scp [参数] [源文件] [目标路径]

其中:

  • 参数:可以是一些选项,例如-r表示层级复制文件夹。
  • 源文件:要复制的文件或文件夹的路径。
  • 目标路径:文件复制到的目标路径,可以是远程服务器的路径,格式为[用户名]@[远程服务器IP]:[目标路径]

参数说明:

  • -1: 强制scp命令使用协议ssh1
  • -2: 强制scp命令使用协议ssh2
  • -4: 强制scp命令只使用IPv4寻址
  • -6: 强制scp命令只使用IPv6寻址
  • -B: 使用批处理模式(传输过程中不询问传输口令或短语)
  • -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
  • -p:保留原文件的修改时间,访问时间和访问权限。
  • -q: 不显示传输进度条。
  • -r: 递归复制整个目录。
  • -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
  • -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
  • -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
  • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
  • -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
  • -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式。
  • -P port:注意是大写的P, port是指定数据传输用到的端口号。
  • -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

2. 从本地复制到远程

在本地服务器上将/opt/files目录下所有的文件传输到服务器192.168.158.128的/opt目录下,命令为:

scp -r /opt/files root@192.168.158.128:/opt/

3. 从远程复制到本地

在本地服务器上操作,将服务器192.168.158.128上/opt目录下所有的文件全部复制到本地的/opt/files目录下,命令为:

scp -r root@192.168.158.128:/opt /opt/files/

Java实现远程文件复制

步骤1:准备环境

确保开发环境中安装了以下工具和库:

  • Java开发环境
  • JSch库:用于连接和执行SCP命令
<!-- jcraft JSch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.53</version>
</dependency>

因为命令执行的原因,需要确保服务器已经安装sshpass,主要用于自动化SSH密码输入

yum install sshpass

步骤2:创建代码

使用以下代码来实现远程文件复制功能:

/**
 * 远程复制文件工具类
 */
public class RemoteScpUtils {

    /**
     * 远程复制文件
     *
     * @param sourcePath                源文件路径
     * @param destinationPath           目标文件路径
     * @param sourceRemoteUsername      源远程用户名
     * @param sourceRemotePassword      源远程用户密码
     * @param sourceRemoteIp            源远程地址IP
     * @param destinationRemoteUsername 目标远程用户名
     * @param destinationRemotePassword 目标远程用户密码
     * @param destinationRemoteIp       目标远程地址IP
     * @throws JSchException 异常信息
     */
    public static void scpFileCommand(String sourcePath, String destinationPath, String sourceRemoteUsername, String sourceRemotePassword, String sourceRemoteIp, String destinationRemoteUsername, String destinationRemotePassword, String destinationRemoteIp) throws JSchException {
        JSch jsch = new JSch();
        Session session = null;
        Channel channel = null;

        try {
            // 创建SSH会话
            session = jsch.getSession(sourceRemoteUsername, sourceRemoteIp);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword(sourceRemotePassword);
            session.connect();

            // 打开SCP通道
            channel = session.openChannel("exec");

            // 构建SCP命令
            List<String> commandList = new ArrayList<>();
            commandList.add("sshpass -p " + destinationRemotePassword); // 跳过密码输入
            commandList.add("scp -r");      // 添加 scp 命令
            commandList.add(sourcePath);    // 添加源文件路径
            // 添加目标文件路径, 包括用户名和IP地址
            commandList.add(destinationRemoteUsername + "@" + destinationRemoteIp + ":" + destinationPath);
            String command = String.join(" ", commandList);

            // 设置命令
            ((ChannelExec) channel).setCommand(command);

            // 连接通道
            channel.connect();
        } finally {
            // 关闭通道
            if (channel != null && channel.isConnected()) channel.disconnect();
            // 关闭会话
            if (session != null && session.isConnected()) session.disconnect();
            System.out.println(":::::::::::::::::::::::: 远程复制文件成功 :::::::::::::::::::::");
        }
    }

}

测试代码:

@Test
public void scpTest() {

        String sourcePath = "/opt/files";               // 源文件路径
        String destinationPath = "/opt/";               // 目标文件路径
        String sourceRemoteUsername = "root";           // 远程服务器用户名
        String sourceRemotePassword = "root";           // 远程服务器密码
        String sourceRemoteIp = "192.168.xx.xx";        // 远程服务器IP
        String destinationRemoteUsername = "root";      // 远程服务器用户名
        String destinationRemotePassword = "root";      // 远程服务器密码
        String destinationRemoteIp = "192.168.xx.xx";   // 远程服务器IP

        try {
            // SCP复制文件
            // 将源服务器的 /opt/files 复制到目标服务器的 /opt 目录下
            RemoteScpUtils.scpFileCommand(
                    sourcePath,
                    destinationPath,
                    sourceRemoteUsername,
                    sourceRemotePassword,
                    sourceRemoteIp,
                    destinationRemoteUsername,
                    destinationRemotePassword,
                    destinationRemoteIp
            );
        } catch (JSchException e) {
            throw new RuntimeException(e);
        }

}

步骤3:运行代码

编译并运行上面的Java代码,将会连接到远程服务器并复制文件。如果没有复制成功需要检查一下环境尤其是sshpass有没有安装。

结论

通过这个简单的案例,就可以使用Java和SCP命令来创建一个远程文件复制工具。可以帮助在不同的远程服务器之间传输文件。

java 获取文件复制进度_java