Shell程式設計面試題
shell習題
求100以內之和的shell指令碼
#!/bin/bash
#Author Wangweigang
#Create Time 2018-11-06
#Name sum 1-100
sum=0
for i in `seq 1 100`
do
sum=$[$i+$sum]
done
echo $su
計算使用的記憶體使用量
#/bin/bash free=$(free |awk 'NR==2{print ($3)/$2*100"%"}') if [ ${free%.*} -ge 10 ];then echo "記憶體使用大於10,現在記憶體為$free" else echo "記憶體為 $free" fi
Shell練習題目
1.按照時間生成檔案2018-05-22.log
將每天的磁碟使用狀態寫入到對應的檔案
分析
1.時間列印 date +%F
2.磁碟狀態 df -h#!/bin/bash echo "`df -h`" >`date +%F`.log
2.統計Nginx日誌中每個IP的訪問量有多少,日誌如下:
192.168.56.1 - - [21/May/2018:20:44:06 -0400] "GET /index.html HTTP/1.0" 404 169 "-" "ApacheBench/2.3" "-"/code/index.html
分析
1.篩選所有的IP地址
c2.排序、去重、統計cat /var/log/nginx/access.log |awk '{print $1}'|sort -u|uniq -c
3.寫一個指令碼計算一下Linux系統所有程序佔用內容大小的和。
分析
1.如何獲取記憶體的大小 top、ps
2.如何統計大小之和ps aux |tail -n +2 |awk '{sum+=$6} END{print sum/1024"MB"}' ps aux |tail -n +2 |awk '{sum+=$5} END{print sum/1024"MB"}'
4.找到/backup目錄下所有後綴名為.txt的檔案
1.批量修改txt為txt.bak 2.把所有的.bak檔案打包壓縮為123.tar.gz 3.批量還原檔案的名字,及把增加的.bak再刪除 分析 1.使用find命令進行查詢 2.使用mv命令進行移動改名 3.使用tar命令進行打包
find /backup/ -type f -name ".txt" > /tmp/1.txt
for i in $(cat /tmp/1.txt)
do
mv $i ${i}.bak
done
#2.重新查詢,bak檔案,然後進行打包
cd /backup && tar czf 123.tar.gz $(find /backup/ -type f -name ".bak")
#3.將.bak還原.txt
find /backup/ -type f -name ".bak" >/tmp/2.txt
for i in $(cat /tmp/2.txt)
do
mv $i ${i%.}
done
5.寫一個指令碼,判斷本機80埠(假如服務為httpd)是否開啟,如果開啟什麼都不幹, 如果發現埠不存在,那麼重啟一下http服務,併發郵件通知自己,指令碼寫好後可以每分鐘執行一次,也可以寫一個死迴圈
>分析
1.檢測80埠是否正常 netstat -lntp|grep ":80"
2.如果不正常則重啟Nginx
3.如果程序是啟動的則重啟,否則直接啟動
status=$(netstatu -lntp )
[[email protected] scripts]# cat status_httpd.sh
#!/bin/bash
export PATH=$PATH
#寫一個指令碼,判斷本機80埠(假如服務為httpd)是否開啟,如果開啟什麼都不幹, 如果發現埠不存在,那麼重啟一下http服務,併發郵件通知自己,指令碼寫好後可以每分鐘執行一次,也可以寫一個死
Status_httpd=$(netstat -lntp |grep ":80" |wc -l)
Cq="`systemctl restart httpd`"
Zt="`netstat -lntp`"
if
[ $Status_httpd -gt 0 ];then
echo "Httpd正常執行"
else
echo "Httpd是未開啟的馬上重Qi,請檢視!"
echo $Cq #|mail -s "httpd start" [email protected]
echo $Zt
fi
6.現在有一個lnmp環境, 經常出現502錯誤, 只要一重啟php-fpm即可解決,如果不重啟則會持續非常長的一段時間,所有有必要寫一個監控指令碼,監控訪問日誌的狀態碼,一旦發生502,則自動重啟一下php-fpm
>分析
1.通過日誌尾部最後300行,統計502出現的次數
2.精準判斷是否是502錯誤,不是則不處理,是則重啟php-fpm
sort :預設是按ASCII碼進行排序的
常用選項:
-n :按數值大小排序
-r: 倒敘排列
-k: 指定欄位排序
-t: 指定分割符
-u: 去掉重複
例如:sort -nk3 -t: /etc/passwd
cat /proc/cpuinfo |grep ' physical id' |sort -u |wc -l
uniq: 去重,這裡的去重指的是相鄰行,才會去重
-d: 只顯示重複的行
-D: 把所有重複的行都顯示出來
-c:顯示每行重複的次
tail -300 /var/log/nginx/access.log | awk '{print $9}'|sort -n|uniq -c
7用shell
列印下面這句話中字母數小於6個的單詞Bash also interprets a number of multi-user optios
>分析
1.使用迴圈遍歷
2.怎麼統計單詞數值 wc -c
#!/bin/bash
for s in Bash also interprets a number of multi-character options
do
n=`echo $s |wc -c`
if [ $n -lt 6 ]
then
echo $s
fi
done
8.新增user_00->user_09
10個使用者, 並且給他們設定一個隨機密碼, 密碼要求10位包含大小寫字母以及數字, 注意需要把每個使用者的密碼記錄到一個日誌檔案中
>分析
1.怎麼實現00-09思路`echo user_{00..10} seq -w 0 10`
2.隨機密碼`mkpasswd( yum install expect)`
[[email protected] scripts]# cat Create_user.sh
#!/bin/bash
#Create Time 2018-11-07
export PATH=$PATH
for i in user_{00..10}
do
useradd $i
pass=`mkpasswd -l 10 -s 0`
echo $pass |passwd --stdin $i
echo $pass $i >> /tmp/pass.log
done
9.寫個shell看看你的linux
系統中是否有自定義使用者(普通使用者),若有一共有多少個?
>分析
1.檢視/etc/passwd檔案
2.只有UID大於1000的都是普通
cat /etc/passwd|awk -F ":" '{print "$3}'
[[email protected] scripts]# cat /etc/passwd |awk -F : '$3>1000&& $3!=65534 {print $0}'
user_01:x:1001:1001::/home/user_01:/bin/bash
user_02:x:1002:1002::/home/user_02:/bin/bash
user_03:x:1003:1003::/home/user_03:/bin/bash
user_04:x:1004:1004::/home/user_04:/bin/bash
user_05:x:1005:1005::/home/user_05:/bin/bash
user_06:x:1006:1006::/home/user_06:/bin/bash
user_07:x:1007:1007::/home/user_07:/bin/bash
user_08:x:1008:1008::/home/user_08:/bin/bash
user_09:x:1009:1009::/home/user_09:/bin/bash
user_10:x:1010:1010::/home/user_10:/bin/bash
10.寫一個shell
指令碼,檢測所有磁碟分割槽使用率和inode
使用率,並記錄到以當天時間命名的日誌檔案中,當發現某個分割槽容量或inode
使用量大於85%時,發郵件通知自己
>分析
1.列印當前磁碟inode和使用率至檔案中
2.取值判斷是否使用率超過85%
3.發郵件通知自己(/tmp/error.txt)
#!/bin/bash
log=/var/log/disk/`date +%F`.log
date +'%F %T' > $log
df -h >> $log
echo >> $log
df -i >> $log
for i in `df -h|grep -v 'Use%'|sed 's/%//'|awk '{print $5}'`; do
if [ $i -gt 85 ]; then
use=`df -h|grep -v 'Use%'|sed 's/%//'|awk '$5=='$i' {print $1,$5}'`
echo "$use" >> use
fi
done
if [ -e use ]; then
##這裡可以使用咱們之前介紹的mail.py發郵件
mail -s "Filesystem Use% check" [email protected] < use
rm -rf use
fi
for j in `df -i|grep -v 'IUse%'|sed 's/%//'|awk '{print $5}'`; do
if [ $j -gt 85 ]; then
iuse=`df -i|grep -v 'IUse%'|sed 's/%//'|awk '$5=='$j' {print $1,$5}'`
echo "$iuse" >> iuse
fi
done
if [ -e iuse ]; then
mail -s "Filesystem IUse% check" [email protected] < iuse
rm -rf iuse
fi
11.寫一個shell
指令碼來看看你使用最多的命令是那些,列出常用的命令top10
>分析
1.拿到想要的值,排序、去重、統計
[[email protected] scripts]# history |awk '{print $2}'|sort -u|tail -10
12.寫一個指令碼判斷你的Linux
伺服器裡是否開啟web
服務, 如果開啟了請判斷跑的是什麼服務,是httpd
還是nginx
又或是其他?
>分析
1.使用`netstat`檢視是否存在80
2.篩選80埠對應的是`nginx`還是`httpd`
#!/bin/bash
port=`netstat -lnp | grep 80`
if [ -z "port" ]; then
echo "not start service.";
exit;
fi
web_server=`echo $port | awk -F'/' '{print $2}'|awk -F : '{print $1}'`
case $web_server in
httpd )
echo "apache server."
;;
nginx )
echo "nginx server."
;;
* )
echo "other server."
;;
esac
13.當前mysql
服務的root
密碼為123456
寫指令碼檢測mysql
服務是否正常(比如,可以正常進入mysql
執行show processlist
),並檢查一下當前的MySQL服務是主還是從,如果是從,請判斷他的主從服務是否異常,如果是主,則不需要做什麼
>分析
1.使用非互動的方式登入mysql進行取值 mysql -h -u -p -e
2.檢查主從, 如果是主則返回空,如果是從則返回數值(show slave status\G)
3.檢查從的IO執行緒和SQL執行緒是否正常。
#!/bin/bash
Mysql_c="mysql -uroot -p123456"
$Mysql_c -e "show processlist" >/tmp/mysql_pro.log 2>/tmp/mysql_log.err
n=`wc -l /tmp/mysql_log.err|awk '{print $1}'`
if [ $n -gt 0 ]
then
echo "mysql service sth wrong."
else
$Mysql_c -e "show slave status\G" >/tmp/mysql_s.log
n1=`wc -l /tmp/mysql_s.log|awk '{print $1}'`
if [ $n1 -gt 0 ]
then
y1=`grep 'Slave_IO_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'`
y2=`grep 'Slave_SQL_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'`
if [ $y1 == "Yes" ] && [ $y2 == "Yes" ]
then
echo "slave status good."
else
echo "slave down."
fi
fi
fi
14.寫一個指令碼, 計算100以內能被3整除的正整數之和
>分析
1.先找出1-100能除以3等於0的數值
2.讓數值進行相加
[[email protected] scripts]# cat 14.sh
#/usr/bin/bash
#Authro Wangweigang
#Create Time 2018-11-06
#100以內能被3整除的數字之和。
sum=0
for i in {1..100};do
if [ $[$i%3] -eq 0 ];then
sum=$[$i+$sum]
fi
done
echo "sum is =$sum"
15.提示使用者輸入網絡卡名字,然後我們用指令碼輸出網絡卡的IP
>分析
1.需要讀入使用者輸入的網絡卡名稱
2.判斷輸入的網絡卡名稱是否正確
3.判斷網絡卡是否有IP地址,有則輸出,沒有則提示
#!/bin/bash
#Authro Wangweigang
#Create Time 2018-11-08
cat <<END
web1 10.0.0.7
web2 10.0.0.8
web3 10.0.0.9
nfs 10.0.0.31
backup 10.0.0.41
mo1 10.0.0.61
END
while true
web1=$(ifconfig eth0 |awk 'NR==2{print $2}')
read -p "Please Input Network " hostname
do
if
[ $hostname -eq 1 ];then
echo "10.0.0.7"
elif
[ $hostname -eq web2 ];then
echo "10.0.0.8"
elif
[ $hostname -eq web3 ];then
echo "10.0.0.9"
elif
[ $hostname -eq m01 ];then
echo "10.0.0.61"
elif
[ $hostname -eq nfs ];then
echo "10.0.0.31"
elif
[ $hostname -eq backup ];then
echo "10.0.0.41"
else
echo "您輸入的使用者名稱不存在"
exit
fi
done
16.寫一個猜數字指令碼,當用戶輸入的數字和預設數字(隨機生成一個0-100的數字)一樣時,直接退出,否則讓使用者一直輸入,並且提示使用者的數字比預設數字大或者小
猜蘋果是多少錢一斤
>分析
1.隨機數字如何生成
2.死迴圈,直到猜對才退出
3.判斷大小
#!/bin/bash
num=$(echo $(($RANDOM%100+1)))
while true
do
read -p "Please Input number:" number
if [ $number -gt $num ];then
echo "你輸入的數字太大了!!"
elif [ $number -lt $num ];then
echo "你輸入的數字太小了!!"
else
echo "恭喜你猜中了^^^"
exit 666
fi
done
17.寫一個指令碼判斷輸入的使用者是否登入,如果未登陸提示沒有登陸,如果登陸,顯示登陸的終端以及通過那個IP登陸過來的
>分析
1.使用w獲取當前所有登陸系統的使用者
2.判斷
#!/usr/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
read -p "請輸入使用者名稱稱:" A
Are=`awk -F: '$3<1||$3>999{print $1}' /etc/passwd|grep "^${A}$"|wc -l`
User=$(who|grep "$A"|wc -l)
case $Are in
0)
echo "$A 這個使用者不存在"
;;
1)
[ $User -eq 0 ] && echo "$A 未登入" || who|awk '/'$A'/{print $"\t"$2"\t"$NF}'
esac
18.寫一個shell
先判斷是否安裝http
和mysql
沒有安裝進行安裝,安裝了檢查是否啟動服務,若沒有啟動則需要啟動服務。
>分析
1.使用rpm命令判斷是否安裝對應的軟體
2.檢查是否啟動(ssytemctl|ps)
19.寫一個shell
指令碼,通過curl -l
返回的狀態碼來判斷所訪問的網站是否正常,比如:當狀態碼為200|301|302
時,才算正常
>分析
1.獲取狀態碼的關鍵值
2.根據狀態進行判斷即可
[[email protected] scripts]# cat status_num.sh
#!/bin/bash
export PATH=$PATH
Status_Num=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com)
if
[ $Status_Num -eq 200 ]||[ $Status_Num -eq 302 ]||[ $Status_Num -eq 301 ];then
echo "此網站的狀態碼為:$Status_Num"
else
echo "狀態有誤請檢視當前狀態碼:$Status_Num 的狀態碼的錯誤"
fi
20.已知Nginx
訪問的日誌檔案在/var/log/nginx/access.log
請統計下早上10點到早上12點來訪IP最多的是哪個?
grep -E '30/Oct/2018:1[0-2]:[0-5][0-9]:/var/log/nginx/access.log |awk '{print $1}' |sort -n |uniq -c |head -n1
=======================================================================================
1、中企動力面試題
https://blog.csdn.net/u010230971/article/details/80335522
用shell處理以下內容
1、按單詞出現頻率降序排序!
2、按字母出現頻率降序排序!
the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
str="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
#no1按單詞出現的頻率降序排序
word(){
echo $str|sed 's#[^a-zA-Z]#\n#g'|grep -v "^$"|sort|uniq -c|sort -rn -k1
}
#no2按字母出現的頻率降序排序
string(){
echo $str|grep -o "."|egrep -v "[^a-zA-Z]"|sort|uniq -c|sort -rn -k1
}
menu(){
cat <<END
1.按單詞出現的頻率降序排序
2.按字母出現的頻率降序排序
END
read -p "Pls you choose num:" num
}
menu
usage(){
echo "USAGE:You muset choose 1 or 2"
exit 1
}
case "$num" in
1)
word
;;
2)
string
;;
*)
usage
esac
2、企業面試題
已知下面的字串是通過RANDOM隨機數變數md5sum|cut-c 1-8擷取後的結果,請破解這些字串對應的md5sum前的RANDOM對應數字?
21029299
00205d1c
a3da1677
1f6d12dd
解答:利用random的範圍(0-32767)
for ((i=0;i<=32767;i++))
do
for j in `cat /server/scripts/ab.txt`
do
if [[ "$(echo $i|md5sum)" =~ "${j}" ]]
then
echo $i
fi
done
done
for ((i=0;i<=32767;i++))
do
for j in `cat /server/scripts/ab.txt`
do
#echo "$(echo $i|md5sum|cut -c 1-8) ${j}"
if [ "$(echo $i|md5sum|cut -c 1-8)" == "${j}" ]
then
echo $i
fi
done
done
利用陣列來做
#!/bin/sh
a=(21029299
00205d1c
a3da1677
1f6d12dd)
for n in {0..32767}
do
random=`echo $n|md5sum|cut -c1-8`
for((i=0;i<=${#a[@]};i++))
do
if [ "$random" == "${a[i]}" ];then
echo "$n" "${a[i]}"
fi
done
done
3、使用for迴圈在/oldboy目錄下通過隨機小寫10個字母加固定字串oldboy批量建立10個html檔案,名稱例如為:
tr -dc 的意思是,將字串中a到z 以外的字元提取並刪除,只保留小寫字母
#!/bin/bash
dir=/oldboy
[ ! -d $dir ] && mkdir -p $dir
for((i=1;i<=10;i++ ))
do
a=`tr -dc "a-z" < /dev/urandom | head -c 10`_oldboy,html
touch $dir/$a
done
for i in `seq 10`;do a=`echo $RANDOM|md5sum|tr "0-9" "j-z"|cut -c1-10`;touch ${a}_oldboy.html;done
4、請用至少兩種方法實現!
將以上檔名中的oldboy全部改成oldgirl(用for迴圈實現),並且html改成大寫。
rename _oldboy.html _oldgirl.HTML *
#!/bin/bash
cd /root/oldfile
for a in `ls`
do
b=`echo $a|sed 's/oldboy.html/oldgirl.HTML/g'`
mv $a $b
done
#!/bin/bash
cd /root/oldfile
for a in ls
do
b=echo $a|awk -F '_' '{print $1}'
mv $a $b_oldgirl.HTML
done
5、寫一個指令碼,實現判斷10.0.0.0/24網路裡,當前線上使用者的IP有哪些(方法有很多)
[[email protected] ~]# cat ping.sh
#!/bin/sh
for i in {1..254}
do
{
IP=10.0.0.$i
ping -c1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "$IP" >>ip.txt
fi
}&
done
wait
echo "全部已經完
#!/bin/bash
subnet=10.0.0.0/24
#方法一
netaddr=`echo $subnet|cut -d. -f1-3`
for i in {1..254};do
{
ping -c 1 -t 1 $netaddr.$i > /dev/null
if [ $? == 0 ];then
echo $netaddr.$i
fi
} &
done
wait
#方法二
nmap -sP $subnet
#!/bin/bash
for I in `seq 1 255`
do
ping -c 1 10.0.0.$I &>/dev/null
if [ $? -eq 0 ]
then
echo -e "10.0.0.$I is up."
else
echo -e "10.0.0.$I is down."
fi
done
6、請用至少兩種方法實現!迴圈、陣列方式
for迴圈列印下面這句話中字母數不大於6的單詞(崑崙萬維面試題)。
I am oldboy teacher welcome to oldboy training class.
for s in I am oldboy teacher welcome to oldboy training class.
do
n=`echo $s |wc -c`
if [ $n -lt 6 ]
then
echo $s
fi
done
#!/bin/bash
len=6
words='I am oldboy teacher welcome to oldboy training class.'
#方法二
for word in ${words[@]};do
l=$(echo $word|wc -c)
if [ $l -gt $len ];then echo $word;fi
done
#方法三
for word in ${words[@]};do
l=$(echo $word|awk '{print length($0)}')
if [ $l -gt $len ];then echo $word;fi
done
#方法四
echo "I am oldboy teacher welcome to oldboy training class."|xargs -n1|awk '{if(length<6)print}'
#方法五
echo "I am oldboy teacher welcome to oldboy training class."|awk '{for(i=1;i<=NF;i++)if(length($i)<6)print $i}'
7、開發shell指令碼分別實現以指令碼傳參以及read讀入的方式比較2個整數大小。以螢幕輸出的方式提醒使用者比較結果。當用指令碼傳參以及read讀入的方式需要對變數是否為數字、並且傳參個數做判斷。
#!/bin/bash
#read讀參
IFS=','
compare() {
n1=$1
n2=$2
if [ $n1 -ge $n2 ];then
[ $n1 -eq $n2 ] && echo "$n1 = $n2" || echo "$n1 > $n2"
else
echo "$n1 < $n2"
fi
}
isnum() {
num=$1
for n in ${num[@]};do
if [[ ! $n =~ ^[0-9]+$ ]];then
echo 'WARNING: 必須輸入整數!'
return 1
fi
done
}
while :;do
read -a num -p "請輸入2個整數(逗號分隔): "
if [ ${#num[@]} -ne 2 ];then
echo 'WARNING: 必須輸入2個整數!'
continue
fi
isnum $num && compare ${num[@]}
done
#!/bin/bash
# 指令碼傳參
compare() {
n1=$1
n2=$2
if [ $n1 -ge $n2 ];then
[ $n1 -eq $n2 ] && echo "$n1 = $n2" || echo "$n1 > $n2"
else
echo "$n1 < $n2"
fi
}
isnum() {
num=$1
for n in ${num[@]};do
if [[ ! $n =~ ^[0-9]+$ ]];then
echo 'WARNING: 必須輸入整數!'
exit 2
fi
done
}
if [ $# -ne 2 ];then
echo 'WARNING: 必須輸入2個整數!'
exit 1
fi
isnum "$*" && compare [email protected]
===========================================================
解法2老師講
#!/bin/bash
read -p "please input two Number: " -a Arr_str
echo ${Arr_str[*]} | grep -E "^[0-9 ]{1,}$" &>/dev/null || exit
if [ ${#Arr_str[*]} -eq 2 ];then
if [ ${Arr_str[0]} -eq ${Arr_str[1]} ];then
echo "${Arr_str[0]} == ${Arr_str[1]}"
elif [ ${Arr_str[0]} -gt ${Arr_str[1]} ];then
echo "${Arr_str[0]} > ${Arr_str[1]}"
else
echo "${Arr_str[0]} < ${Arr_str[1]}"
fi
else
echo "please input two Number"
fi
8、面試及實戰考試題:監控web站點目錄(/var/html/www)下所有檔案是否被惡意篡改(檔案內容被改了),如果有就列印改動的檔名(發郵件),定時任務每3分鐘執行一次。
首先,思想過程更重要。
什麼是惡意篡改,只要未經過許可改動的都是篡改。
檔案被改了,會有特徵。
a. 大小可能會變化。
b. 修改時間會變化,(檔案測試符ot,nt)
c. 檔案內容會變化,md5sum指紋
d. 增加或刪除檔案
find /var/www/html -type f |xargs md5sum >/tmp/md5list
[[email protected] ~]# mkdir -p /var/www/html
[[email protected] ~]# touch /var/www/html/{a..k}
[[email protected] ~]# ls /var/www/html
a b c d e f g h i j k
[[email protected] ~]# find /var/www/html -type f |xargs md5sum >/tmp/md5list
[[email protected] ~]# cat /tmp/md5list
d41d8cd98f00b204e9800998ecf8427e /var/www/html/h
d41d8cd98f00b204e9800998ecf8427e /var/www/html/d
d41d8cd98f00b204e9800998ecf8427e /var/www/html/f
d41d8cd98f00b204e9800998ecf8427e /var/www/html/b
d41d8cd98f00b204e9800998ecf8427e /var/www/html/k
d41d8cd98f00b204e9800998ecf8427e /var/www/html/c
d41d8cd98f00b204e9800998ecf8427e /var/www/html/i
d41d8cd98f00b204e9800998ecf8427e /var/www/html/a
d41d8cd98f00b204e9800998ecf8427e /var/www/html/e
d41d8cd98f00b204e9800998ecf8427e /var/www/html/j
d41d8cd98f00b204e9800998ecf8427e /var/www/html/g
#用md5sum測試檔案是否有問題
[[email protected] ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: OK
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK
#修改檔案後檢測
[[email protected] ~]# echo 1111 > /var/www/html/a
[[email protected] ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: FAILED
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK
md5sum: WARNING: 1 of 11 computed checksums did NOT match
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
故在此基礎上我們可以寫個指令碼來監控目錄中是否有檔案被篡改,我把發郵件的給註釋掉了
[[email protected] scripts]# cat monitor.sh
#!/bin/bash
Path=/var/www/html
md5file=/tmp/md5list
md5check_safety=/tmp/md5check_safety
md5check_failed=/tmp/md5check_failed
check_result=`md5sum -c $md5file |grep FAILED|wc -l`
if [ $check_result -eq 0 ]; then
echo "$(date +%F) $Path is security." >>$md5check_safety
#mail -s "md5check result" "[email protected]" <$md5check_safety
else
echo "$(date +%F) $Path was changed." >>$md5check_failed
#mail -s "md5check result" "[email protected]" <$md5check_failed
fi
#在上邊實驗的基礎上我們來測試
[[email protected] scripts]# cat /tmp/md5check_failed
2018-08-24 /var/www/html was changed.
9、老男孩教育天津專案學生實踐抓鬮題目:
好訊息,老男孩培訓學生外出企業專案實踐機會(第6次)來了(本月中旬),但是,名額有限,隊員限3人(班長帶隊)。
因此需要挑選學生,因此需要一個抓鬮的程式:
要求:
1、執行指令碼後,想去的同學輸入英文名字全拼,產生隨機數01-99之間的數字,數字越大就去參加專案實踐,前面已經抓到的數字,下次不能在出現相同數字。
2、第一個輸入名字後,螢幕輸出資訊,並將名字和數字記錄到檔案裡,程式不能退出繼續等待別的學生輸入,抓完輸入exit退出。
#!/bin/bash
output=/tmp/result
rand_num() {
min=$1
max=$2
echo $(($RANDOM%$max+$min))
}
touch $output
while :;do
read -p '輸出名字全拼: ' name
while :;do
r=$(rand_num 1 99)
count=$(grep -w -c $r $output)
if [ $count -eq 0 ];then
echo $name:$r|tee -a $output
break/exit
fi
done
done
解法2老師講
#!/bin/sh
touch /tmp/b.log
while true
do
while true
do
ran=`echo $((RANDOM%100))`
if [ `grep -w $ran /tmp/b.log|wc -l` -eq 1 ];then
ran=`echo $((RANDOM%100))`
else
break
fi
done
read -p "請輸入你姓名的拼音: " name
if [ "$name" == "exit" ];then
echo "抓鬮結束,結果如下"
break
else
echo "$name" "$ran"
echo -e "$name\t$ran" >>/tmp/b.log
fi
done
sort -rn -k2 /tmp/b.log|head -n3
10、計算從1加到100之和
#!/bin/sh
j=0
for((i=0; i<=100; i++))
do
((j=j+i))
done
echo $j
#!/bin/bash
sum=0
i=1
for i in `seq 100`
do
let sum=sum+i
done
echo $sum