我正在寻找一个脚本,用于将文件从源服务器目录复制/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
由于与远程服务器的连接不良/断开,其他远程文件复制实用程序容易失败...因此,我建议还检查scp
(0
成功则退出,>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