归档数据文件,在看正式的脚本以前首先分析,归档脚本所须要的东西,从什么地方获取归档的信息。如何遍历归档列表。将归档信息保存在何处。归档信息不存在该如何
[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命令接收多个项做为输入,那么各个项之间要怎么区分呢?在这里,\n(换行符)被做为 各项的分隔符。当每一个PID发送给xargs时,它将PID做为单个项来处理。又由于xargs命令被赋 给了一个变量,因此\n中的反斜杠(\)必须再加上另外一个反斜杠(\)进行转义。 注意,在处理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 1、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不一样,它用来查看文件或目录所占用的磁盘空间的大小。 2、du经常使用的选项: -h:以人类可读的方式显示 -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小 -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小 -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和 --apparent-size:显示目录或文件自身的大小 -l :统计硬连接占用磁盘空间的大小 -L:统计符号连接所指向的文件占用的磁盘空间大小 1、du -h:这个就很少说了。 2、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/\n/ /' | gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}' # done #End of loop # exit