• 实用脚本工具


    归档

    归档数据文件,在看正式的脚本之前首先分析,归档脚本所需要的东西,从什么地方获取归档的信息。如何遍历归档列表。将归档信息保存在何处。归档信息不存在该如何
    [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
  • 相关阅读:
    JAVA与编译语言及解释语言的关系
    Java虚拟机工作原理详解
    VMWare 网络连接模式(bridged、NAT、host-only)详解
    Ubuntu修改语言环境为英文
    Ubuntu安装和设置SSH服务
    Eclipse NDK 配置
    2018年长沙理工大学第十三届程序设计竞赛
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
    算法训练 安慰奶牛
    算法训练 最短路
  • 原文地址:https://www.cnblogs.com/zy09/p/10751953.html
Copyright © 2020-2023  润新知