#!/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練習題目php
2018-05-22.log
將天天的磁盤使用狀態寫入到對應的文件分析
1.時間打印 date +%F
2.磁盤狀態 df -hhtml#!/bin/bash echo "`df -h`" >`date +%F`.log2.統計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.排序、去重、統計nodecat /var/log/nginx/access.log |awk '{print $1}'|sort -u|uniq -c3.寫一個腳本計算一下Linux系統全部進程佔用內容大小的和。
分析
1.如何獲取內存的大小 top、ps
2.如何統計大小之和mysqlps 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")linux
#3.將.bak還原.txt
find /backup/ -type f -name ".bak" >/tmp/2.txt
for i in $(cat /tmp/2.txt)
do
mv $i ${i%.}
doneios
>分析 1.檢測80端口是否正常 netstat -lntp|grep ":80" 2.若是不正常則重啓Nginx 3.若是進程是啓動的則重啓,不然直接啓動 status=$(netstatu -lntp )
[root@m01 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" 1602031524@qq.com echo $Zt fi
>分析 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
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
user_00->user_09
10個用戶, 而且給他們設置一個隨機密碼, 密碼要求10位包含大小寫字母以及數字, 注意須要把每一個用戶的密碼記錄到一個日誌文件中>分析 1.怎麼實現00-09思路`echo user_{00..10} seq -w 0 10` 2.隨機密碼`mkpasswd( yum install expect)`
[root@m01 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
linux
系統中是否有自定義用戶(普通用戶),如有一共有多少個?>分析 1.查看/etc/passwd文件 2.只有UID大於1000的都是普通
cat /etc/passwd|awk -F ":" '{print "$3}' [root@m01 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
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" root@localhost < 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" root@localhost < iuse rm -rf iuse fi
shell
腳原本看看你使用最多的命令是那些,列出經常使用的命令top10>分析 1.拿到想要的值,排序、去重、統計
[root@m01 scripts]# history |awk '{print $2}'|sort -u|tail -10
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
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
>分析 1.先找出1-100能除以3等於0的數值 2.讓數值進行相加
[root@m01 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"
>分析 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
猜蘋果是多少錢一斤 >分析 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
>分析 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
shell
先判斷是否安裝http
和mysql
沒有安裝進行安裝,安裝了檢查是否啓動服務,若沒有啓動則須要啓動服務。>分析 1.使用rpm命令判斷是否安裝對應的軟件 2.檢查是否啓動(ssytemctl|ps)
shell
腳本,經過curl -l
返回的狀態碼來判斷所訪問的網站是否正常,好比:當狀態碼爲200|301|302
時,纔算正常>分析 1.獲取狀態碼的關鍵值 2.根據狀態進行判斷便可
[root@m01 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
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
=======================================================================================nginx
https://blog.csdn.net/u010230971/article/details/80335522
用shell處理如下內容 一、按單詞出現頻率降序排序! 二、按字母出現頻率降序排序! 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
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
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
將以上文件名中的oldboy所有改爲oldgirl(用for循環實現),而且html改爲大寫。web
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
donesql
[root@m01 ~]# 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
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}'
#!/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 $@
===========================================================
#!/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
首先,思想過程更重要。 什麼是惡意篡改,只要未通過許可改動的都是篡改。 文件被改了,會有特徵。 a. 大小可能會變化。 b. 修改時間會變化,(文件測試符ot,nt) c. 文件內容會變化,md5sum指紋 d. 增長或刪除文件 find /var/www/html -type f |xargs md5sum >/tmp/md5list [root@RSQ ~]# mkdir -p /var/www/html [root@RSQ ~]# touch /var/www/html/{a..k} [root@RSQ ~]# ls /var/www/html a b c d e f g h i j k [root@RSQ ~]# find /var/www/html -type f |xargs md5sum >/tmp/md5list [root@RSQ ~]# 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測試文件是否有問題 [root@RSQ ~]# 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 #修改文件後檢測 [root@RSQ ~]# echo 1111 > /var/www/html/a [root@RSQ ~]# 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 故在此基礎上咱們能夠寫個腳原本監控目錄中是否有文件被篡改,我把發郵件的給註釋掉了 [root@RSQ 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" "xxxxxx@xx.com" <$md5check_safety else echo "$(date +%F) $Path was changed." >>$md5check_failed #mail -s "md5check result" "xxxxxx@xx.com" <$md5check_failed fi #在上邊實驗的基礎上咱們來測試 [root@RSQ scripts]# cat /tmp/md5check_failed 2018-08-24 /var/www/html was changed.
好消息,老男孩培訓學生外出企業項目實踐機會(第6次)來了(本月中旬),可是,名額有限,隊員限3人(班長帶隊)。
所以須要挑選學生,所以須要一個抓鬮的程序: 要求: 一、執行腳本後,想去的同窗輸入英文名字全拼,產生隨機數01-99之間的數字,數字越大就去參加項目實踐,前面已經抓到的數字,下次不能在出現相同數字。 二、第一個輸入名字後,屏幕輸出信息,並將名字和數字記錄到文件裏,程序不能退出繼續等待別的學生輸入,抓完輸入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
#!/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
#!/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