zoukankan      html  css  js  c++  java
  • LinuxShell脚本攻略--第八章 当个好管家

    监视磁盘的使用情况

    $ du file1.txt file2.txt
    $ du -a file_or_dir                        #-a递归输出指定目录的所有文件统计
    $ du file_or_dir                           #这只是显示子目录使用的情况不显示每个文件占用空间情况
    $ du -h filename                #-h 显示的更方便人阅读
    $ du -c file1 file2               #-c 最后有一个统计
    $ du -s FILES(s)                #-s 只输出合计数据
    $ du -b FILE(s)               #以特定的单位输出文件大小 -b(字节) -k(KB) -m(MB) -B BLOCK_SIZE(以指定块大小)
    $ du --exclude "*.txt" FILES(s)       #--exclude排除指定文件
    $ du --exclude-from EXCLUDE.txt DIRECTORY 
    $ du --max-depth 2 DIRECTORY

    找出指定目录中最大的10个文件

    $ du -ak SOURCE_DIR | sort -nrk 1 | head
    $ du -ak /home/slynux | sort -nrk 1 | head -n 4

    -ak全部文件已kb为单位,sort 对第一列按数值逆序排序。head -n 输出头4行

    计算命令执行时间

    $ time ls                              #计算命令执行时间
    b.txt expect.sh
    real 0m0.007s 
    user 0m0.000s 
    sys 0m0.004s
    $ /usr/bin/time -a -o output.txt COMMAND    #-o filename 将相关的时间统计信息输出到指定文件

    我们也可以使用选项 -f ,利用格式字符串来格式化时间输出。格式字符串由对应于特定选项的参数组成,这些参数以 % 作为前缀。 real 时间、 user 时间、 sys 时间的格式字符串分别如下:

      real: %e
      user: %U
      sys: %S

    格式化输出生成后被写入标准输出,命令的执行时间信息被写入标准错误。我们可以用重定向操作符( > )对格式化输出重定向,用错误重定向操作符( 2> )对时间信息重定向。

    $ /usr/bin/time -f "Time: %U" uname> command_output.txt 2>time.log
    $ cat time.log 
    Time: 0.00 
    $ cat command_output.txt 
    Linux

    收集与当前登录用户、启动日志及启动故障的相关信息

    $ who
    fzk      :0           2016-12-08 08:54 (:0)
    fzk      pts/0        2016-12-08 08:56 (:0)
    $ w
     11:33:35 up  2:40,  2 users,  load average: 0.05, 0.04, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    fzk      :0       :0               08:54   ?xdm?   3:39   0.11s init --user
    fzk      pts/0    :0               08:56    1.00s  0.44s  0.00s w

    w命令,第一行列出了当前时间,系统运行时间,当前登录的用户数量以及过去的1分钟、5分钟、15分钟内的系统平均负载。接下来的每一行显示了每一个登录用户的详细信息,其中包括登录名、TTY、远程主机、登录时间、空闲时间、自该用户登录后所使用的总CPU时间、当前运行进程所使用的CPU时间以及进程所对应的命令行。

    $ users       #当前登陆主机的用户列表
    fzk fzk    

    如果某个用户打开了多个伪终端,那么该用户会被多次显示。

    $ users | tr ' ' '
    ' | sort | uniq
    fzk

    tr 将空格替换成换行,sort排序,uniq 去重

    查看系统已经运行了多长时间

    $ uptime
     11:39:06 up  2:46,  2 users,  load average: 0.04, 0.08, 0.06

    获取上一次启动以及用户登陆会话信息

    $ last
    fzk pts/14 :0 Thu Dec 8 11:37 - 11:37 (00:00) 
    fzk pts/0 :0 Thu Dec 8 08:56 still logged in 
    fzk :0 :0 Thu Dec 8 08:54 still logged in 
    reboot system boot 4.2.0-27-generic Thu Dec 8 08:53 - 11:40 (02:47)
    $ last USER          #获取单个用户登录会话的信息
    $ last USER          #获取重启会话(reboot session)信息
    # lastb             #获取失败的用户登录会话信息

    查看一小时内CPU占用CPU最多的10个进程脚本

    #!/bin/bash
    #文件名: pcpu_usage.sh
    #用途:计算1个小时内进程的CPU占用情况
    SECS=3600    #将SECS更改成需要进行监视的总秒数
    UNIT_TIME=60   #UNIT_TIME是取样的时间间隔,单位是秒
    
    STEPS=$(( $SECS / $UNIT_TIME ))
    echo Watching CPU usage... ;
    for((i=0;i<STEPS;i++))
    do
        ps -eocomm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
        sleep $UNIT_TIME
    done
    
    echo
    echo CPU eaters :
    
    cat /tmp/cpu_usage.$$ | 
    awk '
    { process[$1]+=$2; }
    END{
        for(i in process)
        {
            printf("%-20s %s
    ",i, process[i]) ;
        }
    }' | sort -nrk 2 | head
    rm /tmp/cpu_usage.$$  #删除临时日志文件

    watch 监视终端命令输出

    $ watch ls
    $ watch -n 5 'ls -l'         #以5秒为间隔,监视ls -l的输出
    $ watch -d 'COMMANDS'        #-d 将时间间隔前后的命令输出的差异之处以不同颜色突出标示出来。

    监视目录访问的脚本

    #/bin/bash
    #文件名: watchdir.sh8.8 用 logrotate 管理日志文件
    path=$1    #将目录或文件路径作为脚本参数
    
    inotifywait -m -r -e create,move,delete $path -q    

    需要下载 “inotify-tools"包。选项 -m 表明要持续监视变化,而不是在事件发生之后退出。 -r 允许采用递归形式监视目录(忽略符号链接)。 -e 指定需要监视的事件列表。 -q 用于减少冗余信息,只打印出所需要的信息。命令输出可以被重定向到日志文件。事件列表如下:

    访问( access )       读取文件
    修改( modify )       文件内容被修改
    属性( attrib )        文件元数据被修改
    移动( move )        移动文件操作
    创建( create )       生成新文件
    打开( open )        打开文件操作
    关闭( close )          关闭文件操作
    删除( delete )         文件被删除

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

    #!/bin/bash
    #文件名:intruder_detect.sh
    #用途:入侵报告工具,以auth.log作为日志文件
    AUTHLOG=/var/log/auth.log
    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
    " "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
    " "$ucount" "$user" "$ATTEMPTS" "$IP" "$HOST" "$TIME_RANGE";
            fi
        done
    done
    rm/tmp/valid.$$.log/tmp/$$.log $$.time/tmp/temp.$$.log 2>/dev/null
  • 相关阅读:
    CodeDeploy 应用程序规范文件
    Lambda 函数的最佳实践
    路由策略
    AWS CodeStar
    使用 Lambda@Edge 在边缘站点自定义内容
    Step Functions
    将应用程序部署到 AWS Elastic Beanstalk 环境
    DynamoDB 静态加密
    web数据安全——防篡改
    【Spring】spring全局异常处理即全局model数据写入
  • 原文地址:https://www.cnblogs.com/badboyf/p/6144564.html
Copyright © 2011-2022 走看看