4。3Linux安全防护之shell命令扩展函数
函数及脚本的综合应用
一shell函数
shell函数:shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数
函数由两部分组成:函数标题、函数体;标题是函数名;函数体是函数内的命令集合;标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用相应的shell。
定义函数的格式为:
函数名(){
命令1
。。。
}
如果愿意,可在函数名前加上关键字function,这取决于使用者。
function函数名()
{
命令1
。。。
}
二应用
例1:删除文件中的空行
这个脚本(脚本名为del。lines)可以处理一个或多个文件。每个文件在用sed删除空行之前要先核实是否存在。
sed的输出被导入一个文件名中含有的临时文件,最后这个临时文件又被移回到原来的文件中。
该脚本使用shift命令取得所有的文件名,用while循环逐个处理所有的文件,直至处理完为止。可以使用del。lineshelp获得一个简短的帮助
!binbash
TEMPFtmpdel。lines。
定义函数
usage()
{
提示脚本运行格式并查看帮助信息
echoUsage:basename0file〔file。。。〕
echotrybasename0helpformoreinfo
exit1
}
如果脚本后面的参数个数为0,即没有参数
if〔eq0〕
then
则提示函数里的内容
usage
fi
while〔gt0〕
do
提示正在执行的是位置1的参数
echo。。。1
如果位置1的参数时help,则显示帮助信息
case1in
help)
echoUsethisscripttodeleteallblanklinesfromatextfile(s)
exit0
;;
)
FILENAME1
判断位置1的文件是否存在
if〔f1〕
then
删除源文件内的空行(不是空格键的空行),并生成新的文件
seddFILENAMETEMPF
mvTEMPFFILENAME
else
echo0cannotfindthisfile:1
fi
将19依次向左传递
shift
;;
esac
done
保存后给脚本文件增加执行权限:chmodxdel。lines
执行脚本进行测试:
注:
1、basename命令能够从路径中分离出文件名。通常用于shell脚本中
2、shift语句用于迁移位置变量,将19依次向左传递
例如,若当前脚本程序获得的位置变量如下:
1file1、2file2、3file3、4file4
则执行一次shift命令后,各位置变量为:
1file2、2file3、3file4
再次执行shift命令后,各位置变量为:
1file3、2file4
例2:如果某些日志文件超过了特定的长度(如8K),那么它的内容将被倒换到另一个文件中,并清除原有文件中的内容。
系统中的有些日志文件增长十分迅速,每天手工检查这些日志文件的长度并倒换这些日志文件(通常是给文件名加个时间戳)是非常乏味的。可以编写一个脚本来自动完成这项工作。该脚本将提交给cron进程来运行,如果某个日志文件超过了特定的长度,那么它的内容将被倒换到另一个文件中,并清除原有文件中的内容。
该脚本中日志文件的长度限制是由变量BLOCKLIMIT设定的。这一数字代表了块数目,在本例中是8(块大小默认为4K)。可以按照自己的需求把这一数字设得更高。所有要检查的日志文件名都保存在变量LOGS中。
这里使用了一个for循环来依次检查每一个日志文件,使用du命令来获取日志文件长度。
如果相应的文件长度大于BLOCKLIMIT变量所规定的值,那么该文件将被拷贝到一个文件
名含有时间戳的文件中,原先的文件长度将被截断为0。
!binbash
BLOCKLIMIT8
MYDATE(datedm)
定义文件列表集合
LOGSvarlogmaillogvarlogmessages
forLOGFILEinLOGS
do
if〔fLOGFILE〕
then
FSIZE(duaLOGFILEawk{print1})
else
echo0connotfindLOGFILE
文件不存在,直接不用执行下面的语句重新开始循环
continue
fi
if〔FSIZEgtBLOCKLIMIT〕
then
cpLOGFILELOGFILEMYDATE
清空原来的文件内容
LOGFILE
fi
done
注:du并不是显示文件的实际大小,而是显示文件所占用的block大小,默认linux系统分区的blocksize是4k,也就是说即使文件只有1个字节,也会占用4k。
lsl则是文件的实际大小