#!/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