0%

linux用rsync自动备份

QQ群:397745473

linux用rsync自动备份

rsync与scp的区别主要是rsync可以设置已经存在的文件不需要再次同步。

把156上的文件夹拷贝到本地机器

1
2
3
rsync -avzu --progress -rsh=ssh mission@10.1.1.156:/home/mission/StationPisPlayer/data/resource .

rsync -avzh --progress -e 'ssh -p 9922 -o StrictHostKeyChecking=no' backupUser@8.8.8.8:/home/backupUser/B/* .

服务器A 文件 自动同步到服务器B中, 基本实现步骤:

  1. 服务器B 创建一个专门用于备份的用户
  2. 限制服务器B 新建的用户不可访问服务器其他目录
  3. 服务器A访问服务器B 免密登陆
  4. 自动备份计划

限定操作目录

限制服务器B 新建的用户不可访问服务器其他目录 先创建目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
参考: https://developer.aliyun.com/article/192985
# sudo debootstrap buster /chroot/backup 也可以使用 debootstrap 命令来自动创建目录. 下面的方法是定制命令的方法

# mkdir -p /home/backup
# ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}
# mkdir -p /home/backup/dev/

# cd /home/backup/dev/
# mknod -m 666 null c 1 3
# mknod -m 666 tty c 5 0
# mknod -m 666 zero c 1 5
# mknod -m 666 random c 1 8
# chown root:root /home/backup
# chmod 0755 /home/backup
# ls -ld /home/backup

# mkdir -p /home/backup/bin
# ldd /bin/bash
# mkdir -p /home/backup/{lib64,lib}
# cp -v /lib/x86_64-linux-gnu/{libtinfo.so.6,libdl.so.2,libc.so.6} /home/backup/lib/
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/

服务器B 创建一个专门用于备份的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
## H7gZ3kWuSuFhprcvPA2Z
# useradd backupUser
# passwd backupUser

# mkdir /home/backup/etc
# cp -vf /etc/{passwd,group} /home/backup/etc/
注意:每次向系统添加更多 SSH 用户时,都需要将更新的帐户文件复制到 /home/backup/etc 目录中。

# vi /etc/ssh/sshd_config
# 定义要使用 chroot 监狱的用户
Match User backupUser
# 指定 chroot 监狱
ChrootDirectory /home/backup
AuthorizedKeysFile /home/backup/.ssh/authorized_keys
ForceCommand internal-sftp -p 8822
# systemctl restart sshd 或者 service sshd restart


#创建用户的主目录并添加 Linux 命令

# mkdir -p /home/backup/home/backupUser
# chown -R backupUser:backupUser /home/backup/home/backupUser
# chmod -R 0700 /home/backup/home/backupUser

cp -v /bin/bash /home/backup/bin/
cp -v /bin/ls /home/backup/bin/
cp -v /bin/date /home/backup/bin/
cp -v /bin/mkdir /home/backup/bin/
cp -v /bin/rm /home/backup/bin/
cp -v /bin/sh /home/backup/bin/
cp -v /bin/cat /home/backup/bin/
cp -v /bin/chmod /home/backup/bin/

# ldd /bin/chmod
# cp -v /lib/x86_64-linux-gnu/libc.so.6 /home/backup/lib/
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/


# ldd /bin/cat
# cp -v /lib/x86_64-linux-gnu/libc.so.6 /home/backup/lib/
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/

# ldd /bin/ls
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/
# cp -v /lib/x86_64-linux-gnu/{libselinux.so.1,libc.so.6,libpcre.so.3,libdl.so.2,libpthread.so.0} /home/backup/lib/

# ldd /bin/sh
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/
# cp -v /lib/x86_64-linux-gnu/libc.so.6 /home/backup/lib/

# ldd /bin/rm
# cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/
# cp -v /lib/x86_64-linux-gnu/libc.so.6 /home/backup/lib/


# 这个就能切换到chroot环境了
chroot /home/backup/

#测试 SSH 的 chroot 监狱
ssh backupUser@8.8.8.8 -p 9922

# 在 /etc/ssh/sshd_config 中添加下面的行
# 启用 sftp 的 chroot 监狱 如果限制只能使用 sftp
# ForceCommand internal-sftp

服务器A 访问服务器B 免密登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
服务器A 执行如下操作:
1.1 生成 ssh key 密钥对:
ssh-keygen -t rsa
(按3个回车,密钥对生成在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub 两个文件)

1.2 把发起端的公钥放到接收端上:
ssh-copy-id -i ~/.ssh/id_rsa.pub RemoteUserName@RemoteIP
如: ssh-copy-id -p 9922 -i ~/.ssh/id_rsa.pub backupUser@8.8.8.8

2.终端登录到服务器B,编辑/etc/ssh/sshd_config文件:
2.1 取消下面几行的注释,如果没有就添加
RSAAuthentication yes
PubkeyAuthentication yes

2.2 重启sshd服务:
/etc/init.d/sshd restart

3.测试免密码登录:
ssh RemoteUserName@RemoteIP

参考:
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa <<< y && sshpass -p 'youpassword' ssh-copy-id -i ~/.ssh/id_rsa.pub -p 9922 backupUser@8.8.8.8

自动备份计划

从远程同步到本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apt-get -y update;apt-get -y install rsync wget curl tmux vim sshpass htop
注意: rsync 本地服务器A 和远程服务器B中的chroot环境也需要安装

cp -v /usr/bin/rsync /home/backup/bin/
ldd rsync
cp -v /lib/x86_64-linux-gnu/{libattr.so.1,libacl.so.1,libpopt.so.0,libc.so.6} /home/backup/lib/
cp -v /lib64/ld-linux-x86-64.so.2 /home/backup/lib64/

rsync -avzu --progress -rsh=ssh mission@10.1.1.156:/home/mission/StationPisPlayer/data/resource .
这是一个用于从远程服务器复制文件到本地的 rsync 命令。命令的各个部分的含义如下:

-a:归档模式,相当于 -rlptgoD 的缩写,其中 r 表示递归,l 表示保留符号链接,p 表示保留权限,t 表示保留时间信息,g 表示保留所有者信息,o 表示保留组信息,D 表示保留设备文件和特殊文件。
-v:详细输出模式。
-z:压缩传输。
-u:只复制源文件中更新或更改过的文件。
--progress:显示传输进度信息。
-rsh=ssh:使用 ssh 作为远程 shell。
mission@10.1.1.156:/home/mission/StationPisPlayer/data/resource:远程服务器上的源文件或目录。
.:本地目标目录,这里表示当前目录。
这个命令将会把远程服务器 10.1.1.156 上的 /home/mission/StationPisPlayer/data/resource 目录中的文件复制到本地当前目录。注意,命令执行时需要输入远程服务器的登录密码

从本地同步到远程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sort -u results/*.txt > "$(date +%Y%m%d).txt";
rsync -avzh /backup/ user@remote:/remote/backup/
rsync -avzh -e 'ssh -p 2222' /backup/ user@remote:/remote/backup/

其中,
-a选项表示归档模式,将递归同步所有子目录、文件和权限;
-v选项表示详细模式,打印出正在进行的操作;
-z选项启用压缩,减少传输数据量;
-h选项表示人类可读,输出大小以易于理解的格式;
/backup/是本地要同步的目录;
user@remote:/remote/backup/是远程服务器的目录,其中user是远程服务器的用户名。

执行此命令后,rsync将显示同步进度和传输速度,并将所有更改复制到远程服务器。
请注意,rsync不会自动删除远程服务器上不存在于本地目录中的文件,这可能导致远程服务器中出现不需要的文件。如果要删除此类文件,可以使用rsync的--delete选项。

在上面的命令中,-e 参数后面跟着的字符串指定了 ssh 远程 shell,并指定了远程主机的端口号为 2222。如果你的远程主机使用不同的端口号,只需要将该命令中的 2222 替换为你的实际端口号即可。

修改SSH端口

如果需要修改sshd的端口, 可以参考以下内容

在使用 ChrootDirectory /home/backup 建立 chroot 环境时,会限制 sshd 的权限,导致 sshd 所需的文件和命令不可用。因此,在 chroot 环境中使用 sshd 需要进行特殊的配置。

要解决这个问题,可以在 chroot 中提供必要的文件和命令,如 /usr/bin/rsync/bin/bash/usr/bin/scp/usr/bin/ssh-keygen/usr/bin/ssh-add 等。需要将这些文件和命令复制到 chroot 的相应目录中,并且确保它们的依赖库也一并复制进去。

另外,要使得在 chroot 中使用 sshd,需要将其配置文件复制到 chroot 目录中,并将其中的 sshd_config 文件中的 PortAuthorizedKeysFile 选项修改为 chroot 环境下的路径,例如:

1
2
3
Port 2200
AuthorizedKeysFile /home/backup/.ssh/authorized_keys

然后重新启动 sshd 服务即可在 chroot 环境中使用 sshd。

Busybox

docker-compose.yml

1
2
3
4
5
6
7
8
9
version: '3'
services:
busybox:
image: busybox
volumes:
- ./data:/data
ports:
- "8822:22"

docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -itd --name my_container --restart always -p 8822:22 -v $(pwd)/data:/data busybox sh

1. Busybox 安装apk命令
下载 Busybox 对应的 apk 包管理器,
下载地址:https://pkgs.alpinelinux.org/packages?name=apk-tools-static&branch=&repo=&arch=&maintainer=
打开网站找到合适的版本并下载
将下载的 apk-tools-static 包重命名为 apk:
$ mv apk-tools-static-2.12.6-r0.apk apk.apk
mv sbin/apk.static /usr/local/bin/apk

mkdir -p /etc/apk/keys
/bin # wget -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub


Debian

docker-compose.yml

1
2
3
4
5
6
7
8
9
version: '3'
services:
debian:
image: debian:latest
volumes:
- ./data:/data
ports:
- "8822:22"

注意,Debian 镜像默认没有安装 SSH 服务,因此你需要在容器中安装 SSH 服务,以便能够通过端口 8822 进行远程连接。可以使用以下命令安装 OpenSSH 服务器:

1
2
$ apt-get update
$ apt-get install -y openssh-server

安装完成后,你可以使用 systemctl start ssh 命令来启动 SSH 服务。在此之前,你可以通过 systemctl status ssh 命令来查看 SSH 服务的运行状态。

docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
docker run -itd --name my_container -p 8822:22 -v $(pwd)/data:/data debian:latest

docker exec my_container apt-get update
docker exec my_container apt-get install -y openssh-server sudo net-tools vim rsync
docker exec my_container service ssh start

# passwd root
docker exec -it my_container bash
passwd root
sed -i 's/mouse=a/mouse-=a/g' /usr/share/vim/vim82/defaults.vim

# 在结尾加入下面两行
PermitRootLogin yes
PasswordAuthentication yes
# 如果有就可以直接用下面命令修改
#sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config
#sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
/etc/init.d/ssh restart




免密登陆操作方法:
1.1 生成 ssh key 密钥对:
ssh-keygen -t rsa
(按3个回车,密钥对生成在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub 两个文件)

1.2 把发起端的公钥放到接收端上:
ssh-copy-id -i ~/.ssh/id_rsa.pub RemoteUserName@RemoteIP
如: ssh-copy-id -p 9922 -i ~/.ssh/id_rsa.pub backupUser@8.8.8.8

2.终端登录到服务器B,编辑/etc/ssh/sshd_config文件:
2.1 取消下面几行的注释,如果没有就添加
RSAAuthentication yes
PubkeyAuthentication yes

2.2 重启sshd服务:
/etc/init.d/sshd restart

3.测试免密码登录:
ssh RemoteUserName@RemoteIP

QQ群:397745473

欢迎关注我的其它发布渠道