如何从源服务器“scp”文件并将它们平均分配给三个目标服务器?

如何从源服务器“scp”文件并将它们平均分配给三个目标服务器?

我正在寻找一个脚本,用于将文件从源服务器目录复制/opt/Test并按非连续顺序均匀地分配到三个目标服务器目录中。

例如我想将一些文件从源 Server-A/ 目录复制到目标服务器-B, 目的地服务器-C目录并将剩余文件复制到目标服务器-D目录。

我想要这样的东西:

源服务器

**Server-A/**
├── file0
├── file1
├── file2
├── file3
├── file4
├── file5
├── file6
├── file7
├── file8
└── file9

目标服务器

**SERVER-B**
├── file0
├── file3
├── file6
└── file9

**SERVER-C**
├── file1
├── file4
└── file7

**SERVER-D**
├── file2
├── file5
└── file8

答案1

使用scp将文件从本地主机复制到远程主机的步骤如下:

scp file username@remote-host:/remote/directory/

file您要复制到远程主机的本地文件在哪里?username远程主机上的有效用户名是什么?remote-host远程主机的实际地址/IP 是什么?/remote/directory/远程主机上目标目录的完整路径是什么?... 每次将文件复制到远程主机时,都需要输入密码,除非您设置了无密码的“SSH 密钥验证”。

为了实现你的目标,你需要准备和测试三个scp命令(每个远程服务器一个)像这样:

scp file username@Host-B:/remote/directory/

scp file username@Host-C:/remote/directory/

scp file username@Host-D:/remote/directory/

这三个命令行是使用的示例scp,它们应该适合您的用例,但您也可以使用任何其他工具,例如rsync

请注意,scp由于与远程服务器的连接不良/断开,其他远程文件复制实用程序容易失败.​​..因此,我建议还检查scp0成功则退出,>0否则) 例如until [ "$s" = 0 ]; do ... done$s保存最后执行的命令的退出状态scp,以便如果该命令未能成功将文件复制到其中一个远程服务器,则脚本将尝试将该文件复制到下一个服务器,确保所有文件都被复制到工作服务器,即使其中一个或多个存在连接问题。

然后在 for 循环中交替使用它们,如下所示:

#!/bin/bash

# This script should be run on Server-A

i=1
for f in /opt/Test/*; do
  s=1
  until [ "$s" = 0 ]; do
      if [ "$i" = 1 ]; then
        scp "$f" username@Host-B:/remote/directory/
        s="$?"
        i=2
      elif [ "$i" = 2 ]; then
        scp "$f" username@Host-C:/remote/directory/
        s="$?"
        i=3
      elif [ "$i" = 3 ]; then
        scp "$f" username@Host-D:/remote/directory/
        s="$?"
        i=1
      fi
    done
  done

或者,考虑将服务器 B、服务器 C 和服务器 D 中的远程目录挂载为服务器 A 上的本地共享,并使用例如在本地复制到它们(cp如果这是一个选项,因为这将更高效、更快...假设您将它们挂载在挂载点上/mnt/B//mnt/C/然后/mnt/D/需要修改脚本以cp如下所示使用:

#!/bin/bash

# This script should be run on Server-A

i=1
for f in /opt/Test/*; do
  s=1
  until [ "$s" = 0 ]; do
      if [ "$i" = 1 ]; then
        cp -- "$f" /mnt/B/
        s="$?"
        i=2
      elif [ "$i" = 2 ]; then
        cp -- "$f" /mnt/C/
        s="$?"
        i=3
      elif [ "$i" = 3 ]; then
        cp -- "$f" /mnt/D/
        s="$?"
        i=1
      fi
    done
  done

相关内容