读《Linux Shell脚本攻略》第8章笔记

  • A+
所属分类:Shell

1. du
-a:递归地输出指定目录或多个目录中所有文件的统计结果
-h:以KB、MB或块(block)为单位显示磁盘使用情况
-c:显示磁盘使用总计
-s:只输出合计数据(summarize)
–exclude:从磁盘使用统计中排除部分文件
–exclude-from:从文件中获取需要排除的文件列表
–max-depth:指定du应该遍历的目录层次的最大深度

# du -ak /root | sort -nrk 1 | head -n 10 #找到指定目录/root中最大的10个文件

2. time command

# time ls -d /root
/root

real 0m0.003s
user 0m0.000s
sys 0m0.000s

real时间指的是挂钟时间(wall clock time),也就是命令从开始执行到结束的时间。这段时间包括其他进程所占用的时间片(time slice)以及进程被阻塞时所花费的时间
user时间指的是进程花费在用户模式(user-mode)中的CPU时间。这是唯一真正用于执行进程所花费的世界。执行其他进程以及话费在阻塞状态中德时间并没有计算在内
sys时间是指进程花费在内核模式(in the kernel)中德CPU时间。它代表在内核中执行系统调用所使用的世界,这和库代码(library
code)不同,后者仍旧运行在用户空间(user space)。与“user世界”类似,这也是真正由进程使用的CPU时间

time命令的可执行二进制文件位于/usr/bin/time,还有一个Shell内建命令也叫做time,当运行time时,默认调用的
Shell的内建命令,Shell内建的time命令选项有限。因此,如果我们需要使用另外的功能,就应该使用可执行文件time的绝对路径(/usr
/bin/time)。

time其他参数
-o:将命令执行时间写入文件
-a:追加到文件(append)
-f:利用格式化字符串格式化时间输出
real: %e
user: %U
sys: %S

# /usr/bin/time -f “Time: %U” -a -o timing.log uname

3. 打印出10条最常使用的命令
cat /root/.bash_history | awk ‘{ list[$1]++ } END { for(i in list) {printf(“%s\t%d\n”,i,list[i]);}}’ | sort -nrk 2 | head
将历史命令通过管道将源输入传递给awk。在awk中,使用一个关联数组。这个数组将命令名作为索引,将命令出现的次数作为数组元素值。命令每出现一次,
计数值增加1(list[$1]++)。$1是输入文本行的第一个单词。如果是用$0,则包含输入文本行中的所有单词。sort -nrk
2对第2列(count)按照数值逆向排序

4. 列出1小时内占用CPU最多的10个进程

#!/bin/bash
 #Name: pcpu_usage.sh
 #Description: Script to calculate cpu usage by processes for 1 hour
 
SECS=3600
 #Change the SECS to custom seconds
 
STEPS=$(( $SECS / 60 ))
 
echo Watching CPU usage... ;
 
logfile=/tmp/cpu_usage.$
 
for((i=0;i<STEPS;i++)) do ps -eo comm,pcpu,pid | sort -k2nr |head -30 >> $logfile
 # sleep 60
 done
 
echo
 echo CPU eaters :
 
awk '{ process[$1 FS $3]+=$2; }
 END{ for(i in process) print i, process[i] }' $logfile | sort -k2nr | head | cut -d" " -f1

5. watch动态监控命令输出
-n:后面更时间(秒),每多少秒更新一次输出
-d:将时间间隔前后的命令输出差异以不同颜色突出标示出来

6. inotify
inotifywait -m -r -e create,move,delete
-m:表明要持续监视变化,而不是在事件发生之后退出
-r:允许采用递归形式监视目录
-q:用于减少冗余信息,只打印出所需要的信息
-e:指定需要监视的事件列表
事件 描述
access 读取文件
modify 文件内容被修改
attrib 文件元数据被修改
move 对文件进行移动操作
create 生成新文件
open 对文件进行打开操作
close 对文件进行关闭操作
delete 文件被删除

7. logrotate
missingok 如果日志文件丢失,则忽略;然后返回(不对日志系统进行轮替)
notifempty 仅当源日志文件非空时才对其进行轮替
size 30k 限制实施轮替的日志文件大小。可以用1M表示1MB
compress 允许用gzip对较旧的日志进行压缩
weekly 指定进行轮替的世界间隔。可以是weekly,yearly或daily
rotate 5 这是需要保留的旧日志文件的归档数量,以1.gz、2.gz…5.gz结尾
create 066 root root 指定所要创建的归档文件的模式、用户以及用户组

更多参数服务logrotate的手册:http://linux.die.net/man/8/logrotate

8. 通过监视用户登录找出入侵者

#!/bin/bash
#Filename: intruder_detect.sh
#Description: Intruder reporting tool with secure input
AUTHLOG=/var/log/secure
if [[ -n $1 ]];
then
  AUTHLOG=$1
  echo Using Log file : $AUTHLOG
fi
 
LOG=/tmp/valid.$$.log
grep  -v "invalid" $AUTHLOG > $LOG
users=$(grep "Failed password" $LOG | awk '{ print $(NF-5) }' | sort | uniq)
printf "%-5s|%-10s|%-10s|%-13s|%-33s|%s\n" "Sr#" "User" "Attempts" "IP address" "Host_Mapping" "Time range"
 
ucount=0;
ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $LOG | sort | uniq)"
for ip in $ip_list;
do
  grep $ip $LOG > /tmp/temp.$$.log
 
for user in $users;
do
  grep $user /tmp/temp.$$.log> /tmp/$$.log
  cut -c-16 /tmp/$$.log > $$.time
  tstart=$(head -1 $$.time);
  start=$(date -d "$tstart" "+%s");
  tend=$(tail -1 $$.time);
  end=$(date -d "$tend" "+%s")
  limit=$(( $end - $start ))
 
  if [ $limit -gt 120 ];
  then
    let ucount++;
    IP=$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /tmp/$$.log | head -1 );
    TIME_RANGE="$tstart-->$tend"
    ATTEMPTS=$(cat /tmp/$$.log|wc -l);
    HOST=$(host $IP | awk '{ print $NF }' )
    printf "%-5s|%-10s|%-10s|%-10s|%-33s|%-s\n" "$ucount" "$user" "$ATTEMPTS" "$IP" "$HOST" "$TIME_RANGE";
  fi
done
done

Mon Jan 21 11:56:27 CST 2013

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: