注:以下腳本練習實驗都是以root用戶身份執行的,若普通用戶運行需要另加相應的權限
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
[root@fengl bin]# vim systeminfo.sh [root@fengl bin]# chmod u+x systeminfo.sh [root@fengl bin]# cat systeminfo.sh #!/bin/bash #Author:liang #Version:1.0 #Description:顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小 HostName=`hostname` IpAddr=`ifconfig | grep netask && ifconfig | grep Mask || ifconfig | grep Mask | tr -s ' '|cut -d' ' -f3|cut -d':' -f2 | grep -v '127.0.0.1' | tr '\n' ' ' && ifconfig | grep netmask | tr -s ' '|cut -d' ' -f3 | grep -v '127.0.0.1'|tr '\n' ' '` Version=`cat /etc/centos-release` Kernel=`uname -r` CPU=` lscpu | grep "Model name"|tr -s ' '|cut -d: -f2` Mem=`free -h|grep 'Mem'|tr -s ' '|cut -d: -f2|cut -d' ' -f2` Disk=`fdisk -l|sed -n '2p'|cut -d: -f2` echo -e "\033[31;1mHostName\033[0m:\033[32;1m$HostName\033[0m" echo -e "\033[31;1mIPv4Addr\033[0m:\033[32;1m$IpAddr\033[0m" echo -e "\033[31;1mOS Version\033[0m:\033[32;1m$Version\033[0m" echo -e "\033[31;1mKernel\033[0m:\033[32;1m$Kernel\033[0m" echo -e "\033[31;1mCPU model name\033[0m:\033[32;1m$CPU\033[0m" echo -e "\033[31;1mMemory\033[0m:\033[32;1m$Mem\033[0m" echo -e "\033[31;1mDisk\033[0m:\033[32;1m$Disk\033[0m"
2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
[root@fengl bin]# vim backup.sh [root@fengl bin]# chmod u+x backup.sh [root@fengl bin]# cat backup.sh #!/bin/bash #Author:liang #Version:1.0 #Description:每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 BackDir="/root/etc`date +%F`" SourceDir="/etc" echo "正在備份/etc目錄下的文件,請等待..." cp -a "${SourceDir}"/. "${BackDir}" SFile="/root/.sfile`date +%F`" BackFile="/root/.backfile`date +%F`" echo "正在檢測備份文件,請等待..." [[ -d "${BackDir}" ]] && ls -aR ${BackDir} > ${BackFile} && sed -i 's@'${BackDir}'@/etc@g' "${BackFile}" && ls -aR ${SourceDir} > ${SFile} && [[ "`cat ${BackFile}`" == "`cat ${SFile}`" ]] && echo "備份成功" || echo -e "\033[31;1m備份失敗,請重新備份\033[0m" && rm -f {${SFile},${BackFile}}
注:腳本中驗證備份文件功能只是為了練習,實際上沒有多大意義
3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值及分區
[root@fengl bin]# vim disk.sh [root@fengl bin]# chmod u+x disk.sh [root@fengl bin]# cat disk.sh #!/bin/bash #Author:liang #Version:1.0 #Description:顯示當前硬盤分區中空間利用率最大的值及分區 MaxNum=`df|grep "^/dev/sd"|tr -s ' '|cut -d' ' -f5|tr -d '%'|sort -nr|head -1` Partition=`df|tr -s ' '|cut -d' ' -f1,5|grep "${MaxNum}"|cut -d' ' -f1|tr '\n' ' '` echo -e "\033[31;1m當前硬盤分區中空間利用率最大值為\033[0m:\033[32;1m${MaxNum}%\033[0m" echo -e "\033[31;1m當前硬盤分區中空間利用率最大的分區為\033[0m:\033[32;1m${Partition}\033[0m"
4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
[root@fengl bin]# vim links.sh [root@fengl bin]# chmod u+x links.sh [root@fengl bin]# cat links.sh #!/bin/bash #Author:liang #Version:1.0 #Description:顯示連接當前主機的每個遠程主機IPv4地址及連接數,并按連接數從大到小排序 echo -e "\t連接數\t遠程主機" netstat -nt|grep 'tcp'|tr -s ' '|cut -d' ' -f5|cut -d: -f1|uniq -c|tr -s ' '|sort -nr|tr ' ' '\t'
5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
[root@fengl bin]# vim sumid.sh [root@fengl bin]# chmod u+x sumid.sh [root@fengl bin]# cat sumid.sh #!/bin/bash #Author:liang #Version:1.0 #Description:計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和 Uid10th=` sed -n '10p' /etc/passwd|cut -d: -f3` Uid20th=` sed -n '20p' /etc/passwd|cut -d: -f3` SumUid=$[Uid10th+Uid20th] echo -e "/etc/passwd文件中的第10個用戶和第20個用戶的ID之和為:\033[32;1m$SumUid\033[0m"
6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
[root@fengl bin]# vim sumspace.sh [root@fengl bin]# chmod u+x sumspace.sh [root@fengl bin]# cat sumspace.sh #!/bin/bash #Author:liang #Version:1.0 #Description:傳遞兩個文件路徑作為參數給腳本,計算出兩個文件中所有空白行之和 #判斷是否輸入兩個參數,否則退出并提示 [[ "$#" -ge 2 ]] || echo -e "\033[31;1m請輸入兩個文件路徑作為參數\033[0m" [[ "$#" -ge 2 ]] || exit #判斷參數1是否為文件路徑,否則退出并提示 [[ -f "$1" ]] || echo -e "\033[31;1m第一個輸入的文件路徑${1}不存在,請重新輸入一個正確的文件路徑作為參數\033[0m" [[ -f "$1" ]] || exit #判斷參數2是否為文件路徑,否則退出并提示 [[ -f "$2" ]] || echo -e "\033[31;1m第二個輸入的文件路徑${2}不存在,請重新輸入一個正確的文件路徑作為參數\033[0m" [[ -f "$2" ]] || exit #分別定義兩個變量記錄文件1和文件2中空白行的個數 File1Num=`grep '^$' $1| wc -l` File2Num=`grep '^$' $2| wc -l` #計算文件1和文件2中空白行個數之和 let Sum=${File1Num}+${File2Num} #輸出文件1和文件2中空白行個數之和 echo -e "\033[33;1m$1和$2中所用空白行之和為\033[0m:\033[32;1m${Sum}\033[0m"
7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
[root@fengl bin]# vim sumfile.sh [root@fengl bin]# chmod u+x sumfile.sh [root@fengl bin]# cat sumfile.sh #!/bin/bash #Author:liang #Version:1.0 #Description:統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件 EtcNum=`ls -A /etc/|wc -l` VarNum=`ls -A /var/|wc -l` UsrNum=`ls -A /usr/|wc -l` Sum=$((EtcNum+VarNum+UsrNum)) echo -e "\033[31;1m/etc,/var,/usr目錄中的一級子目錄和文件共有\033[0m:\033[32;1m${Sum}\033[0m"
8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
[root@fengl bin]# vim argsnum.sh [root@fengl bin]# chmod u+x argsnum.sh [root@liang7 bin]# cat argsnum.sh #!/bin/bash #Author:liang #Version:1.0 #Description:統計第一個參數路徑文件的空白行數 #判斷是否輸入參數,否則提示并退出 [[ $# -lt 1 ]] && echo -e "\033[31;1m請至少輸入一個文件路徑作為參數\033[0m" && exit #判斷輸入的是否文件路徑,否則提示并退出 [[ -f $1 ]] || echo -e "\033[31;1m輸入的文件路徑不存在,請在argsnum.sh后面重新輸入一個正確的文件路徑作為參數\033[0m" [[ -f $1 ]] || exit #計算第一個參數文件中空白行數 FileSpaceLineNum=`grep '^$' $1|wc -l` #輸出第一個參數文件中空白行數 echo -e "\033[31;1m第一個參數文件中的空白行數為\033[0m:\033[32;1m${FileSpaceLineNum}\033[0m"
9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
[root@fengl bin]# vim hostping.sh [root@fengl bin]# chmod u+x hostping.sh [root@fengl bin]# cat hostping.sh #!/bin/bash #Author:liang #Version:1.0 #Description:輸入一個IPv4地址作為參數,測試是否能夠ping通并提示 #判斷有無參數,若無參數則提示并退出 [[ -z $@ ]] && echo -e "\033[31;1m請輸入一個IPv4地址作為參數\033[0m" && exit #判斷是否只有一個參數,如果有多個參數則提示并退出 [[ $# -gt 1 ]] && echo -e "\033[31;1m只能輸入一個參數作為IPv4地址\033[0m" && exit #判斷參數是否為有效的IPv4地址,若不是則提示并退出 echo "$1"|grep -E '^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &> /dev/null || echo -e "\033[31;1m請輸入一個正確的IPv4地址\033[0m" echo "$1"|grep -E '^([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &> /dev/null || exit #ping該IPv4地址,并反饋結果 echo -e "\033[31;1m正在 ping "$1",請等待...\033[0m" ping -c2 -W2 "$1" &> /dev/null && echo -e "\033[32;1m主機"$1"可訪問\033[0m" || echo -e "\033[31;1m主機"$1"不可訪問\033[0m"
10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫(因考慮到普通用戶調用該腳本權限問題,故將腳本路徑放到了/tmp/目錄下,并且該腳本還可以判該文件的其他權限)
[root@fengl tmp]# vim per.sh [root@fengl tmp]# chmod 745 per.sh [root@fengl tmp]# cat per.sh #!/bin/bash #Author:liang #Version:1.0 #Description:判斷當前用戶對某文件的讀、寫、執行權限并提示 #定義要檢測文件的路徑變量并賦值 SourceFile=/tmp/file1 #定義要檢測文件的權限變量并賦值 [[ -r "${SourceFile}" ]] Read=`echo $?` [[ -w "${SourceFile}" ]] Write=`echo $?` [[ -x "${SourceFile}" ]] Execute=`echo $?` #檢測當前用戶對該文件的讀、寫、執行權限 [[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[32;1m當前用戶對${SourceFile}文件有讀、寫、執行權限\033[0m" #檢測當前用戶對該文件的讀、寫權限 [[ "${Read}" -eq 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件有讀、寫權限\033[0m" #檢測當前用戶對該文件的讀、執行權限 [[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件有讀、執行權限\033[0m" #檢測當前用戶對該文件的寫、執行權限 [[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件有寫、執行權限\033[0m" #檢測當前用戶對該文件的讀權限 [[ "${Read}" -eq 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[34;1m當前用戶對${SourceFile}文件只有讀權限\033[0m" #檢測當前用戶對該文件的寫權限 [[ "${Read}" -gt 0 ]] && [[ "${Write}" -eq 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件只有寫權限\033[0m" #檢測當前用戶對該文件的執行權限 [[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -eq 0 ]] && echo -e "\033[33;1m當前用戶對${SourceFile}文件只有執行權限\033[0m" #檢測當前用戶對該文件無任何權限 [[ "${Read}" -gt 0 ]] && [[ "${Write}" -gt 0 ]] && [[ "${Execute}" -gt 0 ]] && echo -e "\033[31;1;5m當前用戶對${SourceFile}文件無任何權限\033[0m"
下面圖1是root用戶更改file1權限的截圖,圖2是普通用戶針對file1文件不同權限的測試結果截圖
圖1:
圖2:
11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
[root@fengl bin]# vim nologin.sh [root@fengl bin]# chmod u+x nologin.sh [root@fengl bin]# cat nologin.sh #!/bin/bash #Author:liang #Version:1.0 #Description:禁止普通用戶登錄 #檢測/etc目錄下有無nologin文件,并定義回執變量 [[ -f /etc/nologin ]] EtcReturnNum=`echo $?` #檢測/run目錄下有無nologin文件,并定義回執變量 [[ -f /run/nologin ]] RunReturnNum=`echo $?` #禁止普通用戶登錄 [[ ${EtcReturnNum} -eq 0 ]] || [[ ${RunReturnNum} -eq 0 ]] && echo -e "\033[31;1m已禁止普通用戶登錄該系統\033[0m" && exit [[ $"EtcReturnNum" -gt 0 ]] && [[ $"RunReturnNum" -gt 0 ]] && touch /etc/nologin && echo -e "\033[31;1m已禁止普通用戶登錄該系統\033[0m"
[root@fengl bin]# vim login.sh [root@fengl bin]# chmod u+x login.sh [root@fengl bin]# cat login.sh #!/bin/bash #Author:liang #Version:1.0 #Description:允許普通用戶登錄 #檢測/etc目錄下有無nologin文件,并定義回執變量 [[ -f /etc/nologin ]] EtcReturnNum=`echo $?` #檢測/run目錄下有無nologin文件,并定義回執變量 [[ -f /run/nologin ]] RunReturnNum=`echo $?` #允許普通用戶登錄 [[ $"EtcReturnNum" -eq 0 ]] && rm -f /etc/nologin [[ $"RunReturnNum" -eq 0 ]] && rm -f /run/nologin echo -e "\033[32;1m已允許普通用戶登錄該系統\033[0m"
12、計算1+2+3+…+100的值
[root@fengl bin]# vim sum.sh [root@fengl bin]# chmod u+x sum.sh [root@fengl bin]# cat sum.sh #!/bin/bash #Author:liang #Version:1.0 #Description:計算1~10的和 #指定數字范圍變量 Num=`echo {1..100}` #計算求和 #方法一: #let sum=`echo $Num | tr -t ' ' '+'` #方法二: #sum=$[`echo $Num | sed 's@[[:space:]]@+@g'`] #方法三: #sum=$((`seq 1 100 | tr -t '\n' '+'|sed 's@+$@@'`)) #方法四: #sum=$(expr `seq 1 100|tr -t '\n' '+'|sed 's@+@ + @g'|sed 's@ + $@@'`) #方法五: sum=`echo $Num|tr -t ' ' '+'|bc` echo -e "\033[32;1m1~100的和為\033[0m:\033[33;1m${sum}\033[0m"
13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
[root@fengl bin]# vim parametersum.sh [root@fengl bin]# chmod u+x parametersum.sh [root@fengl bin]# cat parametersum.sh #!/bin/bash #Author:liang #Version:1.0 #Description:計算該腳本第一個參數中所有數字和第二個參數中的所有數字之和,并判斷第二個參數中所有數字之和是否大于第一個參數中所有數字之和,是則計算,否則提示錯誤并退出 #檢測是否有參數 [[ $# -ge 2 ]] || echo -e "\033[31;1m請至少輸入兩個帶有數字的參數\033[0m" [[ $# -ge 2 ]] || exit #檢測參數知否有效 echo $1|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m參數${1}無效,請重新輸入\033[0m" echo $1|grep '[0-9]\+' &> /dev/null || exit echo $2|grep '[0-9]\+' &> /dev/null || echo -e "\033[31;1m參數${2}無效,請重新輸入\033[0m" echo $2|grep '[0-9]\+' &> /dev/null || exit #分別取出第一個參數和第二個參數中的所有數字,并分別計算每個參數中的數字之和 NumA=`echo $1 | grep -o '[0-9]\+'|tr -d '\n'` NumB=`echo $2 | grep -o '[0-9]\+'|tr -d '\n'` SumA=$[`echo ${NumA} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`] SumB=$[`echo ${NumB} | sed 's@[0-9]@&+@g' | sed 's@+$@@'`] #檢測第二個參數中的數字之和是否大于第一個參數中的數字之和 [[ ${SumB} -gt ${SumA} ]] || echo -e "\033[31;1m第二個參數中數字之和小于或等于第一個參數中的數字之和,請重新輸入\033[0m" [[ ${SumB} -gt ${SumA} ]] || exit #計算兩個參數中的所有數字之和 SumAB=$[SumA+SumB] echo -e "\033[33;1m兩個參數中所有數字之和為\033[0m:\033[32;1m${SumAB}\033[0m"
原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/34178