软件包管理
软件包管理系统:dpkg、RPM包管理员
软件包管理系统前端:APT、YUM
软件包及依赖查询网站
Ubuntu
1 2 3
| # 查看依赖 apt-cache depends gnome-core # 正向依赖(查看某个包依赖哪些包) apt-cache rdepends gnome-core # 反向依赖(查看哪些包依赖这个包)
|
Centos
1 2 3
| # 查看依赖 dnf deplist perl # 正向依赖(查看某个包依赖哪些包) repoquery --whatrequires perl # 反向依赖(查看哪些包依赖这个包,需要安装 dnf install -y yum-utils
|
dpkg
https://man.archlinux.org/man/dpkg
1 2
| dpkg --help dpkg -L openssh-server # 显示指定软件包在系统中安装的所有文件和目录的完整路径列表。
|
apt-get、apt-cache、apt
https://man.archlinux.org/man/apt-get
https://man.archlinux.org/man/apt-cache
https://man.archlinux.org/man/apt
简单来说:
apt-get:处理包的安装、升级和移除,是传统的、面向脚本的工具。
apt-cache:用于查询本地软件包信息(数据库),例如搜索、查看依赖。
apt:是较新的前端工具,结合了 apt-get 和 apt-cache 的最佳功能,并提供了更美观、更友好的用户体验。
三个 APT 工具的详细对比
| 工具 |
主要功能/定位 |
典型命令示例 |
特点总结 |
apt-get |
核心操作:负责从软件源获取和安装软件包,处理实际的系统更改。传统工具,适合脚本编写。 |
apt-get install <package> apt-get remove <package> apt-get update apt-get upgrade |
面向底层:输出信息相对简单,没有进度条。是 APT 工具家族中历史最悠久、功能最稳定的工具。 |
apt-cache |
查询操作:负责查询本地缓存的软件包数据库(Metadata)。它不会更改系统或下载软件包。 |
apt-cache search <keyword> apt-cache show <package> apt-cache depends <package> |
信息获取:仅用于搜索和显示软件包信息、依赖关系等。是用户了解软件包情况的强大工具。 |
apt |
用户界面:结合了 apt-get 和 apt-cache 的常用功能。推荐日常使用的现代工具。 |
apt install <package> apt remove <package> apt update apt upgrade apt search <keyword> |
用户友好:提供美观的进度条、颜色高亮和更简洁的输出。它不是要取代 apt-get,而是提供一个更好的用户界面。 |
rpm
https://man.archlinux.org/man/rpm
1
| rpm -ql openssh-server # 列出软件包中的文件。显示指定软件包在系统中安装的所有文件和目录的完整路径列表。
|
dnf/yum
https://man.archlinux.org/man/extra/dnf/dnf4
https://man.archlinux.org/man/extra/dnf5/dnf5
dnf 是 yum 的改进和取代者。
查看系统安装了哪些软件包
查看软件包依赖了哪些包
查看软件包依赖了哪些动态库
查看软件包安装了哪些文件
查看文件来自哪个软件包
iptables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # REDIRECT 是 DNAT 的一种特例,用于将流量“重定向”到本机的某个端口。它会把数据包的 目标 IP 改为本机 IP,并可选地修改目标端口。方向:外部 → 本机。常用场景:本机透明代理、流量重定向/端口转发、本机端口劫持。 # DNAT 改变数据包的目标地址和目标端口,使外部访问被转发到内网主机(入站端口映射)。方向:外部 → 内部。常见场景:外部访问内网服务(端口映射)、公网访问转发到私网服务器。 # SNAT(Source NAT)用于修改数据包的源IP(和可选的源端口),使外部服务器认为请求来自指定的公网IP。方向:内部 → 外部。常见场景:内网主机访问外网时共享一个公网IP、多网卡服务器的流量伪装、NAT 路由器出站流量转换。
# 若忽略出站入栈网卡,则作用于所有网卡流量 iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8989 -j REDIRECT --to-port 22 # iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8989 -j DNAT --to-destination 192.168.0.7:22 # iptables -t nat -A POSTROUTING -o ens33 -s 192.168.0.0/24 -j SNAT --to-source 114.114.114.114 # 内网 192.168.0.0/24 子网的主机访问外网时,源地址被替换为公网IP 114.114.114.114。
# 查看 NAT 表 (nat table) 中 PREROUTING 链 的所有规则,并以数字形式显示(不反查 DNS / 服务名)。 # -t nat 指定 NAT 表(专门处理地址转换,DNAT/SNAT/REDIRECT) # -L 列出(List)该表中指定链的所有规则 # PREROUTING 指定要查看的链(chain)。PREROUTING 用于入站数据包,包到达本机前触发。 # -n 以数字方式显示 IP 和端口,不反查域名或服务名(更快更准确) # --line-numbers 给每条规则显示一个编号,便于删除或修改特定规则 iptables -t nat -L PREROUTING -n --line-numbers
iptables -t nat -D PREROUTING 1 # 根据行号删除规则 iptables -t nat -D PREROUTING -i ens33 -p tcp --dport 8989 -j REDIRECT --to-port 22 # 按规则内容删除规则
|
流编辑器——sed
Sed 是一款非常强大且常用的 流编辑器(Stream Editor),非常适合做批量的替换、删除、插入、打印等文本变换。
简介与工作原理
- 流编辑器: Sed 一次只处理一行内容。
- 工作空间: Sed 处理文件时,会将当前处理的行读入一个临时缓冲区,称为 “模式空间” (pattern space)。
- 处理流程: Sed 命令会对模式空间中的内容进行处理,处理完成后,默认会将模式空间的内容输出到标准输出(屏幕)。接着清空模式空间,读取下一行,重复上述过程,直到文件末尾。
- 非破坏性: 默认情况下,Sed 不会修改原文件内容,而是将结果输出到标准输出,除非使用重定向或特定的选项(如
-i)来保存更改。
sed 常用语法格式
最基本的 Sed 命令格式如下:
1 2 3
| sed [选项] 'sed命令' 文件名 # 或 sed [选项] -f 脚本文件 文件名
|
常用选项 (Options)
| 选项 |
作用 |
-n |
静默模式(或安静模式)。默认 Sed 会打印所有行,使用此选项后,只有被显式命令(如 p 打印命令)处理的行才会被打印。 |
-e |
允许多个 Sed 命令/脚本。例如:sed -e 'command1' -e 'command2' file |
-f |
指定 Sed 脚本文件。例如:sed -f script.sed file |
-i |
直接修改原文件。这个选项非常重要,但使用时要小心,最好先备份文件。 |
|
|
地址(Address)
Sed 命令可以指定一个地址或一个地址范围,以限制命令的作用范围。
| 地址格式 |
作用 |
示例 |
| 无地址 |
作用于文件中的所有行。 |
's/old/new/' |
| 单行号 |
作用于指定的行。 |
'5d' (删除第 5 行) |
$ |
代表文件的最后一行。 |
'$d' (删除最后一行) |
/regex/ |
作用于匹配正则表达式的行。这是查找命令 |
'/error/d' (删除包含 “error” 的行) |
| 地址范围 |
作用于从起始地址到结束地址之间的行(包含边界)。 |
|
addr1,addr2 |
1,5d (删除第 1 到 5 行) |
|
addr1,/regex/ |
3,/end/d (删除第 3 行到第一个匹配 /end/ 的行) |
|
/regex1/,/regex2/ |
/start/,/end/d (删除第一个匹配 /start/ 到第一个匹配 /end/ 的行) |
|
sed 常用命令 (Commands)
sed 命令通常紧跟在地址后面。
替换:s (substitute)
这是 sed 最常用、最强大的功能。
- 格式:
[地址]s/旧字符串/新字符串/标志
- 示例:
s/foo/bar/:将每行中第一个 foo 替换为 bar。
s/foo/bar/g:全局替换,将行中所有 foo 替换为 bar。
s/foo/bar/p:打印发生替换的行。通常配合 -n 选项使用。
s/foo/bar/w output.txt:将发生替换的行写入 output.txt 文件。
s#/#\\/#g:当替换内容或目标字符串中包含 / 时,可以使用其他分隔符,例如 #。详见下文 sed 命令分隔符
删除:d (delete)
- 格式:
[地址]d
- 示例:
3d:删除第 3 行。
1,5d:删除第 1 到 5 行。
/^#/d:删除以 # 开头的行 (常用于删除注释行)。
'/^$/d':删除所有空行。
打印:p (print)
- 格式:
[地址]p
- 用途: 配合
-n 选项,只打印指定的行或匹配的行。
- 示例:
sed -n '5p' file:只打印第 5 行。
sed -n '/config/p' file:只打印包含 config 关键字的行。
sed -n '1,10p' file:只打印前 10 行。
追加/插入/更改:a / i / c
a (append): 在匹配行之后追加新文本。
- 示例:
'/error/a\--- An Error Occurred ---' (在包含 error 的行后面追加文本)
i (insert): 在匹配行之前插入新文本。
- 示例:
'1i\# This is a header' (在文件第一行前插入一行)
c (change): 用新文本替换匹配行或匹配范围的所有内容。
- 示例:
'3c\Replacement Text' (用新文本替换第 3 行)
注意: a、i 和 c 命令后的文本必须换行书写(在命令行中通常用 \ 来转义换行符,或者直接跟在命令后,用 \ 隔开)。
sed 命令分隔符
分隔符(delimiter)在 sed 命令中主要用于 替换命令 和 查找命令 / ,尤其是涉及到正则表达式的部分。默认是 /。
替换命令 (s)
这是最常见的使用自定义分隔符的场景。
- 基本格式:
s/查找模式/替换字符串/标志
- 使用自定义分隔符的格式:
sX查找模式X替换字符串X标志
- 这里的
X 可以是任何非空格、非换行符的单个字符。
| 示例命令 |
分隔符 |
场景说明 |
s#/var/log#/tmp/log#g |
# |
当查找或替换的内容中包含 / 时(例如文件路径),使用 # 可以避免对 / 进行转义。 |
s@^#@ @ |
@ |
当查找或替换的内容中包含 # 时(例如配置文件中的注释),可以使用 @。 |
查找/地址命令 (/regex/)
分隔符也可以用于定义地址(即指定 Sed 命令作用的行范围)。当您需要查找的模式中包含默认分隔符 / 时,可以自定义分隔符。
- 基本格式:
/正则表达式/命令
- 使用自定义分隔符的格式:
\X正则表达式X命令
| 示例命令 |
分隔符 |
场景说明 |
/\//d |
/ (默认) |
删除包含默认分隔符 / 的行,但需要转义 (\/)。 |
sed '\#/home/#d' file |
# (自定义) |
删除包含 /home/ 路径的行,无需转义路径中的 /,但需在开头用 \ 声明自定义分隔符。 |
进阶示例
组合多个命令
使用 -e 选项或分号 ;:
1 2 3 4
| # 删除空行,并将所有的 'old' 替换为 'new' sed -e '/^$/d' -e 's/old/new/g' file.txt # 或者使用分号 sed '/^$/d ; s/old/new/g' file.txt
|
括号分组和后向引用
在替换命令 s 中,可以使用括号 () 对匹配模式的一部分进行分组,并在替换字符串中用 \1, \2, … 进行引用。注意: 括号需要用 \ 进行转义,即 \( 和 \)。
1 2 3
| # 假设一行内容是 "apple banana" # 将其转换为 "banana apple" echo "apple banana" | sed 's/\(apple\) \(banana\)/\2 \1/'
|
\(apple\) 匹配并捕获第一个单词,标记为 \1。
\(banana\) 匹配并捕获第二个单词,标记为 \2。
- 替换字符串
\2 \1 将它们的位置交换。
文件定位
whereis命令 、 locate/slocate命令 、 find命令 、 which命令 、 rpm命令
以 nginx 安装目录为例:
1 2 3 4 5 6 7 8 9 10 11 12
| [root@localhost ~]# whereis nginx [root@localhost ~]# whereis -b nginx # 定位指令的二进制程序、源代码文件和man手册页等相关文件的路径 [root@localhost ~]# locate nginx # 搜索一个数据库/var/lib/locatedb,查找目录与文件,但查不到最新的变动,为避免这种情况应先使用updatedb命令 [root@localhost ~]# find / | grep nginx # 在指定目录下查找子目录与文件
[root@localhost ~]# which nginx # 查找并显示给定命令(可执行程序)的绝对路径。查看某个系统命令是否存在并显示命令位置。
# rpm命令是RPM软件包的管理工具 [root@localhost ~]# rpm -qa | grep nginx # 列出安装过的软件包,且包含字符串nginx [root@localhost ~]# rpm -q nginx # 获取nginx软件包的全名 [root@localhost ~]# rpm -ql nginx # rpm包中文件的安装位置 [root@localhost ~]# rpm -qal | grep nginx
|
网络状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| yum install -y lsof lsof -i:8080 # 查看端口是否被占用,有列头,推荐使用
yum install -y net-tools netstat -ntlp # 查看当前所有tcp端口 netstat -nulp # 查看当前所有udp端口 netstat -an | grep 80 # 查看所有包含80的端口使用情况 netstat -ntulp | grep 80 # 查看所有包含80的端口使用情况,包括PID(进程ID)、进程名。 netstat -tunlp | grep 80 # 查看所有包含80的端口使用情况,包括PID(进程ID)、进程名。 # -t : 指明显示TCP端口 # -u : 指明显示UDP端口 # -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序) # -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序。 # -n : 不进行DNS轮询,显示IP(可以加速操作)
|
进程状态
Linux ps 命令 - 菜鸟
1 2 3 4 5 6 7 8
| [root@localhost ~]# ps aux [root@localhost ~]# ps aux | grep nginx
[root@localhost ~]# ps -f [root@localhost ~]# ps -ef [root@localhost ~]# ps -ef | grep nginx
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
|
输出头(标题)
Linux head 命令 - 菜鸟
在使用Linux命令时,如果命令中有管道 | ,则输出的信息中,头(标题)信息丢失,要想看每一列代表什么意思很不方便。
例如 ps auxw:
1 2 3 4 5 6 7 8 9 10 11
| $ ps axuw USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 193984 6556 ? Ss 08:51 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 08:51 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? S< 08:51 0:00 [kworker/0:0H] root 5 0.0 0.0 0 0 ? S 08:51 0:00 [kworker/u128:0] root 6 0.0 0.0 0 0 ? S 08:51 0:00 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 08:51 0:01 [migration/0] root 8 0.0 0.0 0 0 ? S 08:51 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 08:51 0:03 [rcu_sched] root 10 0.0 0.0 0 0 ? S< 08:51 0:00 [lru-add-drain]
|
再加上管道符后
1 2 3 4 5
| $ ps axuw | grep redis esuser 2636 0.0 0.0 192 4 ? Ss 08:52 0:00 /usr/bin/dumb-init -- /redis-commander/docker/entrypoint.sh polkitd 2654 0.2 0.4 52956 9020 ? Ssl 08:52 0:09 redis-server *:6379 esuser 2810 0.0 1.9 272292 36548 ? Ssl 08:52 0:01 /usr/bin/node ./bin/redis-commander root 39925 0.0 0.0 112824 980 pts/0 S+ 10:05 0:00 grep --color=auto redis
|
可以看到头(标题)已经丢失。
一个简单的办法,通过 2 条命令叠加,获取头和内容:
1 2 3 4 5 6
| $ ps axuw | head -1;ps axuw | grep redis USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND esuser 2636 0.0 0.0 192 4 ? Ss 08:52 0:00 /usr/bin/dumb-init -- /redis-commander/docker/entrypoint.sh polkitd 2654 0.2 0.4 52956 9020 ? Ssl 08:52 0:09 redis-server *:6379 esuser 2810 0.0 1.9 272292 36548 ? Ssl 08:52 0:01 /usr/bin/node ./bin/redis-commander root 40905 0.0 0.0 112824 984 pts/0 S+ 10:07 0:00 grep --color=auto redis
|
也就是先用命令本身加 | head -1 取到头(标题),然后再使用该命令输出内容,两者叠加输出即得到所要结果。
排序——sort
Linux sort命令 - 菜鸟
排序命令——sort
按列排序,数字大的在前:
1 2 3 4 5 6 7 8
| $ ps auxw | sort -rnk 2 root 44271 0.0 0.0 126840 928 pts/0 S+ 10:14 0:00 sort -rnk 2 root 44270 0.0 0.0 155448 1868 pts/0 R+ 10:14 0:00 ps auxw root 44269 0.0 0.0 108052 612 ? S 10:14 0:00 sleep 1 201 44263 0.0 0.0 1560 248 ? SN 10:14 0:00 sleep 1 201 33288 0.0 0.0 2412 1400 ? SN 09:52 0:01 bash /usr/libexec/netdata/plugins.d/tc-qos-helper.sh 1 root 8204 0.0 0.0 0 0 ? S< 09:02 0:00 [kworker/11:1H] ......
|
该例子,将第 2 列进行排序,最大的数排前面。
若只想看前10条的内容:
1
| $ ps auxw | sort -rnk 2 | head -10
|
将实际内存消耗最大的10个进程显示出来:
1 2
| $ ps auxw | head -1; ps auxw | sort -rnk 6 | head -10 $ ps auxw --sort=-rss | head -11
|
统计——wc
统计命令——wc
切分——cut
切分命令——cut
去重——uniq
去重命令——uniq
强大的文本分析命令——awk
awk 命令 - 菜鸟
强大的文本分析命令——awk
1
| ps -ef | grep mar-service.jar:60002 | grep -v grep | awk '{ print }'
|
服务管理
systemctl命令 :是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。
1 2 3 4 5 6 7 8 9 10 11
| # 查看所有可用的单元文件 [root@localhost ~]# systemctl list-unit-files | grep '' # 查看所有已安装服务 [root@localhost ~]# systemctl list-unit-files --type=service | grep ''
# 输出激活的unit,下面两个命令等效 [root@localhost ~]# systemctl | grep '' [root@localhost ~]# systemctl list-units | grep '' # 输出激活的类型为service的unit [root@localhost ~]# systemctl list-units --type=service | grep '' [root@localhost ~]# systemctl list-units --type=service | grep nginx
|
vim 中查找和替换
vi / vim 键位图: https://www.runoob.com/linux/linux-vim.html
https://harttle.land/2016/08/08/vim-search-in-file.html
https://blog.csdn.net/ballack_linux/article/details/53187283
清空历史命令
history命令
.bash_history 默认可记录 500 条历史命令。
只有在正常退出当前 shell 时,在当前 shell 中运行的命令才会保存至 .bash_history 文件中。
1 2 3
| [root@localhost ~]# history 10 # 显示最近使用的10条历史命令 [root@localhost ~]# history -c # 清空当前shell历史命令记录 [root@localhost ~]# rm -rf ~/.bash_history # 删除'.bash_history'文件
|
若想在每次登录后都清空历史记录,可以在登录后或登出前执行 rm -rf ~/.bash_history 即可。
Wget 和 cURL
百科: Wget 、 wget命令 、 cURL 、 curl命令
curl 与 wget
wget命令 用来从指定的URL下载文件。
curl命令 是一个利用URL规则在命令行下工作的文件传输工具。curl URL 默认将下载文件输出到stdout,将进度信息输出到stderr(默认也是终端),可以使用 -O(使用原文件名)或 -o(指定输出文件名)指定输出位置。curl支持更多的协议,还支持cookies、认证、限速、文件大小等特征。
1 2
| [root@localhost ~]# wget -c URL [root@localhost ~]# curl URL -O --progress
|
删除文件/文件夹
1 2 3 4
| rm -rf # 文件或文件夹名 # -i 删除前逐一询问确认。 # -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。 # -r 将目录及以下之档案亦逐一删除。
|
解压缩
tar
1 2 3
| # 解压 tar -zxvf jdk-7u80-linux-i586.tar.gz tar -zxvf /mnt/hgfs/SharedFolders/openjdk-11+28_linux-x64_bin.tar.gz -C /data/
|
zip
1 2 3 4 5 6 7 8 9 10 11 12
| # 安装zip、unzip应用 yum install zip unzip # Centos apt install zip unzip # Ubuntu
# 解压 unzip /mnt/hgfs/SharedFolders/linuxx64_12201_database.zip -d /data # 将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip zip -q -r html.zip /home/html # 如果在我们在 /home/html 目录下,可以执行该命令 zip -q -r html.zip * # 从压缩文件 cp.zip 中删除文件 a.c zip -dv cp.zip a.c
|
7z
Linux有问必答:Linux 中如何安装 7zip
支持 7Z,ZIP,Zip64,TAR,RAR,CAB,ARJ,GZIP,BZIP2,CPIO,RPM,ISO,DEB 压缩文件格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 安装 $ yum install p7zip p7zip-plugins $ apt install p7zip-full p7zip-rar
# 将01.jpg和02.png压缩成一个7z包 $ 7z a pkg.7z 01.jpg 02.png # 将所有的.jpg文件压缩成一个7z包 $ 7z a pkg.7z *.jpg # 将文件夹folder压缩成一个7z包 $ 7z a pkg.7z folder # 将pkg.7z中的所有文件解压出来,e是解压到当前路径 $ 7z e pkg.7z # 将pkg.7z中的所有文件解压出来,x是解压到压缩包命名的目录下 $ 7z x pkg.7z
|
nohup
相关链接: 百科 、 Linux nohup 命令 - 菜鸟 、 shell中的特殊字符大全
nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。 如果不将 nohup 命令的输出重定向,输出将追加到当前目录的 nohup.out 文件中。
nohup command >/dev/null 2>&1 & 意思就是,将command保持在后台运行,并且将输出的日志忽略。
1 2
| nohup java -jar -Dserver.port=9088 gateway.jar >/dev/null 2>&1 &
|
备份脚本
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
| #!/bin/bash
# 日志文件的存放路径。$0 代表当前脚本的路径,dirname "$0" 会提取出脚本所在的目录。这意味着该日志文件将始终生成在与该脚本相同的目录下。 LOG_FILE=$(dirname "$0")/backup.log
# 日志记录函数。$1 代表传入的参数。tee指令会从标准输入读取数据,将其内容传输到标准输出(屏幕),同时保存成文件,-a (append):追加到现有文件的末尾,而不是覆盖它。 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" }
# 核心备份函数 backup() { local src="$1" local dest="$2" log "Starting backup: $src -> $dest" if rsync -avz --progress --exclude='*.log' "$src" "$dest"; then # 如果 rsync 成功执行(返回码为 0),则记录成功日志。 log "Backup succeeded: $src -> $dest" else # 如果失败,记录错误日志,并执行 exit 1。这非常重要,意味着只要有一个目录备份失败,整个脚本就会立刻终止,不会继续尝试备份后面的目录。 log "ERROR: Backup failed: $src -> $dest" exit 1 fi }
# 备份的目标地址,需要提前配置SSH信任 TARGET="192.168.0.79:/vg/backup/cleansource"
# --------------------------- 执行备份任务
# 备份SCA Web backup "/ssd1" "$TARGET" # 备份Minio backup "/vg/cleansource/minio" "$TARGET" # 备份知识库 backup "/vg/cleansource/kb" "$TARGET"
# 备份数据库正确的做法是:1、先使用数据库自带的导出工具(如 mysqldump 或 pg_dump)生成一个逻辑备份文件;2、然后再用 rsync 同步备份文件。
log "All backups completed successfully."
|