脚本编程与数据备份指南
脚本编程
在脚本编程中,不同语言各有其特点和适用场景。
Perl脚本
Perl语言简洁,在处理文本方面表现出色。例如,与第一个bash脚本等效的Perl脚本如下:
admin@server1:~$ perl -ne 'print if /alf/i' /etc/passwd
此脚本中,
/pattern/
用于匹配模式,后续的
i
表示忽略大小写。以下是一个功能更完善的等效脚本:
#!/usr/bin/perl
my $pattern = shift;
while (<>) {
if (/$pattern/i) {
print;
}
}
Perl语法中的许多元素较为隐晦,但有些与shell语法(或其他常见Unix工具)相似,一旦熟悉这些工具,就不难记住。例如,上述脚本中的
while
和
if
语句,其行为与shell中的等效语句类似。
<>
语法让人联想到shell重定向中的
<
和
>
,它使
while
循环的每次迭代读取一行输入。需要注意的是,与bash不同,Perl中的变量即使在赋值时也需要以
$
开头。
print
语句用于显示
<>
找到的内容。
Perl还有一种反向
if
语法,可以节省一些字符:
#!/usr/bin/perl
my $pattern = shift;
while (<>) {
print if /$pattern/i;
}
将此脚本命名为
finduser.pl
,它假设从标准输入读取密码文件,运行方式如下:
admin@server1:~$ ./finduser.pl alf < /etc/passwd
下一个版本直接打开密码文件:
#!/usr/bin/perl
my $fname = "/etc/passwd";
my $pattern = shift;
open(FILE, $fname) or die("Can't open $fname\n");
while (<FILE>) {
if (/$pattern/i) {
print;
}
}
close(FILE);
若要将匹配限制在名称字段,可以利用Perl的优势:
#!/usr/bin/perl
my $fname = "/etc/passwd";
my $pattern = shift;
open(FILE, $fname) or die("Can't open $fname\n");
while (<FILE>) {
$line = $_;
@fields = split/:/;
if ($fields[4] =~ /$pattern/i) {
print $line;
}
}
close(FILE);
用户提供的参数通过
shift
语句读入
$pattern
变量。脚本还定义了另一种变量:名为
@fields
的数组。Perl的
split
函数将一行中以冒号分隔的每个元素放入数组的单个元素中。然后可以提取第4个元素(实际上是第5个元素,因为元素编号从0开始),并以不区分大小写的方式将其与用户的参数进行比较。
由于
/etc/passwd
在Linux中是一个非常重要的文件,Perl提供了一个内置函数
getpwent
,它可以逐行返回
/etc/passwd
的内容作为字符串数组。以下是使用该函数的脚本:
#!/usr/bin/perl
$pattern = shift;
while (($name,$passwd,$uid,$gid,
$quota,$comment,$gcos,$dir,
$shell,$expire) = getpwent) {
if ($gcos =~ /$pattern/i) {
print "$gcos\n";
}
}
#!/usr/bin/perl
$pattern = shift;
while (@fields = getpwent) {
if ($fields[6] =~ /$pattern/i) {
print "$fields[6]\n";
}
}
若要将搜索限制为普通用户(
uid > 500
),只需简单修改:
#!/usr/bin/perl
$pattern = shift;
while (@fields = getpwent) {
if ($fields[6] =~ /$pattern/i and $fields[2] > 500) {
print "$fields[6]\n"
}
}
PHP脚本
PHP可以由Web服务器(使用CGI)运行,也可以独立运行(使用CLI)。这里使用CLI版本。如果没有CLI版本,可以在基于Debian的系统上使用以下命令安装:
# apt-get install php4-cli
第一个PHP脚本类似于早期的Perl脚本:
#!/usr/bin/php
<?
$pattern = $argv[1];
$file = fopen("/etc/passwd", "r");
while ($line = fgets($file, 200)) {
if (eregi($pattern, $line))
echo $line;
}
fclose($file);
?>
由于PHP最初是作为网页的辅助工具,它假设要解释的文件的默认内容是纯文本,并且只有在
<
或
<?php
标签和
?>
标签之间的代码才被识别为PHP代码。
eregi
函数以不区分大小写的方式进行正则表达式比较。
PHP借鉴了Perl的很多特性,因此它也有
split
函数:
#!/usr/bin/php
<?
$pattern = $argv[1];
$file = fopen("/etc/passwd", "r");
while ($line = fgets($file, 200)) {
$fields = split(":", $line);
if (eregi($pattern, $fields[4]))
echo $line;
}
fclose($file);
?>
PHP似乎没有与Perl的
getpwent
函数等效的函数,因此可以使用解析方法将搜索限制为
uid
值大于500的用户:
#!/usr/bin/php
<?
$pattern = $argv[1];
$file = fopen("/etc/passwd", "r");
while ($line = fgets($file, 200)) {
$fields = split(":", $line);
if (eregi($pattern, $fields[4]) and $fields[2] > 500)
echo $line;
}
fclose($file);
?>
Python脚本
Python脚本与Perl和PHP脚本看起来不同,因为语句以空格结尾,而不是C风格的分号或花括号。制表符也很重要。第一个Python脚本与其他语言的早期尝试类似,用于搜索密码文件并打印包含匹配文本的任何行:
#!/usr/bin/python
import re, sys
pattern = "(?i)" + sys.argv[1]
file = open("/etc/passwd")
for line in file:
if re.search(pattern, line):
print line
Python和Perl一样有命名空间来组织函数,因此此脚本中的函数前面带有
sys.
和
re.
字符串,这有助于使代码模块更加模块化。脚本第三行中的
"(?i)"
使匹配不区分大小写,类似于Perl中的
/i
。
下一个版本将输入行拆分为字段,只需在第一个脚本的基础上简单添加:
#!/usr/bin/python
import re, sys
pattern = "(?i)" + sys.argv[1]
file = open("/etc/passwd")
for line in file:
fields = line.split(":")
if re.search(pattern, fields[4]):
print line
Python有一个与Perl的
getpwent
函数等效的函数
pwd.getpwall()
,可以将搜索限制在包含名称的字段。将以下脚本保存为
finduser.py
:
#!/usr/bin/python
import re, sys, pwd
pattern = "(?i)" + sys.argv[1]
for line in pwd.getpwall( ):
if re.search(pattern, line.pw_gecos):
print line
运行示例:
admin@server1:~$ ./finduser.py alf
('adedarc', 'x', 501, 501, 'Alfredo de Darc', '/home/adedarc', '/bin/bash')
在这个脚本中,打印的行是一个Python列表而不是字符串,并且进行了美化输出。若要以原始格式打印该行,可以使用以下脚本:
#!/usr/bin/python
import re, sys, pwd
pattern = "(?i)" + sys.argv[1]
for line in pwd.getpwall( ):
if re.search(pattern line.pw_gecos):
print ":".join(["%s" % v for v in line])
最后一步是将搜索限制为
uid > 500
的账户:
#!/usr/bin/python
import re, sys, pwd
pattern = "(?i)" + sys.argv[1]
for line in pwd.getpwall( ):
if line.pw_uid > 500 and re.search(pattern line.pw_gecos):
print ":".join(["%s" % v for v in line])
选择脚本语言
选择编程语言与选择文本编辑器或操作系统一样,很大程度上取决于个人喜好。有些人认为Perl难以阅读,而另一些人则不适应Python的空格规则。通常,如果不喜欢某种语言的风格,可能就不会深入使用它。
如果对某种语言的风格感到舒适,那么最重要的标准是完成任务的效率。bash是创建单行脚本和短脚本的快速方法,但当脚本超过一百行左右时,效率会降低。Perl可能难以阅读,但功能强大,并且拥有庞大的CPAN库。PHP看起来像C语言,缺乏命名空间,容易混合代码和输出,并且有一些不错的库。Python可能是最容易阅读和编写的语言,对于大型脚本来说是一个特别的优势。
以下是几种脚本语言特点的对比表格:
| 语言 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| bash | 创建单行和短脚本快速 | 脚本过长效率低 | 简单脚本任务 |
| Perl | 功能强大,有庞大CPAN库 | 难以阅读 | 文本处理等复杂任务 |
| PHP | 类似C语言,有不错的库 | 缺乏命名空间 | Web开发相关脚本 |
| Python | 易读易写 | | 大型脚本开发 |
数据备份
计算机可能会因为各种原因出现故障,如磁盘损坏、芯片烧毁、电线短路等,还可能会遭遇被盗或人为错误。这不仅会导致硬件和软件的损失,更重要的是会丢失数据。恢复丢失的数据需要时间和金钱,同时可能会让客户不满,如果数据涉及法规合规问题,还可能会引起政府的关注。因此,对所有重要数据进行备份是一种低成本的保险措施,业务连续性需要备份和恢复计划。
以下是几种不同情况下有用的数据备份工具:
-
rsync
:适用于大多数用户文件,可通过网络将文件高效传输到另一个系统,当本地系统出现灾难时可从该系统恢复文件。
-
tar
:传统的Unix程序,用于创建压缩的文件集合,可创建方便的数据捆绑包,以便使用本章中的其他工具进行备份。
-
cdrecord/cdrtools
:用于将文件记录到CD - R或DVD上。
-
Amanda
:自动将数据备份到磁带,适用于数据量较大的环境。
-
MySQL工具
:用于解决数据库的特定备份需求。
使用rsync将用户数据备份到服务器
最关键的备份数据是那些难以或成本高昂重新创建的数据,通常是用户经过数月或数年工作积累的数据。系统数据通常可以通过从原始发行介质重新安装相对容易地恢复。
这里主要关注从Linux桌面计算机备份用户数据。备份服务器需要足够的磁盘空间来存储所有用户文件,建议使用专用机器。对于大型办公室,磁盘可以采用RAID(独立磁盘冗余阵列)配置,以进一步防止多次故障。
Linux实用工具
rsync
是一个用于复制大量数据的程序。它可以跳过先前已复制的文件和片段,并使用
ssh
加密数据传输,使得使用
rsync
进行远程备份比使用传统工具(如
cp
、
cpio
或
tar
)更快、更安全。检查系统是否安装
rsync
的命令如下:
# rsync --help
如果看到
bash: rsync: command not found
消息,则需要安装
rsync
包。在Debian系统上安装的命令为:
# apt-get install rsync
通常,希望备份能够保留原始的所有权和权限,因此需要确保所有用户在备份服务器上都有账户和主目录。
rsync
命令的基本语法如下:
rsync options source destination
rsync
的主要命令行选项如下:
| 选项 | 含义 |
| ---- | ---- |
| -a | 归档模式,满足大多数备份需求,比其等效的
-Dgloprt
更易输入和发音 |
| -b | 对目标文件创建备份副本,而不是替换它们,除非需要保留每个文件的旧版本,否则通常不使用此选项,因为它可能会使备份服务器很快被填满 |
| -D | 保留设备,用于复制系统文件,用户文件不需要此选项,仅在以root身份运行
rsync
时有效,包含在
-a
中 |
| -g | 保留复制文件的组所有权,对备份很重要,包含在
-a
中 |
| -H | 保留硬链接,如果两个复制的名称引用同一个文件inode,此选项将在目标位置保留相同的关系,会使
rsync
速度稍慢,但建议使用 |
| -l | 将符号链接复制为符号链接,通常需要包含此选项,否则符号链接将被复制为普通文件,包含在
-a
中 |
| -n | 试运行,查看哪些文件将被传输,但不实际传输 |
| -o | 保留复制文件的用户所有权,对备份很重要,包含在
-a
中 |
| -p | 保留文件权限,对备份很重要,包含在
-a
中 |
| -P | 启用
--partial
和
--progress
|
| –partial | 启用部分文件传输,如果
rsync
被中断,它可以在后续恢复时完成剩余的文件传输 |
| –progress | 显示文件传输进度 |
| -r | 启用递归,传输所有子目录,包含在
-a
中 |
| –rsh=’ssh’ | 使用SSH进行文件传输,建议使用,因为默认的传输协议(
rsh
)不安全,也可以设置
RSYNC_RSH
环境变量为
ssh
来达到相同效果 |
| -t | 保留每个文件的修改时间,包含在
-a
中 |
| -v | 列出正在传输的文件 |
| -vv | 类似于
-v
,但还会列出被跳过的文件 |
| -vvv | 类似于
-vv
,但还会打印
rsync
调试信息 |
| -z | 启用压缩,在互联网上比在高速局域网上更有用 |
由于
rsync
有很多选项和不经常变化的长参数,下面是一个用于运行
rsync
的bash脚本:
#!/bin/bash
export RSYNC_RSH=/usr/bin/ssh
dest=backup1
user=$(whoami)
cd || exit 1
rsync -aHPvz . "${user}@${dest}:."
RSYNC_RSH
环境变量包含
rsync
将使用的shell名称,默认是
/usr/bin/rsh
,这里将其更改为
/usr/bin/ssh
。运行此脚本会将运行该脚本的用户主目录中的所有文件复制到备份服务器上该用户的主目录中。运行示例如下:
amy@desk12:~$ ./backup
Password:
building file list ...
14 files to consider
./
new-brochure.sxw
37412 100% 503.91kB/s 0:00:00 (1, 62.5% of 16)
sales-plan-2006-08.sxw
59513 100% 1.46MB/s 0:00:00 (2, 68.8% of 16)
sales-plan-2006-09.sxw
43900 100% 691.47kB/s 0:00:00 (3, 75.0% of 16)
sales-plan-2006-10.sxw
41285 100% 453.00kB/s 0:00:00 (4, 81.2% of 16)
vacation-request.sxw
15198 100% 154.60kB/s 0:00:00 (5, 87.5% of 16)
sent 185942 bytes received 136 bytes 24810.40 bytes/sec
total size is 210691 speedup is 1.13
amy@desk12:~$
rsync
显示正在考虑14个文件,但实际上只备份了5个文件,因为其他9个文件已经存在于备份服务器上且未被更改。此输出在文件传输完成时显示进度为100%,并指示每个传输所需的时间。在高速局域网上,小文件或中等大小文件的传输时间通常小于一秒。在较慢的连接或对于非常大的文件,会显示已传输的大小和百分比,以及预计完成时间。
rsync
还可以提供备份服务器上的文件列表,这对于验证新的重要文件是否真的存在,以及查找需要恢复的文件(因为文件丢失或用户需要恢复旧版本)很有用。获取此列表的方法是省略选项和目标参数,以下是一个简单的bash脚本:
#!/bin/bash
dest=server1
user=$(whoami)
cd || exit 1
rsync "${user}@${dest}:." | more
运行此脚本的结果示例如下:
amy@desk12:~$ ./backlist
Password:
drwx------ 4096 2006/08/09 13:20:41 .
-rw------- 10071 2006/08/09 12:35:21 .bash_history
-rw-r--r-- 632 2006/07/27 23:03:06 .bash_profile
-rw-r--r-- 1834 2006/07/26 19:59:08 .bashrc
-rwxr-xr-x 108 2006/07/27 23:06:51 .path
-rwxr-xr-x 79 2006/08/09 13:18:34 backlist
-rwxr-xr-x 137 2006/08/09 13:19:29 backrestore
-rwxr-xr-x 88 2006/08/09 13:03:46 backup
-rw-r--r-- 37412 2006/07/17 14:40:52 new-brochure.sxw
-rw-r--r-- 59513 2006/07/19 09:16:41 sales-plan-2006-08.sxw
-rw-r--r-- 43900 2006/07/19 22:51:54 sales-plan-2006-09.sxw
-rw-r--r-- 41285 2006/07/17 16:24:19 sales-plan-2006-10.sxw
-rw-r--r-- 15198 2006/07/10 14:42:23 vacation-request.sxw
drwx------ 4096 2006/08/09 13:12:25 .ssh
amy@desk12:~$
通过以上介绍,我们了解了不同脚本语言的特点和使用方法,以及如何使用
rsync
进行用户数据备份。在实际应用中,可以根据具体需求选择合适的脚本语言和备份工具。
脚本编程与数据备份指南
其他备份工具及应用
除了
rsync
,还有其他几种备份工具在不同场景下发挥着重要作用,下面将详细介绍它们。
tar工具
tar
是传统的Unix程序,主要用于创建压缩的文件集合。其基本语法如下:
tar options source destination
常见选项如下表所示:
| 选项 | 含义 |
| ---- | ---- |
| -c | 创建新的归档文件 |
| -x | 从归档文件中提取文件 |
| -v | 显示详细的操作信息 |
| -f | 指定归档文件的名称 |
| -z | 使用gzip进行压缩 |
| -j | 使用bzip2进行压缩 |
例如,创建一个包含
/home/user/documents
目录的压缩归档文件
documents.tar.gz
,可以使用以下命令:
tar -czvf documents.tar.gz /home/user/documents
若要从归档文件中提取文件,可使用:
tar -xzvf documents.tar.gz
cdrecord/cdrtools
cdrecord/cdrtools
用于将文件记录到CD - R或DVD上。在使用之前,需要确保系统已经正确识别光盘刻录设备。
基本的刻录命令如下:
cdrecord -v dev=/dev/cdrom file.iso
其中,
/dev/cdrom
是光盘刻录设备的路径,
file.iso
是要刻录的ISO镜像文件。
操作步骤如下:
1. 准备ISO镜像文件,可以使用
mkisofs
命令创建:
mkisofs -o file.iso /path/to/files
- 执行刻录命令:
cdrecord -v dev=/dev/cdrom file.iso
Amanda
Amanda
是一个用于自动备份到磁带的工具,适用于数据量较大的环境。其配置相对复杂,以下是基本的配置和使用流程:
- 安装Amanda :在基于Debian的系统上,可以使用以下命令安装:
apt-get install amanda
-
配置Amanda
:主要配置文件位于
/etc/amanda目录下,需要编辑amanda.conf和disklist等文件。
nano /etc/amanda/amanda.conf
在配置文件中,需要指定备份的数据源、备份设备(磁带驱动器)等信息。
3.
启动备份任务
:配置完成后,可以使用以下命令启动备份任务:
amcheck amanda-setname
amdump amanda-setname
其中,
amanda-setname
是在配置文件中定义的备份集名称。
MySQL工具
对于数据库备份,MySQL提供了一些专门的工具,如
mysqldump
。
mysqldump
的基本语法如下:
mysqldump -u username -p database_name > backup.sql
其中,
username
是数据库用户名,
database_name
是要备份的数据库名称,
backup.sql
是备份文件的名称。
操作步骤如下:
1. 登录到MySQL服务器:
mysql -u username -p
- 创建备份文件:
mysqldump -u username -p database_name > backup.sql
- 恢复数据库:
mysql -u username -p database_name < backup.sql
备份策略与最佳实践
制定合理的备份策略对于数据的安全性和可用性至关重要。以下是一些常见的备份策略和最佳实践:
全量备份与增量备份
- 全量备份 :每次备份都复制所有的数据。优点是恢复简单,缺点是备份时间长,占用存储空间大。
- 增量备份 :只备份自上次备份以来发生变化的数据。优点是备份时间短,占用存储空间小,缺点是恢复过程相对复杂,需要依次恢复全量备份和所有增量备份。
可以结合使用全量备份和增量备份,例如每周进行一次全量备份,每天进行一次增量备份。
备份频率
根据数据的重要性和变化频率来确定备份频率。对于重要且变化频繁的数据,建议每天甚至更频繁地进行备份;对于变化较少的数据,可以每周或每月进行一次备份。
异地备份
将备份数据存储在不同的地理位置,以防止因自然灾害、火灾等原因导致本地备份数据丢失。可以使用云存储服务或远程服务器进行异地备份。
定期测试恢复
定期进行恢复测试,确保备份数据可以正常恢复。恢复测试可以发现备份过程中可能存在的问题,如备份文件损坏、恢复脚本错误等。
总结
在脚本编程方面,不同的脚本语言各有优缺点,应根据具体需求和个人喜好选择合适的语言。bash适合快速创建简单脚本,Perl在文本处理方面表现出色,PHP在Web开发相关脚本中有优势,Python则易于阅读和编写,适合大型脚本开发。
在数据备份方面,
rsync
、
tar
、
cdrecord/cdrtools
、
Amanda
和MySQL工具等各有适用场景。应根据数据的特点和需求,制定合理的备份策略,包括选择合适的备份工具、确定备份频率、进行异地备份和定期测试恢复等,以确保数据的安全性和可用性。
通过合理运用脚本编程和数据备份技术,可以提高工作效率,保护重要数据,为业务的连续性提供保障。
以下是整个备份流程的mermaid流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择备份工具}:::decision
B -->|rsync| C(配置rsync参数):::process
B -->|tar| D(创建或提取归档文件):::process
B -->|cdrecord/cdrtools| E(准备ISO镜像并刻录):::process
B -->|Amanda| F(安装和配置Amanda):::process
B -->|MySQL工具| G(使用mysqldump备份或恢复):::process
C --> H(执行备份操作):::process
D --> H
E --> H
F --> H
G --> H
H --> I{是否进行异地备份}:::decision
I -->|是| J(将备份数据传输到异地):::process
I -->|否| K(本地存储备份数据):::process
J --> L(定期测试恢复):::process
K --> L
L --> M([结束]):::startend
希望本文能帮助你更好地掌握脚本编程和数据备份的相关知识和技能。
超级会员免费看
1549

被折叠的 条评论
为什么被折叠?



