Linux常用工具服务——rsync、FTP、NFS、SSH、syslog、NTP
一、rsync数据同步服务
1、介绍
Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具。Rsync软件适用于多种操作系统平台。
Rsync具有使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能。相对于同类产品,Rsync的同步数据的性能和效率更省一筹。
(1)一个rsync相当于scp、cp、rm,但是还优于这些命令。传统的拷贝工具每次只能进行全部的拷贝,rsync工具除了进行完全拷贝之外,还可以进行增量拷贝。
(2)在同步备份数据时,默认情况下,rsync通过“quick check”算法:仅同步大小或者最后修改时间发生变化的文件或者目录;也可以根据权限、属主等属性的变化同步(需指定参数)。
2、数据同步原理
rsync2.x的对比方法:把所有文件比对一遍之后进行数据同步。
rsync3.x的比对方法:一边对比差异,一边对差异的部分进行同步。
3、Rsync的特性
- 支持拷贝特殊文件如链接文件、设备等。
- 可以又排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
- 可以做到保持源文件或目录的权限,时间,软硬链接,属主属性均不改变 (-p)
- 可以实现增量同步,既只同步发生变化的数据。
- 可以实现rcp、rsh、ssh等方式来配合传输文件。
- 可以通过socket(进程)方式传输文件和数据
- 只是匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据传输。
4、Rsync的工作场景
(1)两台服务器之间进行数据同步(定时任务cron+rsync备份数据)
(2)实时同步(解决存储服务器等的单点问题)
使用rsync和inotify的功能做实时的数据同步。利用inotify的用户程序空间文件系统的变化通知,根据存储服务器上目录的变化,把变化的数据使用rsync命令实时同步到备份服务器。
小贴士:inotify是一个Linux特性。它监控文件系统操作,比如读写、写入和创建。也可以通过inotify实现数据的同步,所需要的应用软件inotify-tools。
小贴士二:双机数据同步还可以通过drbd方案(该方案由内核模块和相关脚本构成,用以构建高可用性的集群。其实现方法是通过网络来镜像整个设备。DRBD负责接受数据,把数据写到本地磁盘,然后发送给另一个主机,另一个主机再将数据存到自己的磁盘中。)以及双写的方案实现双机数据同步。
5、Rsync的工作方式
Rsync的数据传输大概有以下几种方式。分别为:
(1)单个主机本地的数据传输
(2)结束rcp、ssh等通道来传输数据
(3)以守护进程(socket)的方式传输数据
1 2 3 4 5 6 7 8 9 10 11 | #以下为三种方式的帮助文档。查看方式:man rsync 如果没有该命令,可使用yum install rsync -y (centos)<br>Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync : // [USER@]HOST[:PORT] /SRC ... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync : // [USER@]HOST[:PORT] /DEST |
(1)单个主机本地的数据传输
rsync本地传输模式的语法是:
rsync [option] SRC [dest] / rsync 选项 源文件 目的文件
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 | #本地文件复制 [root@localhost ~] # rsync new.sh /opt/ [root@localhost ~] # ll /opt/ 总用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh [root@localhost ~] # ll 总用量 8 -rw-------. 1 root root 1259 4月 30 2021 anaconda-ks.cfg -rw-r--r--. 1 root root 92 12月 29 22:12 new.sh #拷贝一个目录 [root@localhost ~] # mkdir test [root@localhost ~] # rsync -avz /opt/ /root/test sending incremental file list ./ new.sh sent 187 bytes received 38 bytes 450.00 bytes /sec total size is 92 speedup is 0.41 [root@localhost ~] # ll /opt/ 总用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh [root@localhost ~] # ll /root/test/ 总用量 4 -rw-r--r--. 1 root root 92 12月 29 23:01 new.sh #删除功能 [root@localhost ~] # mkdir /abc [root@localhost ~] # rsync -avz --delete /abc/ /root/test/ #delete的意思是让源目录和目标目录保持一致,所以需要创建一个新的空文件夹 sending incremental file list deleting new.sh deleting abc03 deleting abc02 deleting abc01 ./ sent 43 bytes received 56 bytes 198.00 bytes /sec total size is 0 speedup is 0.00 [root@localhost ~] # tree /root/test /root/test 0 directories, 0 files |
rsync的一些常用参数选项:
选项 | 具体作用 |
-v,--version | 详细模式输出,传输时进度等信息。 |
-z,--compress |
传输时进行压缩以提高效率。 --compose-level=NUM可按级别压缩。 |
-a,--archive | 归档模式,表示以递归方式传输文件,并保持所有文件属性。 |
-r,--recursive | 对子目录以递归模式,即目录下的所有目录都同样传输。 |
-t,--times | 保持文件的时间信息 |
-o,--owner | 保持文件的属主信息 |
-p,--perms | 保持文件权限 |
-g,--group | 保持文件的属组信息 |
-P,--progress | 显示同步过程中及传输时的进度等信息 |
-D,--devices | 保持设备文件的信息 |
-l,--links | 保留软链接 |
--bwlimit=RATE | 对传输文件的带宽进行限制 |
--delete | 让源目录和目标目录的文件保持一致 |
1 2 3 4 5 6 7 8 9 10 11 | #带宽限制 [root@localhost ~] # rsync -avz new.sh 192.168.10.12:/root --bwlimit=10 #两台服务器都需要以及安装rsync root@192.168.10.12's password: sending incremental file list new.sh sent 167 bytes received 35 bytes 57.71 bytes /sec total size is 92 speedup is 0.46 #保持同步目录及文件属性 参数:-avz 或者 -vzrtopg |
一些使用实例
#测试本地rsync同步,并同步权限
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir anliu
[root@localhost opt]# touch anliu/test.txt
[root@localhost opt]# chmod -R 700 anliu
[root@localhost opt]# ls -l
总用量 0
drwx------. 2 root root 22 2月 11 21:44 anliu[root@localhost opt]# tree /tmp/
/tmp/0 directories, 0 files
[root@localhost opt]# rsync /opt/ /tmp/
skipping directory .
[root@localhost opt]# rsync -avz /opt/ /tmp/
sending incremental file list
./
anliu/
anliu/test.txtsent 149 bytes received 46 bytes 390.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost opt]# ll /tmp/
总用量 0
drwx------. 2 root root 22 2月 11 21:44 anliu
[root@localhost opt]# ll /tmp/anliu/
总用量 0
-rwx------. 1 root root 0 2月 11 21:44 test.txt#目录复制区别
①、rsync -avz /opt/ /tmp/ 仅复制opt目录内的内容,opt目录本身不同步。
②、rsync -avz /opt /tmp/ 表示将opt目录下的所有以及opt目录本身全部同步
(2)借助ssh通道在两台主机之间来传输数据
两台主机之间推送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #两台主机之间拉取数据 [root@localhost ~] # rsync -avzP -e 'ssh -p 22' /tmp root@192.168.10.11:tmp/ #-e 'ssh -p 22' :该选项表示已ssh的方式通过22端口推送,如果不写,默认为22端口 root@192.168.10.11's password: sending incremental file list created directory tmp tmp/ tmp/.ICE-unix/ tmp/.Test-unix/ tmp/.X11-unix/ tmp/.XIM-unix/ tmp/.font-unix/ tmp /anliu/ tmp /anliu/test .txt 0 100% 0.00kB /s 0:00:00 (xfr #1, to-chk=0/8) sent 297 bytes received 93 bytes 60.00 bytes /sec total size is 0 speedup is 0.00 [root@localhost ~] # ssh root@192.168.10.11 "ls -l tmp" root@192.168.10.11's password: 总用量 0 drwxr-xr-x. 8 root root 106 2月 11 21:44 tmp |
两台主机之间推送数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@localhost ~] # rsync -avzP root@192.168.10.11:/root/abc* /root root@192.168.10.11's password: receiving incremental file list abc01.txt 0 100% 0.00kB /s 0:00:00 (xfr #1, to-chk=2/3) abc02.txt 0 100% 0.00kB /s 0:00:00 (xfr #2, to-chk=1/3) abc03.txt 0 100% 0.00kB /s 0:00:00 (xfr #3, to-chk=0/3) sent 81 bytes received 194 bytes 78.57 bytes /sec total size is 0 speedup is 0.00 [root@localhost ~] # ls abc01.txt abc02.txt abc03.txt anaconda-ks.cfg new.sh |
可以使用映射好的主机名进行数据传输:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@localhost ~] # rsync -avzP root@rsync:/tmp /root root@ rsync 's password: receiving incremental file list tmp/ tmp /123 0 100% 0.00kB /s 0:00:00 (xfr #1, to-chk=5/7) tmp/.ICE-unix/ tmp/.Test-unix/ tmp/.X11-unix/ tmp/.XIM-unix/ tmp/.font-unix/ sent 71 bytes received 257 bytes 59.64 bytes /sec total size is 0 speedup is 0.00 [root@localhost ~] # ls abc01.txt abc02.txt abc03.txt anaconda-ks.cfg new.sh tmp [root@localhost ~] # tail -1 /etc/hosts 192.168.10.11 rsync |
(3)以守护进程(socket)的方式传输数据
1、为什么使用守护进程模式?
①、rsync传输时,使用的是系统用户和系统用户的密码,不安全。
②、使用普通用户会因为权限问题导致数据传输失败
2、守护进程模式搭建
主机名 | IP | 用途 |
a-server | 192.168.10.11 | rsync服务端 |
b-server | 192.168.10.12 | rsync客户端 |
①、准备工作 (服务端与客户端均需操作)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #修改主机名 [root@localhost ~] # hostnamectl set-hostname a-server [root@localhost ~] # su -l 上一次登录:三 12月 29 21:22:51 CST 2021从 192.168.10.1pts /0 上 #关闭防火墙或者打开端口873 [root@a-server ~] # systemctl stop firewalld [root@a-server ~] # systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user .target.wants /firewalld .service. Removed symlink /etc/systemd/system/dbus-org .fedoraproject.FirewallD1.service. #安装常用软件包以及时间同步 [root@a-server ~] # yum install vim wget tree lsof ntpdate net-tools rsync -y [root@a-server ~] # ntpdate cn.pool.ntp.org 14 Feb 11:21:38 ntpdate[7873]: step time server 84.16.73.33 offset 4024336.128826 sec [root@a-server ~] # hwclock -w [root@a-server ~] # date 2022年 02月 14日 星期一 11:21:47 CST |
②、服务端操作
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 | #确认rsync已经安装 [root@a-server ~] # rpm -qa | grep rsync rsync -3.1.2-10.el7.x86_64 #修改配置文件 [root@a-server ~] # cp -p /etc/rsyncd.conf{,.bak} [root@a-server ~] # vim /etc/rsyncd.conf [root@a-server ~] # grep -vE "^#|^$" /etc/rsyncd.conf uid = root #用户 gid = root #组 use chroot = no #程序安全设置 max conections = 200 #客户端连接数 timeout = 300 #超时时间 pid file = /var/run/rsyncd .pid #进程号文件位置 lock file = /var/run/rsync .lock #进程锁 log file = /var/run/rsyncd .log #日志文件位置 [backup] path = /backup/ #使用目录 ignore errors #有错误时忽略 read only = false #可读可写 list = false #阻止远程列表(不让远程方式查看服务端有什么) hosts allow = 192.168.10.0 /24 #允许IP hosts deny = 0.0.0.0 /32 #阻止IP auth users = rsync_backup #虚拟用户 secrets file = /etc/rsync .password #存放用户和密码的文件 #创建共享目录以及添加rsync程序用户 [root@a-server ~] # useradd -M -s /sbin/nologin rsync [root@a-server ~] # cat /etc/passwd | grep rsync rsync :x:1000:1000:: /home/rsync : /sbin/nologin [root@a-server ~] # cat /etc/group | grep rsync rsync :x:1000: [root@a-server ~] # mkdir /backup #启动服务并查看 [root@a-server ~] # rsync --daemon [root@a-server ~] # netstat -antup | grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7897 /rsync tcp6 0 0 :::873 :::* LISTEN 7897 /rsync 3修改共享目录的属主以及权限 [root@a-server ~] # chown -R rsync:rsync /backup/ [root@a-server ~] # chmod -R 755 /backup/ [root@a-server ~] # ll -d /backup/ drwxr-xr-x. 2 rsync rsync 6 2月 14 11:35 /backup/ #创建rsync虚拟账户和密码 [root@a-server ~] # echo "rsync_backup:123456" > /etc/rsync.password [root@a-server ~] # cat /etc/rsync.password rsync_backup:123456 #将账户密码文件权限设置为600(重要),并将rsync启动作为开机自启 [root@a-server ~] # chmod 600 /etc/rsync.password [root@a-server ~] # ll /etc/rsync.password -rw-------. 1 root root 20 2月 14 11:38 /etc/rsync .password [root@a-server ~] # echo "rsync --daemon" > /etc/rc.local [root@a-server ~] # tail -1 /etc/rc.local rsync --daemon |
③、客户端操作
1 2 3 4 5 6 7 8 9 | #创建密码文件 [root@b-server ~] # rpm -qa | grep rsync rsync -3.1.2-10.el7.x86_64 [root@b-server ~] # echo "123456" > /etc/rsync.password #将密码文件的权限设置为600 [root@b-server ~] # chmod -R 600 /etc/rsync.password [root@b-server ~] # ll /etc/rsync.password -rw-------. 1 root root 7 12月 29 22:04 /etc/rsync .password |
④、测试
推送测试一:将客户端指定目录内容推送到服务端rsync指定目录下
[root@b-server ~]# mkdir /backup
[root@b-server ~]# ll /backup/
总用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
[root@b-server ~]# rsync -avzP /backup/ rsync_backup@192.168.10.11::backup --password-file=/etc/rsync.password
sending incremental file list
./
zookeeper-3.4.14.tar.gz
37,676,320 100% 3.61MB/s 0:00:09 (xfr#1, to-chk=0/2)
sent 37,604,425 bytes received 46 bytes 3,269,954.00 bytes/sec
total size is 37,676,320 speedup is 1.00
[root@b-server ~]# ssh root@192.168.10.11 "ls -l /backup"
root@192.168.10.11's password:
总用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
#选项说明:
-avzP :各项属性不变,-P显示具体同步过程。
/backup/ :要推送的内容所在的目录
rsync_backup:服务端rsync服务的同步的用户名(/etc/rsyncd.conf中配置)
192.168.10.11 :rsync服务端的IP
backup:rsync服务器配置文件里的模块名
--password-file=/etc/rsync.password :免密码的操作。指定密码文件位置,如果不写,就会使用交互式输入密码。
推送测试二:将客户端任意目录推送到rsync服务端的指定目录下
[root@b-server ~]# rsync -avzP /root/ rsync_backup@192.168.10.11::backup --password-file=/etc/rsync.password
sending incremental file list
./
.bash_history
250 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=8/10)
.bash_logout
18 100% 17.58kB/s 0:00:00 (xfr#2, to-chk=7/10)
.bash_profile
176 100% 171.88kB/s 0:00:00 (xfr#3, to-chk=6/10)
.bashrc
176 100% 171.88kB/s 0:00:00 (xfr#4, to-chk=5/10)
.cshrc
100 100% 5.14kB/s 0:00:00 (xfr#5, to-chk=4/10)
.tcshrc
129 100% 6.30kB/s 0:00:00 (xfr#6, to-chk=3/10)
anaconda-ks.cfg
1,259 100% 39.66kB/s 0:00:00 (xfr#7, to-chk=2/10)
.ssh/
.ssh/known_hosts
175 100% 2.80kB/s 0:00:00 (xfr#8, to-chk=0/10)sent 2,025 bytes received 187 bytes 1,474.67 bytes/sec
total size is 2,283 speedup is 1.03
[root@b-server ~]# ssh root@192.168.10.11 "ls -l /backup"
root@192.168.10.11's password:
总用量 36800
-rw-------. 1 root root 1259 4月 30 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
拉取测试一:将rsync服务端指定目录全部内容同步到客户端
[root@b-server ~]# rsync -avzP rsync_backup@192.168.10.11::backup /tmp --password-file=/etc/rsync.password
receiving incremental file list
./
.bash_history
250 100% 244.14kB/s 0:00:00 (xfr#1, to-chk=9/11)
.bash_logout
18 100% 0.13kB/s 0:00:00 (xfr#2, to-chk=8/11)
.bash_profile
176 100% 0.49kB/s 0:00:00 (xfr#3, to-chk=7/11)
.bashrc
176 100% 0.37kB/s 0:00:00 (xfr#4, to-chk=6/11)
.cshrc
100 100% 0.19kB/s 0:00:00 (xfr#5, to-chk=5/11)
.tcshrc
129 100% 0.19kB/s 0:00:00 (xfr#6, to-chk=4/11)
anaconda-ks.cfg
1,259 100% 1.59kB/s 0:00:00 (xfr#7, to-chk=3/11)
zookeeper-3.4.14.tar.gz
37,676,320 100% 3.01MB/s 0:00:11 (xfr#8, to-chk=2/11)
.ssh/
.ssh/known_hosts
175 100% 0.38kB/s 0:00:00 (xfr#9, to-chk=0/11)sent 210 bytes received 37,606,409 bytes 2,785,675.48 bytes/sec
total size is 37,678,603 speedup is 1.00
[root@b-server ~]# ls -ld /tmp/*
-rw-------. 1 root root 1259 4月 30 2021 /tmp/anaconda-ks.cfg
-rw-r--r--. 1 root root 37676320 12月 29 22:45 /tmp/zookeeper-3.4.14.tar.gz
拉取测试二: 将rsync服务端指定目录下的指定内容同步到客户端
[root@b-server ~]# ls -l /backup/
总用量 0
[root@b-server ~]# rsync -avzP rsync_backup@192.168.10.11::backup/zookeeper-3.4.14.tar.gz /backup/ --password-file=/etc/rsync.password
receiving incremental file list
zookeeper-3.4.14.tar.gz
37,676,320 100% 45.42MB/s 0:00:00 (xfr#1, to-chk=0/1)sent 43 bytes received 37,692,144 bytes 15,076,874.80 bytes/sec
total size is 37,676,320 speedup is 1.00
[root@b-server ~]# ls -l /backup/
总用量 36796
-rw-r--r--. 1 root root 37676320 12月 29 22:45 zookeeper-3.4.14.tar.gz
拉取测试三:将rsync服务端指定目录下的全部内容排除目录或者文件后,同步到客户端
方法一:通过命令行实现排除
[root@b-server ~]# ssh root@192.168.10.11 "tree /backup "
root@192.168.10.11's password:
/backup
├── anliu
│ ├── test01.txt
│ └── test02.txt
├── host
├── opt
└── test1 directory, 5 files
[root@b-server ~]# rsync -avz --exclude=anliu/test02.txt --exclude=test rsync_backup@192.168.10.11::backup /backup/ --password-file=/etc/rsync.password
receiving incremental file list
./
host
opt
anliu/
anliu/test01.txtsent 132 bytes received 278 bytes 273.33 bytes/sec
total size is 0 speedup is 0.00
[root@b-server ~]# tree /backup
/backup
├── anliu
│ └── test01.txt
├── host
├── opt
└── zookeeper-3.4.14.tar.gz1 directory, 4 files
方法二:通过列表文件实现排除
[root@b-server ~]# mkdir /backup01
[root@b-server ~]# cat /root/exclude.txt
anliu/test02.txt
host
[root@b-server ~]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.10.11::backup /backup01 --password-file=/etc/rsync.password
receiving incremental file list
./
opt
test
anliu/
anliu/test01.txtsent 132 bytes received 278 bytes 164.00 bytes/sec
total size is 0 speedup is 0.00
[root@b-server ~]# tree /backup01/
/backup01/
├── anliu
│ └── test01.txt
├── opt
└── test1 directory, 3 files
[root@b-server ~]# ssh root@192.168.10.11 "tree /backup"
root@192.168.10.11's password:
/backup
├── anliu
│ ├── test01.txt
│ └── test02.txt
├── host
├── opt
└── test1 directory, 5 file
rsync同步拉取和推送测试(让rsync客户端目录内容始终和rsync服务器共享目录内容保持一致):
两者的方法均为使用--delete选项同步,同步即服务端删除文件,客户端也删除文件。实现方法为某一端发生变化后,另一端接着执行同步命令。也可以使用--exclude排除某个文件。
6、关于rsync的一个风险提示
一个关于同步推送的选项 --delete参数,当客户端将本机内容推送到服务端的备份目录后,--delete有能里删除服务端的目录下的所有文件。所以,备份文件尽可能避免使用--delete 。
7、排错
错误问题参考:rsync 常见错误与解决方法整理_服务器其它_脚本之家 (jb51.net)
8、rsync实时同步配置
前提:已经配置好以守护进程(socket)的方式传输数据
(1)配置rsync源服务器
关闭只读模式
[root@a-server backup]# vim /etc/rsyncd.conf
[root@a-server backup]# cat /etc/rsyncd.conf | grep -vE "^#|^$" | grep "read"
read only = no
更改内核参数,指定队列大小,最多监控实例数,每个实例最多监控文件数
[root@a-server backup]# vim /etc/sysctl.conf
[root@a-server backup]# cat /etc/sysctl.conf | grep -vE "^#|^$"
fs.inotify.max_queued_events = 16384 #监控时间的最大队列数
fs.inotify.max_user_instances = 1024 #监控的最大实例数
fs.inotify.max_user_watches = 1048576 #监控的每实例的最大文件数
[root@a-server backup]# sysctl -p
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
重新启动rsync服务
[root@server backup]# cd /var/run/
[root@server run]# cat rsyncd.pid
7993
[root@server run]# kill 7993
[root@server run]# ll | grep rsyncd.pid
[root@server run]# rsync --daemon
[root@server run]# ll | grep rsyncd.pid
-rw-r--r--. 1 root root 6 12月 29 22:45 rsyncd.pid
(2)配置客户端服务器
下载inotify并上传至客户端。下载地址inotify-tools - Browse Files at SourceForge.net
解压缩并安装
[root@agent ~]# ls
anaconda-ks.cfg inotify-tools-3.13.tar.gz
[root@agent ~]# tar xf inotify-tools-3.13.tar.gz
[root@agent ~]# cd inotify-tools-3.13
[root@agent inotify-tools-3.13]# yum install gcc gcc-c++ -y
[root@agent inotify-tools-3.13]# ./configure
[root@agent inotify-tools-3.13]# echo $?
0
[root@agent inotify-tools-3.13]# make && make install
[root@agent inotify-tools-3.13]# echo $?
0
测试inotifywait监控是否正常使用
[root@agent ~]# mkdir /var/www
[root@agent ~]# inotifywait -mrq -e modify,create,move,delete /var/www (执行后处于监控状态,不能输入,重新开启终端)
测试
[root@agent ~]# cd /var/www/
[root@agent www]# touch a[root@agent ~]# mkdir /var/www
[root@agent ~]# inotifywait -mrq -e modify,create,move,delete /var/www
/var/www/ CREATE a #测试结果 配置成功
客户端编写脚本,将inotify和rsync远程同步结合起来
[root@agent ~]# vi /opt/rsync_inotify.sh
[root@agent ~]# cat /opt/rsync_inotify.sh
INOTIFY="inotifywait -mrq -e modify,create,attrib,move,delete /var/www"
RSYNC="rsync -avz --delete --password-file=/etc/rsync.password /var/www rsync_backup@192.168.10.11::backup"
$INOTIFY | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l ) -le 0 ];then
$RSYNC
fi
done
运行脚本,并测试
[root@agent www]# sh /opt/rsync_inotify.sh & #因为放入后台依旧会有输出,所以最好将脚本中的输出放置到Linux的无底洞(/dev/null)中。
[2] 23486
[root@agent www]# ls
a abc
[root@agent www]# cd abc
[root@agent abc]# touch abc
[root@agent abc]#
sending incremental file list
www/
www/a
www/abc/
www/abc/abcsent 216 bytes received 78 bytes 588.00 bytes/sec
total size is 0 speedup is 0.00
sending incremental file listsent 130 bytes received 26 bytes 312.00 bytes/sec
total size is 0 speedup is 0.00
测试成功!!!
二、FTP服务
1、服务介绍
FTP是文件传输协议(File Transfer Protocol)的英文缩写。用于Internet上控制文件的双向传输。同时,他也是一个应用程序,基于不同的操作系统有不同的引用程序,而这些引用程序都遵循同一个协议用来传输文件。
(1)FTP用户类型
FTP有三种用户类型:①、匿名用户:anonymous或ftp
②、本地用户:账号名称、密码等信息保存在passwd/shadow文件中
③、虚拟用户:使用独立账号/密码数据文件
(2)FTP工作模式
FTP是仅基于TCP的服务,与众不同的是FTP协议要用到两个TCP连接,一个是控制链路,用来在客户端与服务器之间传递命令的;另一个是数据链路,用来上传或下载数据的。
FTP协议有两种工作方式:POST方式和PASV方式,即主动式和被动式
主动模式 | 被动模式 | |
模式 | 服务端从20端口主动向客户端发起链接 | 服务端在指定范围内某个端口被动等待与而客户端链接 |
端口分配 | 控制端口21 数据传输端口20 | 控制端口21 数据传输端口 随机 |
过程 |
客户端从一份任意的非特权端口N(N>1024)向FTP服务器的命令端口(默认21)发送请求,服务器接受连接,建立一条命令链路。 当需要传送数据时,客户端开始监听端口N+1,并在命令链路上用PORT命令发送N+1端口到FTP服务器,于是服务器会从自己的数据端口(20)向客户端指定的数据端口(N+1)发送连接请求,建立一条数据链路来传输数据。 |
客户端从一份任意的非特权端口N(N>1024)向FTP服务器的命令端口(默认21)发送请求,服务器接受连接,建立一条命令链路。 当需要传输数据时,客户端在命令链路上用PASV命令发送。于是服务器会开启一个任意的非特权端口P(P>1024),并在命令链路上把端口发送给客户端,然后客户端从自己的数据端口(N+1)向服务器的数据端口(P)发送连接请求,建立一条数据链路来传送数据。 |
优点 |
对FTP服务器的管理有利 |
对FTP客户端管理有利 |
缺点 | 对客户端管理不利(FTP服务器企图与客户端的高位随机端口建立对接,而这个端口很有可能会被客户端的防火墙阻塞掉) | 对服务器端管理不利(因为客户端需要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉) |
(3)FTP传输模式
FTP有两种传输模式:①、ASCII模式:即文本模式,以文本序列传输数据;
②、二进制模式:以二进制序列传输数据。
2、基础配置
由于FTP的文件传输是铭文方式,具有一定的危险性,所以就诞生了一种更加安全的传输方式vsftp。
vsftp是一个基于GPL发布的FTP服务器软件,安全性高,是RedHat linux默认的FTP服务终端软件。也是linux服务器的首选产品。
(1)vsftp的特点
①、一般以普通用户运行,降低进程权限,提高安全性;
②、高权限指令需要上层程序许可;
③、整合了所有FTP命令;
④、用户chroot功能,限制用户只能访问自己的家目录;
⑤、是redhat linux默认的FTP服务端软件;
⑥、不再依赖xinetd服务;
⑦、可同时容许匿名(anonymous)与本地用户(local)访问,还支持虚拟用户。
(2)vsftp链接类型
控制链接: TCP 21,用户发送FTP命令信息
数据链接:TCP 20,用户上传,下载数据。
(3)vsftp配置文件介绍
配置文件 | 作用 |
/usr/sbin/vsftpd | vsftpd的可执行文件(主程序) |
/etc/vsftpd/vsftpd.conf | vsftpd的配置文件 |
/etc/vsftpd/ftpusers | 禁止使用vsftpd的用户列表文件 |
/etc/vsftpd/user_list | 禁止或允许使用vsftpd的用户列表文件 |
/var/ftp | 匿名用户主目录 |
(4)vsftpd.conf文件常用的配置参数:
常用全局配置:
listen_address=192.168.10.10 #设置监听的IP地址
listen=YES #是否以独立运行的方式监听服务
listen_port=21 #设置监听FTP服务的端口号
write_enable=YES #是否启用写入权限
download_enable=YES #是否允许下载文件
max_clients=0 #限制并发客户端连接数
max_per_ip=0 #限制同一IP地址的并发连接数
xferlog_enable=yes #是否记录ftp传输过程
xferlog_file=/var/log/vsftpd.log #日志的文件和路径
chown_username=username #是否改变上传文件的属主,username是属主名称
date_connection_timeout=120 #设置数据传输超时时间
ftpd_banner=welcome to ftp server #定制欢迎信息
本地用户访问限制:
userlist_enabled=YES #是否启动userlist列表文件
userlist_deny=YES #是否禁用userlist中的用户
本地用户权限控制:
local_enable=YES #是否启用本地系统用户
local_umask=022 #本地用户所上传文件的权限掩码
local_root=/var/ftp #设置本地用户的FTP根目录
chroot_local_user=YES #是否将用户禁锢在主目录
local_max_rate=0 #限制最大传输速率(字节/秒)
chroot_list_enabled=YES #配合下一个选项使用
chroot_list_file=/etc/vsftpd/chroot_list #配合使用,列表中的用户将被禁锢在目录中。
匿名权限控制:
anonymous_enable=YES #启用匿名访问
anon_umask=022 #匿名用户上传文件的权限掩码
anon_root=/var/ftp #匿名用户的FTP根目录
anon_word_readable_only=YES #允许匿名下载
anon_upload_enale=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_mkdir_write_enable=YES #允许匿名者更多权限
anon_max_rate=0 #限制最大的传输速率
(5)配置拥有所有权限的匿名用户
配置简单的vsftpd
①、检查目前服务器或虚拟机是否安装vsftpd
如果安装,可使用rpm -e vsftpd-* 或yum remove vsftpd卸载
②、安装vsftpd
③、修改配置文件
④、启动vsftpd以及设置为开启自启动
⑤、开放端口或关闭防火墙
开放端口即开放21端口:firewalld-cmd --zone=public --add-port=21/tcp --permanent
⑥、确保vsftpd已启动
验证ftp是否可以可以正常访问
①、安装ftp,并登录
②、外部验证
③、此时对于数据没有读写权限
④、再次访问
⑤、此时可以查看了,但依旧不能上传文件
重启之后,就可以上传文件了
(6)配置本地用户
①、系统本地的默认设置
vsftpd默认容许所有的系统用户都可以访问FTP,并且要进行身份验证。但是用系统用户身份登录FTP服务器后,默认将位于自己的家目录中,而不是FTP的主目录。
创建系统用户,并设置密码,在家目录中添加测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@localhost ~] # useradd anliu01 [root@localhost ~] # useradd anliu02 [root@localhost ~] # passwd anliu01 更改用户 anliu01 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd :所有的身份验证令牌已经成功更新。 [root@localhost ~] # passwd anliu02 更改用户 anliu02 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd :所有的身份验证令牌已经成功更新。 [root@localhost ~] # echo "ftp test" >> /home/anliu01/ftptest.txtd |
登录测试
右键点击登录
登录后查看
②、禁锢系统用户与指定目录中
windows客户端也可以通过ftp命令访问服务器,由于在命令行模式下模式采用FTP主动模式,因此此时需要将客户端的防火墙关闭才能成功访问
此时用户访问的是自己的家目录,但此时可以使用cd命令切换到其他目录,例如:
此时会存在较大的安全隐患,一般情况下,我们都需要将系统用户禁锢在他的家目录下,禁止随意切换。修改完成后,重新启动vsftpd。
新建测试出现以下问题:
问题原因:从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
问题解决:
<1>将用户主目录的写权限去除。
1 | chmod a-w /home/ 用户名 |
结果:这样的话,登录会不能进行一些写的操作。
<2> 在vsftpd.conf中新增allow_writeable_chroot=YES配置
此时发现就不可以切换工作目录了。系统中的所有用户都受到限制。
③、允许特殊用户拥有目录切换权限
write_enable=YES 用户可以对根目录下的文件进行改写操作,会给系统带来极大的安全隐患,因此必须限制用户切换到根目录。
chroot_list_enabled=YES #配合下一个选项使用
chroot_list_file=/etc/vsftpd/chroot_list #配合使用,列表中的用户将被禁锢在目录中。
chroot_local_user=YES #用于指定用户列表文件中的用户,是否允许切换到上级目录。默认为NO。
几种情况:
1)chroot_list_enabled=YES ,chroot_local_user=YES时;在/etc/vsftpd/chroot_list文件中列出的用户,可以切换到上级目录。没有在文件中列出的用户,不能切换到站点根目录的上级目录。
2)chroot_list_enabled=YES ,chroot_local_user=NO时;在/etc/vsftpd/chroot_list文件中列出的用户,不能切换到站点根目录的上级目录。没有在文件中列出的用户,可以切换到上级目录。
3)chroot_list_enabled=NO ,chroot_local_user=YES时;所有用户均不能切换到上级目录。
4)chroot_list_enabled=NO ,chroot_local_user=NO时;所有用户均可以切换到上级目录。
5)当用户不允许切换到上级目录时,登陆后FTP站点的根目录“/”时该FTP账户的主目录,即文件系统的/var/ftp目录。
④、设置用户列表
在默认的配置下,所有的系统用户都可以访问FTP,如何来限定只有指定的用户来访问呢。
vsftpd提供了两个与系统用户相关的文件:/etc/vsftpd/chroot_list和/etc/vsftpd/ftpusers。这两个文件均包含一份FTP用户名的列表,但是作用却截然不同。
/etc/vsftpd/ftpusers:此文件中包含的用户账号将被禁止登录vsftpd服务器,不论用户是否出现在另一个文件中。
/etc/vsftpd/chroot_list:该文件中的用户账号是否被禁止登录,需要看其他两个选项的值。当userlist_enabled=YES时,/etc/vsftpd/chroot_list文件生效;当userlist_deny=YES时,则禁止用户列表中的用户登录;当userlist_deny=NO时,仅容许列表中的用户登录。
优先级:/etc/vsftpd/ftpusers的优先级大于/etc/vsftpd/chroot_list。
⑤、配置虚拟用户
除了虚拟用户,系统用户之外,还可以设置虚拟用户来访问FTP。所谓虚拟用户,是指存放于独立数据库文件中的FTP用户账号,可以将它们映射到某个不能登录的系统用户账号上,以进一步增强FTP服务器的安全。
1)创建虚拟用户数据库文件
vsftp服务的虚拟用户数据库默认使用Berkeley DB格式的数据库文件,建立数据库文件需要用到db_load命令工具,db_load工具是由db4-utils软件包提供的,所以首先需要确认系统中已经装好db4-utils组件。
1 2 | [root@localhost ~] # yum install vsftpd -y #安装vsftpd [root@localhost ~] # yum install epel-release libdb4-utils -y |
创建一个文本文件用来使用格式化用户名/密码列表,用于存放虚拟用户账号
以文件列表为数据源通过db_load工具创建出DB格式的数据库文件
2)创建虚拟用户的映射账号
vsftpd服务对虚拟用户其实采用了映射的控制方式,把所有的虚拟用户账号都对应到了同一个系统用户上,并将这个用户的家目录作为所有虚拟用户登录后公用的FTP主目录。
例如:
3)创建PAM认证文件
虚拟用户的认证是通过PAM机制来实现的,PAM时Linux系统中的独立API,它提供了各种验证模块以供其他程序调运。当这些程序需要进行用户身份验证操作时,就可以直接调用相应的模块,而无需由自己来提供验证功能。
1 2 3 4 5 6 7 8 9 10 11 12 | [root@localhost vsftpd] # vim /etc/pam.d/vsftpd [root@localhost vsftpd] # cat /etc/pam.d/vsftpd #%PAM-1.0 #session optional pam_keyinit.so force revoke #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so #auth include password-auth #account include password-auth #session required pam_loginuid.so #session include password-auth auth required /lib64/security/pam_userdb .so db= /etc/vsftpd/logins account required /lib64/security/pam_userdb .so db= /etc/vsftpd/logins |
4)修改vsftpd配置,添加虚拟用户支持
5)创建虚拟用户配置文件
创建两个虚拟用户,给两个虚拟用户不同的权限
6)验证
<1>本地登录
首先需要关闭防火墙或者开启21端口
其次需要将/etc/selinux/config中的selinux的值修改为disabled
登录成功!
<2>远程登录
实验结果为anliu01可以进行正常的文件上传与下载,anliu02只能下载,不能上传。
3、FTP连接类型配置
关于FTP主被动模式的修改
windows cmd下默认为主动模式,更改为被动的模式
Linux ftp命令下默认为被动模式,切换为主动模式的方法
三、NFS共享存储
四、SSH服务
五、syslog
六、NTP时间同步服务
本文来自博客园,作者:小楚同学,转载请注明原文链接:https://www.cnblogs.com/lucilleye/p/15880290.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了