综合架构学习笔记-3---rsync-扩展脚本
综合架构学习笔记-3---rsync-扩展脚本
虚拟机测试环境
ip 10.0.1.0
网关10.0.1.2
子网掩码 255.255.255.0
知识回顾
rsync如何部署?
1.安装软件rsync
2.编写配置文件
虚拟用户
备份目录
密码文件
具体流程演示
linux系统安装部署服务流程:
a 下载安装软件 yum
b 编写配置文件
c 搭建服务环境 备份的目录/目录权限
d 启动服务程序 开机自动启动
e 测试服务功能
yum -y install rsync
如果报错 请输入全称试试
yum -y install rsync-3.1.2-12.el7_9.x86_64
本地备份实现
rsync ifcfg-eno16777736 /home
具体实操过程
[root@node ~]# ls /
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@node ~]# cd /home
[root@node home]# ls
it01 wang
[root@node home]# cd
[root@node ~]# rsync ifcfg-eno16777736 /home
[root@node ~]# cat /home/
ifcfg-eno16777736 it01/ wang/
[root@node ~]# cat /home/
远程备份
scp 需要复制的文件 账户@目的ip地址:/对方的备份目录下
scp ifcfg-eno16777736 root@10.0.1.101:/mnt
实现过程
源主机
[root@node ~]# scp ifcfg-eno16777736 root@10.0.1.101:/mnt
The authenticity of host '10.0.1.101 (10.0.1.101)' can't be established.
ECDSA key fingerprint is ae:9d:91:23:b2:20:e5:5d:df:d9:8a:b3:34:64:68:16.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.1.101' (ECDSA) to the list of known hosts.
root@10.0.1.101's password:
ifcfg-eno16777736
目的主机
[root@node mnt]# ls
[root@node mnt]# ls
ifcfg-eno16777736
scp 常用选项
-r 递归复制
-p 保持文件属性
1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定ssh配置文件;
-l:指定宽带限制;
-o:指定使用的ssh选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。
用rsync实现远程备份备份
rsync -rp 需要复制的文件 对方的ip地址:/ 需要复制到那个目录
rsync -rp /etc/hosts 10.0.1.101:/mnt
rsync -rp 递归保留文件原属性
具体实现过程
源主机
[root@node ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
root@node ~]# rsync -rp /etc/hosts 10.0.1.101:/mnt
root@10.0.1.101's password:
目的主机
[root@node-1 mnt]# ls
ifcfg-eno16777736
[root@node-1 mnt]# ls
hosts ifcfg-eno16777736
[root@node-1 mnt]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
rsync常用参数
rsync是一款强大的文件同步工具,具有丰富的选项。以下是一些常用的rsync命令行选项:
1. `-a` 或 `--archive`:
这是一个组合选项,相当于 `-rlptgoD`(递归、符号链接处理、保留属性、保持时间戳、复制硬链接、保留设备文件和特殊文件)。它用于归档模式,尽可能保持源文件的所有元数据。
2. `-v` 或 `--verbose`:
显示详细输出信息,包括正在处理的文件列表。
3. `-z` 或 `--compress`:
在传输过程中启用压缩,以减少网络带宽使用。
4. `-r` 或 `--recursive`:
递归地同步目录及其子目录内容。
5. `-u` 或 `--update`:
只更新比目标旧或不存在于目标的文件。
6. `-n` 或 `--dry-run`:
干运行模式,仅显示即将执行的操作,但不实际进行任何文件传输。
7. `-e` 或 `--rsh=COMMAND`:
指定用于连接远程系统的shell程序,默认为ssh。例如:`-e ssh`。
8. `-p` 或 `--perms`:
保持文件权限不变。
9. `-t` 或 `--times`:
保持文件修改时间戳不变。
10. `-g` 或 `--group`:
保持组信息不变。
11. `-o` 或 `--owner`:
保持所有者信息不变。
12. `-l` 或 `--links`:
保留硬链接关系(在归档模式下默认开启)。
13. `--delete`:
删除目标目录中源目录没有的文件或目录,确保两边一致。
14. `--exclude=PATTERN`:
排除匹配指定模式的文件或目录。
15. `-i` 或 `--itemize-changes`:
输出详细的更改信息,每个文件都会列出改变状态。
rsync进程守护部署
服务端
第一步:下载安装软件
[root@localhost ~]# yum install -y rsync
第二步:编写配置文件 把原来的配置文件删除
[root@localhost ~]# vim /etc/rsyncd.conf
uid=rsync
gid=rsync
port=873
fake super = yes
use chroot = no
max connections= 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 10.0.0.0/24
#hosts deny =
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment =" welcome to RSYNC backup"
path = /backup
启动配置rsyncd
[root@master ~]# systemctl restart rsyncd
配置注解:
uid=rsync 用户
gid=rsync 组
port=873 端口
fake super = yes 虚拟机用户 伪装管理员
use chroot = no 安全
max connections= 200 同时200个客户端连接
timeout = 300 超时300秒
pid file = /var/run/rsyncd.pid 进程信息
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log 日志文件
ignore errors 忽略错误
read only = false 备份目录可以读写
list = false
hosts allow = 10.0.0.0/24 白名单
#hosts deny =
auth users = rsync_backup 认证用户-rsync——backup
secrets file = /etc/rsync.password 密码信息
[backup] 指定备份目录
comment =" welcome to RSYNC backup"
path = /backup
uid=rsync
gid=rsync
port=873
fake super = yes
use chroot = no
max connections= 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 10.0.1.0/24
#hosts deny =
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment =" welcome to RSYNC backup"
path = /backup
这是一个用于rsync守护进程(rsync服务器)的配置文件,通常命名为`rsyncd.conf`。让我们逐项解析所指定的选项:
- `uid=rsync`:设置rsync服务运行时的用户ID为rsync。
- `gid=rsync`:设置rsync服务运行时的组ID为rsync。
- `port=873`:rsync服务监听的端口号为873。
- `fake super = yes`:允许rsync模拟超级用户权限进行文件同步操作(在chroot环境之外)。
- `use chroot = no`:不使用chroot环境,即不对rsync客户端进行目录级别的隔离。
- `max connections= 200`:最大同时连接数为200个。
- `timeout = 300`:设定超时时间为300秒(5分钟),超过这个时间无数据传输将断开连接。
- `pid file = /var/run/rsyncd.pid`:rsync服务的进程ID文件位置。
- `lock file = /var/run/rsync.lock`:rsync服务的锁文件位置。
- `log file = /var/log/rsyncd.log`:rsync服务的日志记录文件路径。
- `ignore errors`:忽略某些可能发生的错误继续运行。
- `read only = false`:允许对共享模块进行读写操作,而非只读。
- `list = false`:禁止列出所有可用的共享模块。
- `hosts allow = 10.0.0.0/24`:仅允许来自10.0.0.0网段的IP地址访问rsync服务。
- `#hosts deny =`:这一行被注释掉了,但若取消注释则可用来设置拒绝哪些IP或IP段访问。
- `auth users = rsync_backup`:定义了授权用户列表,此处仅有rsync_backup一个用户有权连接。
- `secrets file = /etc/rsync.password`:密码文件位置,其中存储了授权用户的登录密码。
- `[backup]`:定义了一个名为"backup"的共享模块。
- `comment =" welcome to RSYNC backup"`:给"backup"模块添加描述信息。
- `path = /backup`:设置"backup"模块对应的本地同步路径为"/backup"。
第三步:创建rsync服务虚拟用户
[root@localhost ~]# useradd rsync -M -s /sbin/nologin
第四步:创建rsync服务的认证密码文件并修改权限
[root@localhost ~]# echo "rsync_backup:123456">/etc/rsync.password
[root@localhost ~]# chmod 600 /etc/rsync.password
第五步:创建备份文件所需的目录并修改用户文件的属主和属组
[root@localhost ~]# mkdir /backup
[root@localhost ~]# chown rsync.rsync /backup -R
命令注解
`chown rsync.rsync /backup -R` 这条命令是用来更改目录 `/backup` 及其子目录下所有文件和目录的所有权的。
- `chown` 是 Linux 系统中更改文件或目录所有权的命令。
- `rsync.rsync` 表示新的所有者和所属组,即将所有者改为用户 `rsync`,所属组改为组 `rsync`。
- `/backup` 是需要更改所有权的目录路径。
- `-R` 或 `--recursive` 参数表示递归地处理目录下的所有文件和子目录,也就是说不仅更改 `/backup` 目录本身的所有权,也更改其下所有层级的文件和目录的所有权。
这条命令的作用是确保 `/backup` 目录及其内容的所有权都属于 `rsync` 用户和 `rsync` 组,这与上面的 rsyncd 配置相呼应,因为在 rsync 服务配置中指定了以 `rsync` 用户和组运行服务。这样可以保证 rsync 服务有正确的权限来访问和管理 `/backup` 目录中的文件。
第六步:启动备份rsync服务
[root@localhost ~]# systemctl start rsyncd
[root@localhost ~]# systemctl enable rsyncd
客户端配置
客户端部署(网站服务器):rsync 配置文件不用改默认即可
第一步:下载安装软件
[root@localhost ~]# yum install -y rsync
第二步:创建一个密码文件
[root@localhost ~]# echo "123456" >/etc/rsync.password
[root@localhost ~]# chmod 600 /etc/rsync.password
第三步:测试用免交互方式同步文件
[root@localhost ~]# rsync -avz /oldboy/* rsync_backup@10.0.0.25::backup --password-file=/etc/rsync.password
自己的实现演示
[root@node ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
那就备份这个文件吧
一次备份需要输入密码
[root@node ~]# rsync -avz /etc/hosts rsync_backup@10.0.1.134::backup
Password:
sending incremental file list
hosts
sent 215 bytes received 43 bytes 46.91 bytes/sec
total size is 352 speedup is 1.36
直接制定密码文件 前提是你必须有账户和密码,我们前面的配置文件已经有账户和密码了 只不过这是虚拟账户而已
[root@node ~]# rsync -avz /etc/hosts rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 215 bytes received 43 bytes 103.20 bytes/sec
total size is 352 speedup is 1.36
备份结果
[root@master backup]# ls
hosts
[root@master backup]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web01
172.16.1.8 web02
172.16.1.9 web03
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
如果出现报错
1.检查防火墙
2.检查selinux
3.检查rsync配置文件是否出错 例如ip段是否符合
4.命令是否出错
5.rsync服务是否正确运行
实验过程中如果发现还是无法正确备份 你在测试过程中可以重来 ,但是生产环境中一定要仔细仔细再仔细 认真认真再认真
事先准备 梳理流程 比什么都重要
ps:
也可以使用服务器的root用户备份一下看一下
rsync -avz /oldboy/* root@10.0.0.25:/backup
rsync:依然是使用的rsync命令行工具。
-avz:保持不变,仍代表归档模式(保留文件属性和递归同步)、详细输出模式(显示同步过程详情)以及压缩模式(传输时启用压缩节省带宽)。
/oldboy/*:源目录及通配符,表示从本地机器的 /oldboy 目录下同步所有的文件和子目录。
root@10.0.0.25:/backup:目标地址改为了用户名(root)+ 主机地址(10.0.0.25)+ 目标路径(/backup),表明将同步到远程主机10.0.0.25上root用户家目录下的/backup目录
命令注解
rsync -avz /oldboy/* rsync_backup@10.0.0.25::backup --password-file=/etc/rsync.password
-avz:选项参数组合,含义如下:
-a:归档模式,保留源文件的所有属性(如权限、时间戳等)并递归同步目录。
-v:详细输出模式,显示详细的同步过程信息。
-z:压缩模式,在传输过程中启用压缩以减少带宽占用。
/oldboy/*:源目录及通配符,表示从本地机器的 /oldboy 目录下同步所有的文件和子目录。
rsync_backup@10.0.0.25::backup:目标地址,包含了用户名(rsync_backup)、主机地址(10.0.0.25)以及rsync模块名(backup)。这意味着将数据同步到远程主机10.0.0.25上rsync服务的"backup"模块。
--password-file=/etc/rsync.password:指定密码文件,rsync将在连接远程服务器时从该文件中读取密码,从而实现自动身份验证。
综上所述,此命令会把本地机器 /oldboy 目录下的所有文件和子目录,按照详细、递归且压缩的方式同步至远程rsync服务器(IP地址为10.0.0.25)上预设的“backup”共享模块,并通过密码文件进行身份验证
常见故障案例分析 ------可作为工作经验
1.1 rsync客户端执行rsync命令错误:
客户端的错误现象:
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::/backup
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
rsync命令语法理解错误,::/backup是错误的语法,应该为::backup(rsync模块)
1.2 @ERROR: auth failed on module oldboy
客户端的错误现象:
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1. 密码真的输入错误,用户名真的错误
2. secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致
3. /etc/rsync.password文件权限不是600
4. rsync_backup:123456密码配置文件后面注意不要有空格
echo "rsync_backup:123456" >>/etc/rsync.password
rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称
1.3 Unknown module 'backup'
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1. /etc/rsyncd.conf配置文件模块名称书写错误
1.4 Permission denied
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
hosts
rsync: mkstemp ".hosts.5z3AOA" (in backup) failed: Permission denied (13)
sent 196 bytes received 27 bytes 63.71 bytes/sec
total size is 349 speedup is 1.57
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
异常问题解决:
1. 共享目录的属主和属组不正确,不是rsync
2. 共享目录的权限不正确,不是755
1.5 chdir failed
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
1. 备份存储目录没有建立
2. 建立的备份存储目录和配置文件定义不一致
说明:如果没有备份存储目录
1.6 invalid uid rsync
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
Password:
@ERROR: invalid uid rsync
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
异常问题解决:
rsync服务对应rsync虚拟用户不存在了
1.7 客户端已经配置了密码文件,但免秘钥登录方式,依旧需要输入密码
password file must not be other-accessible
[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
password file must not be other-accessible
continuing without password file
Password:
sending incremental file list
sent 26 bytes received 8 bytes 5.23 bytes/sec
total size is 349 speedup is 10.26
异常问题解决:
rsync客户端的秘钥文件也必须是600权限
个人总结
如果出现报错
1.检查防火墙
2.检查selinux
3.检查rsync配置文件是否出错 例如ip段是否符合
4.命令是否出错
5.rsync服务是否正确运行
6.检查文件权限是否给足
实验过程中如果发现还是无法正确备份 你在测试过程中可以重来 ,但是生产环境中一定要仔细仔细再仔细 认真认真再认真
事先准备 梳理流程 比什么都重要
排除备份
#### 排除文件备份实战
###### 需求1-----备份/data 排除1.txt
```bash
rsync -avz /data --exclude /data/1.txt rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
--exclude /data/1.txt: 排除同步指定的文件,这里是/data/1.txt,该文件不会被同步到远程服务器。
[root@node data]# rsync -avz /data --exclude /data/1.txt rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
sending incremental file list
sent 221 bytes received 25 bytes 98.40 bytes/sec
total size is 0 speedup is 0.00
```
###### 需求2 排除一个目录
```bash
rsync -avz /data --exclude /data/test rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
--exclude /data/test: 排除同步指定的文件夹,这里是/data/test,该文件不会被同步到远程服务器。
[root@node data]# rsync -avz /data --exclude /data/test rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
sending incremental file list
data/
data/1.txt
data/10.txt
data/2.txt
data/3.txt
data/4.txt
data/5.txt
data/6.txt
data/7.txt
data/8.txt
data/9.txt
sent 604 bytes received 218 bytes 328.80 bytes/sec
total size is 0 speedup is 0.00
```
补充
实战1
如何实现发送邮件
https://www.cnblogs.com/nwq1101/gallery/2385423.html 对应图片查看
SQRLLCVNTQXQHAQE这个是授权码唯一的这就不展示了
服务器地址:
POP3服务器: pop.163.com
SMTP服务器: smtp.163.com
IMAP服务器: imap.163.com
邮件
linux服务器---企业邮箱163 -----运维人员(QQ邮箱)
准备:安装postfix
启用postfix
关闭防火墙
selinux
1.配置163企业邮箱
2.编写linux服务邮件相关配置文件
[root@master ~]# vi /etc/mail.rc
set smtp-auth-user=用户名@163.com
set smtp-auth-password=客户端授权密码
set smtp-auth=login
set from=15178374440@163.com 你自己的账户
set smtp=smtp.163.com 填写配置的邮箱
set smtp-auth-user=15178374440@163.com 自己的账户
set smtp-auth-password=SQRLLCVNTQXQHAQE 授权码唯一 (为了安全所以这个是无效的授权码)
set smtp-auth=login 自动登录
[root@master ~]# vim /etc/mail.rc
把下面这个粘贴进去,如果粘贴格式有问题 ,可以用:set paste 模式确保粘贴不会出现问题
set from=15178374440@163.com
set smtp=smtp.163.com
set smtp-auth-user=15178374440@163.com
set smtp-auth-password=SQRLLCVNTQXQHAQE
set smtp-auth=login
[root@master ~]# systemctl restart postfix.service
3.发送邮件测试
echo "系统有异常问题,请检查系统" |mail -s "异常警告" 15178374440@163.com
cat /etc/hosts | mailx -s "Hosts File Content" 15178374440@163.com
cat /etc/hosts | mailx -s "Hosts File Content" 3078499367@qq.com
也可以目录信息发送到邮箱里
测试效果
实战2
使用脚本自动备份
压缩 /backup
tar zcvfP /backup/www_$(date +%F).tar.gz /html/www
find /backup/ -type f -mtime +10|xargs rm
rsync -avz /backup/* rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
[root@node backup]# tar zcvf /backup/www_$(date +%F).tar.gz /html/www
tar: Removing leading `/' from member names
/html/www/
[root@node backup]# ls
www_2024-03-17.tar.gz
具体实现过程
客户端
[root@node www]# rsync -avz /backup/* rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
sending incremental file list
www_2024-03-17.tar.gz
sent 222 bytes received 43 bytes 106.00 bytes/sec
total size is 114 speedup is 0.43
服务器
[root@master backup]# ls
[root@master backup]# ls
www_2024-03-17.tar.gz
root@node ~]# mkdir sh
[root@node ~]# cd sh
[root@node sh]# vi backup.sh
#以下是备份脚本内容
#!/bin/bash
mkdir -p /backup
tar zcvfP /backup/www_$(date +%F).tar.gz /html/www
find /backup/ -type f -mtime +10|xargs rm
rsync -avz /backup/* rsync_backup@10.0.1.134::backup --password-file=/etc/rsync.password
[root@node sh]# chmod +x backup.sh
[root@node sh]# sh backup.sh
/html/www/
/html/www/sh/
/html/www/sh/backup.sh
rm: missing operand
Try 'rm --help' for more information.
sending incremental file list
www_2024-03-17.tar.gz
sent 421 bytes received 49 bytes 188.00 bytes/sec
total size is 310 speedup is 0.66
shell脚本的运行方式
运行shell脚本的几种主要方式如下:
1. **赋予可执行权限后执行**:
- 先通过`chmod`命令给脚本添加执行权限:
```
chmod +x script.sh
```
- 然后,通过绝对路径或相对路径执行脚本:
```
./script.sh # 如果当前目录下有script.sh
/path/to/script.sh # 如果脚本位于其他目录
```
2. **使用bash或sh命令执行**:
- 不需要给脚本增加执行权限,直接通过bash或sh命令执行:
```
bash script.sh
sh script.sh
/bin/bash script.sh
/bin/sh script.sh
```
3. **使用source命令或`.`执行**:
- 在当前shell环境中执行脚本,这样脚本中设置的变量、函数等将影响当前shell:
```
source script.sh
. script.sh
```
总结起来,以下是具体的执行方式:
- **直接执行(需先赋予可执行权限)**:
```bash
chmod +x script.sh
./script.sh
```
- **通过shell解释器执行**:
```bash
bash script.sh
sh script.sh
```
- **在当前shell上下文中执行**:
```bash
source script.sh
. script.sh
```
每种执行方式都有其特点,直接执行会在一个新的子shell进程中运行脚本,而使用`source`或`.`执行则在当前shell进程中运行,使得脚本中改变的环境变量和函数作用于当前shell。