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

    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

    • 本文由 发表于 2013-01-21
    • 转载请务必保留本文链接:https://linuxeye.com/279.html
    Linux下内置命令和外部命令详解 Linux

    Linux下内置命令和外部命令详解

    Linux的命令分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。 外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。 type可以用来判断一个命令是否为内...
    CentOS 6、7下IPSEC/L2TP VPN一键安装脚本(openswan+xl2tpd) 脚本

    CentOS 6、7下IPSEC/L2TP VPN一键安装脚本(openswan+xl2tpd)

    概念性的东西这里不再赘述,网上有太多,一键安装脚本也有很多,但是很多不能用,能用的也仅仅只是在CentOS6下使用,CentOS7基本没看到这些安装脚本。于是花了一些时间来折腾测试,写这个脚本方便以后...
    shell字符串处理 脚本

    shell字符串处理

    字符串操作(长度,读取,替换) 表达式 含义 ${#string} $string的长度 ${string:position} 在$string中, 从位置$position开始提取子串 ${stri...
    匿名

    发表评论

    匿名网友