zoukankan      html  css  js  c++  java
  • 实用脚本工具

    归档

    归档数据文件,在看正式的脚本之前首先分析,归档脚本所需要的东西,从什么地方获取归档的信息。如何遍历归档列表。将归档信息保存在何处。归档信息不存在该如何
    [root@localhost gawk]# cat test5.sh         #在看正事归档脚本前先看下这个小脚本,通过exec 获取标准输入,data1 是一个当前在当前目录的文件,
    #!/bin/bash
    
    exec 0< data1
    read line                      #通过read 命令获取标准输入的第一行信息,并将这行信息赋值给变量 line 
    count=0
    while [ $? -eq 0 ];do              #通过 [ $? -eq 0 ] 比较运算判断上一行 read line 是否获取了信息
        echo "line: $line"
       count=$[ $count + 1 ]
      echo $count
      read line                   #执行完前面的操作后再重新读取文件下一行信息,并且read line 是循环中最后一行,否则会无限循环
    done [root@localhost gawk]#
    #整体的数据保存结构,自己可以灵活修改
    [root@localhost /]# tree archive/ archive/ ├── 04 │   └── 23 │   ├── archive2019-04-23-16:29:34.tar.gz │   ├── archive2019-04-23-16-32-04.tar.gz │   └── usr │   └── local │   └── src ├── archive190423.tar.gz ├── archive2019-04-23 ├── archive2019-04-23:16:15:47.tar.gz ├── archive2019-04-23-16:16:07.tar.gz ├── Archive.sh └── File_To_Backup 5 directories, 8 files [root@localhost /]#
    [root@localhost archive]# cat Archive.sh 
    #!/bin/bash
    #
    #
    #Archive - Archive designated files & directories
    ########################################################
    #
    #
    # Gather current data 收集当前日期
    #
    #DATE=$(date +%y%m%d)
    DATE=$(date +%Y-%m-%d-%H-%M-%S)
    #
    #
    #设置存档文件名称
    #
    FILE=archive$DATE.tar.gz
    #
    #设置配置文件和存档文件
    #
    CONFIG_FILE=/archive/File_To_Backup
    #DESTINATION=/archive/$FILE
    #################################################################################
    #每次执行脚本创建一个新的目录来存放归档文件
    BASEDEST=/archive
    #获取当前时间
    DAY=$(date +%d)
    MONTH=$(date +%m)
    TIME=$(date +%k%M)
    #
    #创建目录
    mkdir -p $BASEDEST/$MONTH/$DAY
    DESTINATION=$BASEDEST/$MONTH/$DAY/$FILE
    #
    ########## Main  Script ##################
    #
    #检查存档配置文件是否存在
    #
    if [ -f $CONFIG_FILE ];then
        echo
    else
        echo
        echo  "$CONFIG_FILE does not exist."
        echo  "Backup not completed due to missing configuration file"
        echo 
    exit        #如果不存在退出脚本执行
    fi
    #
    #
    # 构建要备份的文件名称
    #
    FILE_NO=1                       #备份文件计数,从1 开始
    exec < $CONFIG_FILE             #通过exec 方式读取要备份的文件目录
    #
    read FILE_NAME                  #读取第一行目录信息,并赋值给变量FILE_NAME
    #
    while [ $? -eq 0 ];do              #$? 获取上个命令执行结果,如果read 能够获取值为成功,否则失败
        if [ -f $FILE_NAME -o -d $FILE_NAME ];then #判断file_name 是否存在,-f 文件,-d 目录 ,-o 或
            #如果文件存在,将文件名称添加到文件列表
            FILE_LIST="$FILE_LIST $FILE_NAME"
        else
            echo
            echo
            echo "$FILE_NAME doesn't exist."
            echo
            echo
        fi
        FILE_NO=$[$FILE_NO + 1] #编号增加一行
        read FILE_NAME        #读取下一行数据    
    
    done
    #
    #####################################################################
    #
    #备份压缩文件
    #
    echo
    echo "Starting archive....."
    echo
    #
    tar -czf $DESTINATION $FILE_LIST 2> /dev/null
    #
    echo "Archive completed"
    echo "Resulting archive file is: $DESTINATION"
    echo
    #
    exit

    管理用户账户

    删除账户在管理账户工作中比较复杂。在删除账户时,至少需要4个步骤:
    (1) 获得正确的待删除用户账户名;
    (2) 杀死正在系统上运行的属于该账户的进程;
    (3) 确认系统中属于该账户的所有文件;
    (4) 删除该用户账户。
    #!/bin/bash 
    # 
    #Delete_User - Automates the 4 steps to remove an account 
    # 在这个脚本中输入就调用get_answer 函数,判断就调用process_answer 函数,很精巧
    ############################################################### 
    # Define Functions 
    # 
    ##################################################### 
    function get_answer { #调用get_answer 函数,用户输入和确认删除输入都调用这个函数,很重要
    # 
    unset ANSWER         #首先unset ANSWER 变量
    ASK_COUNT=0         #查询计数归0
    # 
    while [ -z "$ANSWER" ] #While no answer is given, keep asking. 第一次执行的时候。ANSWER 为空,ASK_COUNT 计数+1
    do 
     ASK_COUNT=$[ $ASK_COUNT + 1 ] 
    #第一次执行的时候。ANSWER 为空,ASK_COUNT 计数+1,因此在case 判断中不会执行,没有1 的匹配条件
    # 
     case $ASK_COUNT in #If user gives no answer in time allotted         #当用户一直不进行输入时每60s ASK_COUNT 就会加1,会提示两次,第四次退出脚本执行
     2) 
     echo 
     echo "Please answer the question." 
     echo 
     ;; 
     3) 
     echo 
     echo "One last try...please answer the question." 
     echo 
     ;; 
     4) 
     echo 
     echo "Since you refuse to answer the question..." 
     echo "exiting program." 
     echo 
     # 
     exit 
     ;; 
     esac 
    # 
     echo 
    # 
     if [ -n "$LINE2" ]             #输出提示符
     then #Print 2 lines 
     echo $LINE1 
     echo -e $LINE2" c" 
     else #Print 1 line 
     echo -e $LINE1" c" 
     fi 
    # 
    # Allow 60 seconds to answer before time-out 
     read -t 60 ANSWER         #读取命令行写入的字段
    done 
    # Do a little variable clean-up 
    unset LINE1     
    unset LINE2 
    # 
    } #End of get_answer function 
    # 
    ##################################################### 
    function process_answer {  #ANSWER 判断
    # 
    case $ANSWER in                 #判断从系统删除,如果是跳出判断,如果不是输出提示,unset 变量,
    y|Y|YES|yes|Yes|yEs|yeS|YEs|yES ) 
    # If user answers "yes", do nothing. 
    ;; 
    *) 
    # If user answers anything but "yes", exit script 
     echo 
     echo $EXIT_LINE1 
     echo $EXIT_LINE2 
     echo 
     exit 
    ;; 
    esac 
    # 
    # Do a little variable clean-up 
    # 
    unset EXIT_LINE1 
    unset EXIT_LINE2 
    # 
    } #End of process_answer function 
    # 
    ############################################## 
    # End of Function Definitions 
    # 
    ############# Main Script #################### 
    # Get name of User Account to check 
    # 确认要删除的用户名称
    echo "Step #1 - Determine User Account name to Delete " 
    echo " 确认要删除的用户名称"
    echo 
    LINE1="Please enter the username of the user "         #输出提示信息
    LINE2="account you wish to delete from system:"     #输出提示信息,在get_answer 函数中read 读取字符输入    
    get_answer #调用函数,随着镜头我们将视线转向get_answer 函数
    USER_ACCOUNT=$ANSWER     #获取用户输入的用户名
    # 
    # Double check with script user that this is the correct User Account 
    # 
    LINE1="Is $USER_ACCOUNT the user account "      #
    LINE2="you wish to delete from the system? [y/n]" 
    get_answer             #调用get_answer 函数,用户确认信息输入,只有不为空,就可以这里不判断输入内容
    # 
    # Call process_answer funtion: 
    # if user answers anything but "yes", exit script 
    # 
    EXIT_LINE1="Because the account, $USER_ACCOUNT, is not "  #定义两个提示语句
    EXIT_LINE2="the one you wish to delete, we are leaving the script..." 
    process_answer             #调用process 函数
    # 
    ################################################################ 
    ################################################################ 
    # Check that USER_ACCOUNT is really an account on the system 
    #检查user_account 是不是系统上的账户 
    #
    USER_ACCOUNT_RECORD=$(cat /etc/passwd | grep -w $USER_ACCOUNT) #过滤
    # 
    if [ $? -eq 1 ] # If the account is not found, exit script 判断上一个命令是不成功推出
    then                        
     echo 
     echo "Account, $USER_ACCOUNT, not found. " 
     echo "Leaving the script..." 
     echo 
     exit 
    fi 
    # 
    echo 
    echo "I found this record:" 
    echo $USER_ACCOUNT_RECORD 
    # 
    LINE1="Is this the correct User Account? [y/n]" 
    get_answer  #函数提示用户输入确认值
    # 
    # 
    # Call process_answer function: 
    # if user answers anything but "yes", exit script 
    # 
    EXIT_LINE1="Because the account, $USER_ACCOUNT, is not " 
    EXIT_LINE2="the one you wish to delete, we are leaving the script..." 
    process_answer     #process_answer 函数判断响应的值是yes 还是其他
    # 
    ################################################################## 
    # Search for any running processes that belong to the User Account 
    # 
    echo 
    echo "Step #2 - Find process on system belonging to user account" 
    echo 
    # 
    ps -u $USER_ACCOUNT >/dev/null #Are user processes running? 
    # 
    case $? in 
    1) # No processes running for this User Account 
     # 
     echo "There are no processes for this account currently running." 
     echo 
    ;; 
    0) # Processes running for this User Account. 如果当前系统有指定用户的进程
     # Ask Script User if wants us to kill the processes.   
     # 
     echo "$USER_ACCOUNT has the following processes running: " 
     echo 
     ps -u $USER_ACCOUNT 
     # 
     LINE1="Would you like me to kill the process(es)? [y/n]" 
     get_answer              #使用get_answer 函数获取值
     # 
     case $ANSWER in         #case 语句判断值
     y|Y|YES|yes|Yes|yEs|yeS|YEs|yES ) # If user answers "yes", 
     # kill User Account processes. 
     # 
     echo 
     echo "Killing off process(es)..." 
     # 
     # List user processes running code in variable, COMMAND_1 
     COMMAND_1="ps -u $USER_ACCOUNT --no-heading" 
     # 
     # Create command to kill proccess in variable, COMMAND_3 
     COMMAND_3="xargs -d \n /usr/bin/sudo /bin/kill -9" 
     # 
     ##############################################################
     :<<!
     xargs命令被保存在变量COMMAND_3中。选项-d指明使用什么样的分隔符。换句话说,既然
    xargs命令接收多个项作为输入,那么各个项之间要怎么区分呢?在这里,
    (换行符)被作为
    各项的分隔符。当每个PID发送给xargs时,它将PID作为单个项来处理。又因为xargs命令被赋
    给了一个变量,所以
    中的反斜杠()必须再加上另一个反斜杠()进行转义。
    注意,在处理PID时,xargs命令需要使用命令的完整路径名。sudo命令和kill命令
    (用于杀死用户账户的运行进程。另外还注意到kill命令使用了信号-9。
    这三条命令通过管道串联在了一起。ps命令生成了处于运行状态的用户进程列表,其中包括
    每个进程的PID。gawk命令将ps命令的标准输出(STDOUT)作为自己的STDIN,然后从中只提
    取出PID(参见第15章)。xargs命令将gawk命令生成的每个PID作为STDIN,创建并执行kill
    命令,杀死用户所有的运行进程。这个命令管道如下。
    !
     ###################################################################
     # Kill processes via piping commands together 
     $COMMAND_1 | gawk '{print $1}' | $COMMAND_3   #ps 用户进程,获取PID ,kill
     # 
     echo 
     echo "Process(es) killed." 
     ;; 
     *) # If user answers anything but "yes", do not kill. 
     echo 
     echo "Will not kill the process(es)" 
     echo 
     ;; 
     esac 
    ;; 
    esac 
    ################################################################# 
    # Create a report of all files owned by User Account 
    # 
    echo 
    echo "Step #3 - Find files on system belonging to user account" 
    echo 
    echo "Creating a report of all files owned by $USER_ACCOUNT." 
    echo 
    echo "It is recommended that you backup/archive these files," 
    echo "and then do one of two things:" 
    echo " 1) Delete the files" 
    echo " 2) Change the files' ownership to a current user account." 
    echo 
    echo "Please wait. This may take a while..." 
    # 
    REPORT_DATE=$(date +%y%m%d) 
    REPORT_FILE=$USER_ACCOUNT"_Files_"$REPORT_DATE".rpt" 
    # 
    find / -user $USER_ACCOUNT > $REPORT_FILE 2>/dev/null 
    # 
    echo 
    echo "Report is complete." 
    echo "Name of report: $REPORT_FILE" 
    echo "Location of report: $(pwd)" 
    echo 
    #################################### 
    # Remove User Account 删除用户
    echo 
    echo "Step #4 - Remove user account" 
    echo 
    # 
    LINE1="Remove $USER_ACCOUNT's account from system? [y/n]" 
    get_answer 
    # 
    # Call process_answer function: 
    # if user answers anything but "yes", exit script 
    # 
    EXIT_LINE1="Since you do not wish to remove the user account," 
    EXIT_LINE2="$USER_ACCOUNT at this time, exiting the script..." 
    process_answer #process_answer 函数判断回答是不是yes ,是就继续进行不是就退出脚本执行
    # 
    userdel $USER_ACCOUNT #delete user account 
    echo 
    echo "User account, $USER_ACCOUNT, has been removed" 
    echo 
    # 
    exit

    监测磁盘空间

    du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh
      一、du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory (of directory arguments). with no arguments,`du` reports the disk space for the current directory。
      很明显,与df不同,它用来查看文件或目录所占用的磁盘空间的大小。
      二、du常用的选项:
      -h:以人类可读的方式显示
      -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
      -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
      -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
      --apparent-size:显示目录或文件自身的大小
      -l :统计硬链接占用磁盘空间的大小
      -L:统计符号链接所指向的文件占用的磁盘空间大小
      一、du -h:这个就不多说了。
      二、du -a:使用此选项时,显示目录和目录下子目录和文件占用磁盘空间的大小。

     

    #!/bin/bash 
    # 
    # Big_Users - Find big disk space users in various directories 
    ############################################################### 
    # Parameters for Script 
    # 
    CHECK_DIRECTORIES=" /var/log /home" #Directories to check 
    # 
    ############## Main Script ################################# 
    # 
    DATE=$(date '+%m%d%y') #Date for report file 
    # 
    exec > disk_space_$DATE.rpt #Make report file STDOUT 
    # 
    echo "Top Ten Disk Space Usage" #Report header 
    echo "for $CHECK_DIRECTORIES Directories" 
    # 
    for DIR_CHECK in $CHECK_DIRECTORIES #Loop to du directories 
    do 
      echo "" 
      echo "The $DIR_CHECK Directory:" #Directory header 
    # 
    # Create a listing of top ten disk space users in this dir  
    du -S $DIR_CHECK 2>/dev/null | 
      sort -rn | 
      sed '{11,$D; =}' | 
      sed 'N; s/
    / /' | 
      gawk '{printf $1 ":" "	" $2 "	" $3 "
    "}' 
    # 
    done #End of loop 
    # 
    exit
  • 相关阅读:
    echarts雷达图点击事件 包含(2.x,3.85,4.02)测试
    字体图标制作
    通过php动态传数据到highcharts
    smartgit试用到期不用序列号怎么继续使用
    项目的ip地址更改,用git从远程提取代码出现错误,提示为 network error connection timed out
    OC学习4——OC新特性之块(Block)
    OC学习3——C语言特性之指针
    OC学习2——C语言特性之函数
    OC学习1——基本数据类型
    JVM 内存的那些事
  • 原文地址:https://www.cnblogs.com/zy09/p/10751953.html
Copyright © 2011-2022 走看看