2007年8月 归档

备份几台服务器的/home分区并将备份文件传到备份主机上:

其实就是执行个命令:

dump 0uf host.date.dump /home 

#!/usr/bin/perl -w

use strict;



$/='';

my %data;

while(<DATA>){

chomp $_;

my ($host,$dir)=split /\n/;

$data{$host}=$dir;

}

my $backuphost="backuphost";

my $backup="/backup";

my $host=shift;


my $backuptype=shift;


my $dir_backup=$data{$host};


my $time=localtime;

my @timetur=split / /,$time;

$time=join '-',@timetur[4,1,2,0];


my $archive=$host.".".$time.$backuptype.".dump";


$backuptype=$backuptype."uf";


print "待备份主机:$host\n";

print "备份类型:$backuptype\n";

print "待备份目录:$dir_backup\n";

print "生成的文件:$archive\n";

print "现在开始备份.....\n";

`ssh $host "rm -rf $host.*;dump $backuptype $archive $dir_backup"`;

if($?){

print "备份失败\n";

}else{

print "备份完成\n";

}

print "复制到备份主机$backuphost:$backup.....\n";

`scp $host:$archive $backuphost:$backup`;

if($?){

print "复制备份失败\n";

}else{

print "复制备份完成\n";

}

__DATA__

web

/home


jt

/home


nsp

/home


运行脚本:

map和grep

| 暂无评论 | 暂无引用通告

mapgrep都是列表处理函数,它们将一个列表转换成另一个列表。它们的语法如下:

map EXPRESSION,LIST;

map BLOCK,LIST;

grep EXPRESSION,LIST;

grep BLOCK,LIST;

map的目的是逐个转换列表中的元素,并产生一个新的列表作为结果,而grep是通过表达式或者程序块被计算为TrueFalse值来返回原始列表的一个子集列表。

文件名globbing

| 暂无评论 | 暂无引用通告

    Perl中通过文件glob的操作符glob提供相当于shell中的指定多个文件的"通配符"语法的功能,文件glob的操作符glob将返回与所指定的glob文件模式相匹的所有文件的列表。

下面是一些例子:

@html_file=glob '/home/site/*.html';

@three_letter_extensions=glob '*.???';

@lcfirst=glob '[a-z]*';

@files=glob 'file[0-9][0-9][0-9]';

@files=glob '???*';


读行操作符<>

| 暂无评论 | 暂无引用通告

在编写脚本的过程中,我们从文件句柄中读取数据,使用最多的操作符基本上就是读行操作符<>了,正因为如此,也许我们应该多了解一下读行操作符:

最常用的两种操作:

读一行:

open FH,"file" ;

$line=<FD>;

一次读整个文件

open FH,"file";

@lines=<FH>;

定义行分隔符

段落模式:

$/=''相当于$/='\n\n'

未定义行分隔符:

undef $/ 整个文件就是一个记录

精确定义记录的长度:

$re_size=32;

$/=\$re_size;

这样的话每次读行操作将读入32个字符。


引用文件句柄

| 暂无评论 | 暂无引用通告

将文件句柄传递给子例程的方法:

1
、将驻留文件句柄在其中的typegob传递给子例程;

2
、将指向驻留在文件句柄在其中的typeglob的引用(包括硬引用和符号引用)传递给子例程。

#!/usr/bin/perl -w
use strict;

sub print_to_fh {
my $fh=shift;
print $fh @_;
}
#
直接传递驻留文件句柄在其中的typeglob
print_to_fh(*STDOUT,"Hello,Passed Filehandle\n");
#
直接传递指向驻留文件句柄在其中的typeglob的符号引用
my $fh=*STDOUT;
print_to_fh(*STDOUT,"Hello Again\n");
#
直接传递指向驻留文件句柄在其中的typeglob的硬引用
$fh=\*STDOUT;
print_to_fh(*STDOUT,"Hello Again And Again\n");


原文参见:http://www.stonehenge.com/merlyn/UnixReview/col06.html

数据:

Fred 210

Barney 195

Betty 200

Wilma 170

Dino 30

第一列是姓名,第二列为分数,我们需要按照分数进行排序;

通常的做法:

#!/usr/bin/perl -w

use strict;

my @data=<>;

my %scores;

foreach (@data){

my ($name,$score)=split;

$scores{$_}=$score;

}

print sort { $scores{$a} <=> $scores{$b}; } @data;

下面这样的排序挺有意思的:

#!/usr/bin/perl

use strict;


my @data=<>;


print map{$_->[0]} sort {$a->[1] <=> $b->[1];} map {my ($name,$score)=split;[$_,$score];} @data;

这样看着有些乱,改成这样:

#!/usr/bin/perl

use strict;


my @data=<>;


print map{$_->[0]}

sort {$a->[1] <=> $b->[1];}

map {my ($name,$score)=split;[$_,$score];} @data;


首先 map {my ($name,$score)=split;[$_,$score];} @data生成一个数组,每个元素都是一个指向一个包含两个元素的数组的引用,将这个数组传递给sort产生排序后的数组,然后将生成的数组传递给map得到最终的结果。

健身去了

| 暂无评论 | 暂无引用通告

  下班回来,简简单单吃了个饭后就跑到健身房去玩了一个多小时,毕业以后就很少参加体育活动了,其实在学校里也很少活动,呵呵!在外面就更是如此了,借口多多,呵呵!现在不去不行了,因为办了健身卡,再不去到期一定用不完!

  不过到那边活动活动挺好的,心情很舒畅,一定要继续坚持!为自己加油! 

 

-0 零  可用于读入整个文件,相当于$/=undef

改变正则表达式定界符时不可省略m

处理目录中的所有文件时可以用-f选项而尽量不用正则表达式匹配出当前目录和上层目录

mysql> select category_id,category_label,category_parent into outfile 'mtcategory.txt' from mt_category;

可以到/var/lib/mysql/数据库名/下找到文件mtcategory.txt文件

也可以用以下命令:

[root@supersun root]# mysql -uroot -p supersun -e "select category_id,category_label,category_parent from mt_category;" >mtcate.txt
 

一个微型数据库

| 暂无评论 | 暂无引用通告

原文参见:http://www.stonehenge.com/merlyn/UnixReview/col04.html

网页上的数据为:

        Name: Randal L. Schwartz
Company: Stonehenge Consulting Services
Street: 4470 SW Hall Suite 107
City: Beaverton
State: Oregon
Zip: 97005
Phone: 503-777-0095

Name: John Big-booty
City: San Angeles
State: California
Zip: 93021
Phone: 291-555-2213

Company: Lips, Inc.
Street: 4221 Wayback Lane
City: Springfield
State: Kansas
Zip: 65554
我们将其复制下来使用命令
[root@supersun unixreview]# perl -ne '$_ =~ s/^\s+(\S)/$1/g;print $_' tinydatabase
选项-n是逐行执行的意思。

记录内网mac地址更新情况

| 暂无评论 | 暂无引用通告

调用nbtscan并分析产生的结果,将mac地址保存到数据文件中,列出更新的数据!

nbtscan的主页为:http://www.unixwiz.net/tools/

此处用到两个模块,运行脚本前先安装模块:

cpan Getopt::Std

cpan IO::Prompt 

首先生原始数据:

[root@supersun macip]# ./ipmac.pl -i m
File exists,Continue?Y

检查更新:

[root@supersun macip]# ./ipmac.pl -f m
Nhost: 192.168.1.16
Now mac: 00:16:76:58:f8:fa
Desc: WORKGROUP\QIN-0796344B3B3

Add it ?(y/other): y

Chost: 192.168.1.46
Last mac: 10:16:96:0c:86:7c
Now mac: 00:16:96:0c:86:7c
Desc: WORKGROUP\1E66F457EDDD4CA
Save it ?(y/other): y
 

MYSQL数据库导出导入

| 暂无评论 | 暂无引用通告

       1.导出整个数据库

  mysqldump -u 用户名 -p 数据库名 > 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

  2.导出一个表

  mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

  3.导出一个数据库结构

无债一身轻

| 暂无评论 | 暂无引用通告
    刚刚跑到招行,将信用卡里的欠债2500元全部还完了,不让他们剥削我了,其实信用卡这东西还是少用为好,算了算我上个月的循环利息啊,滞纳金,还有用信用卡借款手续费总共加起来六七十,唉,老子总共才欠他们多少啊!还完了债,手头的钱就不多了,呵呵,这个月“艰苦”点吧!

在命令行中进行正确交互

| 暂无评论 | 暂无引用通告

对于不考虑非交互的脚本来说,以下的代码也许很方便!

#!/usr/bin/perl -w
use strict;

print ">";
while(my $next_cmd=<>){
        chomp $next_cmd;
        system($next_cmd);
        print ">";
}
在此,我们并不用考虑非交互的情况。但如果我们考虑非交互呢,毕竟要想让脚本在unix系统中更通用一些,这方面还是要考虑的,如上面的代码:

perl中屏蔽多行代码

| 暂无评论 | 暂无引用通告

  以前经常为不知道如何屏蔽多行代码而烦恼,昨天从CU上有贴子介绍屏蔽多行代码的方法:

=for

code

=cut

这才想起这只是将屏蔽的代码转成pod文档。 在此记下不然改天又忘了,呵呵!

一个简单的分页脚本

| 暂无评论 | 暂无引用通告

Term::ReadKey模块中的GetTerminalSizes可以判定屏幕大小

($cwidth,$cheight,$pwidth,$pheight)=GetTerminalSize STDOUT;

$cwidth,$cheigth为以字符为单位的屏幕的宽,高

$pwidth,$pheight为以像素为单位的屏幕的宽,高

[root@supersun tool2sort]# cat page.pl
#!/usr/bin/perl -w
use strict;

use Term::ReadKey;

my ($width,$height)=GetTerminalSize;
my $count=0;

ReadMode 'cbreak';

while(<>){
        print "$.:$_";
        if(++$count == $height-1){
                last if lc(ReadKey 0) eq 'q';
                $count=0;
        }
}
ReadMode 'restore';

计算网络掩码的脚本

| 暂无评论 | 暂无引用通告

[root@supersun tool2sort]# ./ipcalc.pl 192.168.1.2/25
Address:   192.168.1.2          11000000.10101000.00000001.0 0000010
Netmask:   255.255.255.128 = 25 11111111.11111111.11111111.1 0000000
Wildcard:  0.0.0.127            00000000.00000000.00000000.0 1111111
=>
Network:   192.168.1.0/25       11000000.10101000.00000001.0 0000000
HostMin:   192.168.1.1          11000000.10101000.00000001.0 0000001
HostMax:   192.168.1.126        11000000.10101000.00000001.0 1111110
Broadcast: 192.168.1.127        11000000.10101000.00000001.0 1111111
Hosts/Net: 126                   Class C, Private Internet

 

项目主页:http://jodies.de/ipcalc

脚本如下:

判断脚本是否具有交互性

| 暂无评论 | 暂无引用通告

    Perl脚本明显的可以分为两大类:一类是通过终端与实际用户进行交互的程序;另一类是仅仅与其他程序进行通信而不使用终端的程序。下面我们写一个脚本来测试脚本的交互性。脚本内容如下:

#!/usr/bin/perl -w

if(-t STDIN){
        print "终端输入\n";
}else{
        print "非终端输入 ";
}
if(-t STDOUT){
        print "终端输出\n";
}else{
        print "非终端输出 ";
}
 

以下是脚本的运行结果:

[root@supersun terminal]# perl terminaltest.pl
终端输入
终端输出
[root@supersun terminal]# ls |perl terminaltest.pl
非终端输入
终端输出
[root@supersun terminal]# perl terminaltest.pl  >c
[root@supersun terminal]# cat c
终端输入
非终端输出
[root@supersun terminal]# ls |perl terminaltest.pl >cc
[root@supersun terminal]# cat cc
非终端输入
非终端输出

看到这里之后也许你能明白什么叫“与终端交互”了吧!

写好脚本用于上传公钥

| 暂无评论 | 暂无引用通告

   就是因为懒!我不想每次上传公钥到新系统上时重复那几条命令,当然也是为了高效,呵呵!在使用脚本前请更改变量$locate_key的值,将其设定为你公钥所在文件。

#!/usr/bin/perl -w
#名称:pubkey
#用法:pubkey -h hostname [-u username]
use strict;
use Getopt::Std;

my %opt;
my $locate_key="/root/.ssh/pubkeys";
$opt{u}="root";
getopt("hu",\%opt);
print "pubkey -h hostname [-u username]\n",exit unless defined $opt{h};
`ssh $opt{u}\@$opt{h} "if [ -d .ssh ]; then  : ;else mkdir .ssh ;fi ;cd .ssh;cat >>authorized_keys" <$locate_key`;

备份Firefox的书签

| 暂无评论 | 暂无引用通告
打开Firefox,点击“书签-书签管理”启动书签管理面板,再到面板上点击“文件-导出”来备份现有的书签。在升级后,再用书签的“导入”功能把备份的书签导入到新的Firefox的配置中就行。

 

脚本如下:

#!/usr/bin/perl -w
#简单的过滤器,产生彩色的终端输出
use strict;
use Term::ANSIColor qw(:constants);

my %target=();

while(my $arg=shift){
        my $clr=shift;

        if (($arg =~ /^-/) | ( !$clr)){
                print "Useage: rcg [regex] [color] [regex] [color] ...\n";
                exit;
        }
        $target{$arg}=eval($clr);
}

my $rst=RESET;
while(<>){
        foreach my $x (keys %target ){
                $_ =~ s/($x)/$target{$x}$1$rst/g;
        }
        print;
}
 

传参的时候颜色要大写

 

详细内容见:<LINUX SERVER HACKS> 75节

为了更高效点的了解内网中macip的变更情况,我写了以下脚本,在此我们可以学到如果生成彩色的输出及如果使用数组和关联数组的混合以建立复杂的数据结构。

数据文件样式:

192.168.4.99    0       00:12:3f:d2:ef:e6       WORKGROUP\6B76C16DD9D3453 

我们可以使用以下命令生成原始的数据文件:

[root@supersun private]# nbtscan -m 192.168.4.0/24 |awk '{print $1"\t0\t"$3"\t"$2}' >data.mac

然后我们运行脚本,终端输出新增的IP地址及变更的数据并以红色字体打印,根据实际需要我们选择是否保存到数据文件中。

关于此归档

这里是2007年8月的所有日记,它们按照时间从新到老排序。

上一篇日记2007年7月

下一篇日记2007年9月

首页归档页可以看到最新的日记和所有日记。