1.rsync
1.1介绍
rsync 是一个非常强大的文件同步工具,它用于在本地计算机之间或通过网络在不同计算机之间高效地复制文件和目录。rsync 支持增量复制,这意味着它只会传输自上次同步以来发生变化的部分数据,从而显著减少网络带宽的使用。
基本语法
rsync 的基本语法如下:
rsync [options] source destination
- source: 源文件或目录。
- destination: 目标文件或目录。
常用选项
- -a, --archive: 归档模式,等同于 -rlptgoD,即递归复制文件、保持符号链接、权限、时间戳、所有权等。
- -r, --recursive: 递归复制整个目录。
- -v, --verbose: 显示详细信息。
- -z, --compress: 对数据进行压缩传输。
- -P: 等同于 -rp 和 --partial,即递归复制并允许部分传输。
- -e, --rsh=COMMAND: 指定远程 shell 命令,默认为 ssh。
- -h, --human-readable: 以人类可读的方式显示文件大小。
- -u, --update: 只传输那些源文件比目标文件新或者目标文件不存在的文件。
- -c, --checksum: 使用校验和来检测文件是否改变,而不是依赖于文件大小和最后修改时间。 通过 SSH 复制文件
假设你想从本地计算机复制文件到远程服务器,可以使用以下命令:
rsync -avz -e ssh /path/to/local/file user@remote_host:/path/to/remote/directory/
这里:
- -avz: 使用归档模式、详细输出和压缩传输。
- -e ssh: 使用 SSH 协议进行数据传输。
- /path/to/local/file: 本地文件路径。
- user@remote_host:/path/to/remote/directory/: 远程服务器上的目标路径。
从远程服务器复制文件
要从远程服务器复制文件到本地计算机,可以使用以下命令:
rsync -avz -e ssh user@remote_host:/path/to/remote/file /path/to/local/directory/
递归复制整个目录
要递归复制整个目录及其子目录,可以使用 -r 或 -a 选项:
rsync -avz -e ssh /path/to/local/directory/ user@remote_host:/path/to/remote/directory/
注意事项
确保你有足够的权限访问源和目标位置。
在复制大量数据时,考虑使用 -z 选项以减少网络流量。
使用 -v 选项可以帮助你了解 rsync 的执行进度。
如果远程服务器需要密码认证,确保你正确配置了 expect 脚本来处理密码提示。
1.2安装方式
sudo apt update
sudo apt install rsync -y
2.xsync实现
使用 rsync 与 expect 结合实现
expect实现自动输入密码
#!/bin/bash
#判断参数的个数
if [ $# -lt 1 ]
then
echo Not Enough Arhuement!
exit;
fi
#遍历集群所有机器
for host in hadoop002 hadoop003 hadoop004
do
echo ========== ${host} ==========
#遍历所有目录,挨个发送
for file in $@
do
#判断文件是否存在
if [ -e $file ]
then
#cd -P cd软连接进入的仍然是目标目录
pdir=$(cd -P $(dirname $file); pwd)
#获取文件名称
fname=$(basename $file)
# 标准的开启expect的脚本执行开始
/usr/bin/expect <<EOF
set timeout 30
spawn ssh root@${host} "mkdir -p $pdir"
expect {
"yes/no"
{
send "yes\r";
exp_continue
}
"password:"
{
send "12345678\r"
}
}
puts "${host}自动登录成功"
spawn rsync -av $pdir/$fname root@${host}:$pdir
expect {
"yes/no"
{
send "yes\r"
exp_continue
}
"password:"
{
send "12345678\r"
}
}
expect eof
EOF
else
echo $file does not exists!
fi
done
done
hadoop002 hadoop003 hadoop004是要广播的远程服务器
$(dirname $file) 获取所在文件的目录
$(basename $file) 获取文件名称
效果图
注意:
ssh root@${host} "mkdir -p $pdir"
ssh root@${host} “mkdir -p $pdir”,登录成功后会自动执行mkdir -p
p
d
i
r
,最后自动退出远程服务器,
s
s
h
r
o
o
t
@
pdir,最后自动退出远程服务器,ssh root@
pdir,最后自动退出远程服务器,sshroot@{host} 并不会自动退出而是停留再远程服务端交互界面。
因此使用ssh root@${host} “mkdir -p $pdir” 不用再执行send “exit \r”。