xiaobater 2020-04-29
思路分析,产生随机数字方法:
①核心是创建10个随机小写字母。
方法1: echo $RANDOM 范围是0-32767 openssl rand -base64 100 方法2: date +%s%N 方法3: head /dev/urandom/cksum 方法4: uuidgen 方法5: cat /proc/sys/kernel/random/uuid 方法6: mkpasswd (yum install expect -y) -l:长度 -d:数字 -c:小写字母 -C:大写字母 -s:特殊字符
应用实例
[ shili]# cat 14-01.sh 
#!/bin/bash
path="oldboy"
[ -d /path ] || mkdir -p oldboy/
for n in {1..10}
do
  random=`echo "OLDBOY$RANDOM" | md5sum | tr ‘0-9‘ ‘m-z‘ | cut -c 2-11`
  touch $path/${random}_oldboy.html
done
[ shili]#方法1
[ shili]# cat 14-02.sh
#!/bin/bash
for file in `ls oldboy/*.html`
do
 mv $file ${file/oldboy.html/oldgirl.HTML}
 
done
[ shili]#方法2
[ oldboy]# ls | awk -F "oldgirl.HTML" ‘{print "mv",$0, $1 "oldboy.html"}‘ | bash方法3
[ oldboy]# rename "oldboy.html" "oldgirl.HTML" *.html
批量创建10个系统账号oldboy01-oldboy10并设置密码(密码为随机数,要求数字和字母混合)。
方法1
[ shili]# cat 14-03.sh 
#!/bin/bash
. /etc/init.d/functions
if [ $UID -ne 0 ]
then
   echo "please use root."
   exit 1
fi
for n in {41..50}
do
  pass=`openssl rand -base64 10`
  if [ `grep -w "oldboy$n" /etc/passwd|wc -l` -eq 0 ]
  then 
	  useradd oldboy$n &>/dev/null &&	  echo $pass | passwd --stdin oldboy$n &&	  echo -e "oldboy$n\t$pass" >>/tmp/user.txt &&       action "oldboy$n is successful." /bin/true
  else
          action "oldboy$n is exist." /bin/false
  fi
done
[ shili]#方法2
[ shili]# cat 14-03-01.sh #!/bin/bash for n in `seq -w 11 20` do pass=`openssl rand -base64 10` useradd oldboy$n echo "oldboy$n:$pass" >>/tmp/chpasswd.log done chpasswd </tmp/chpasswd.log [ shili]#
如何判断主机存活。
①ping
-c次数
-i 间隔
②nmap (yum)
nmap -sP 10.0.0.0/24
方法1
[ shili]# cat 14-04.sh 
#!/bin/bash
for n in {1..254}
do
  {
  if `ping -c 1 -w 3 10.0.0.$n &>/dev/null`
   then
      echo "10.0.0.$n is up."
   else
      echo "10.0.0.$n is down."
   fi
   } &#&表示并行
done方法2
[ shili]# nmap -sP 10.0.0.0/24 | awk ‘/Nmap scan report for/{print $NF}‘mysql -uroot  -poldboy123 -e "show databases" | grep -v _scheme|sed -1d
分库备份:
mysqldump -B oldboy | gzip > bak.sql.gz
[ scripts]# vim mysql.sh
#!/bin/bash
path=/back
[ -d $path ] || mkdir $path -p
for dbname in `mysql -uroot -poldboy123 -e "show databases;" 2>/dev/null | grep -v _schema | sed -1d`
do
  mysqldump -uroot -poldboy123 -B $dbname | gzip >$path/${dbname}.sql.gz
done如何实现mysql数据库进行分库加分表备份,请用脚本实现。
解答:
mysqldump oldboy test test1| gzip >bak.sql.gz
1,oldboy 库名
2,test\test1都是表名
方法:
mysqldump -B oldboy |gzip >bak.sql.gz mysqldump oldboy test1 mysqldump -B oldgril | gzip >bak.sql.gz mysqldump oldgril test1
案例
mysql -uroot -poldboy123 -e "show tables from wordpress;" 2>/dev/null | sed -1d
 
 [ scripts]# cat mysql.sh
#!/bin/bash
path=/back
[ -d $path ] || mkdir $path -p
for dbname in `mysql -uroot -poldboy123 -e "show databases;" 2>/dev/null | grep -v _schema | sed 1d`
do
  for tname in `mysql -uroot -poldboy123 -e "show tables from $dbname;" 2>/dev/null | grep 1d `
  do
    if [ "$dbname" = "mysql" ]
    then
       mysqldump -uroot -poldboy123  $dbname $tname | gzip >$path/${dbname}_${tname}.sql.gz
    else
       mysqldump $dbname $tname | gzip >$path/${dbname}_${tname}.sql.gz
    fi
  done
done 
[ scripts]#有3台机器,m01,backup,nfs01,采用ssh免秘钥实现从m01到其他两台机器无密码登录后,请写脚本实现从m01批量分发任意文件到其他两台机器的任意目录下。
免密环境生成:
[ scripts]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory ‘/root/.ssh‘. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 12:af:26:77:1e:2d:2b:ce:94:aa:f9:be:c5:a3:c8:90 The key‘s randomart image is: +--[ RSA 2048]----+ | | | | | . | | o | | . S | | . . + . | |E . X + . | | o o X.+ + | | =+*oo.o | +-----------------+ [ scripts]# ll ~/.ssh/ total 8 -rw------- 1 root root 1675 Jan 27 21:48 id_rsa -rw-r--r-- 1 root root 399 Jan 27 21:48 id_rsa.pub [ scripts]# cd ~/.ssh/ [ .ssh]# ssh-copy-id id_rsa.pub 10.0.0.8
案例脚本
[ scripts]# cat fenfa.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 2 ]
then
   echo "usage:$0 localdir remotedir"
   exit 1
fi
for n in 8 41 43
do
  scp -rp $1 10.0.0.$n:$2 &>/dev/null
  if [ $? -eq 0 ]
  then
     action "10.0.0.$n is successful" /bin/true
  else
    action "10.0.0.$n is failure" /bin/false
  fi
done
[ scripts]#已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分字符串的结果,请破解这些字符串对应的使用的md5sum处理前的RANDOM对应的数字。
21029299
00205d1c
a3da1677
1f6d12dd
890684b
解答:
[ .ssh]# cat random.sh
#!/bin/bash
array=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
funmd5(){
for n in {1..32767}
   do
     echo "$n\t `$n|md5sum`" >>/tmp/md5sum.log
   done
}
funjudge(){
for n in ${array[*]}
do
  if [ `echo grep $n /tmp/md5sum.log|wc -l` -eq 1 ]
  then
     echo `grep $n /tmp/md5sum.log`
  fi
done
}
main(){
funmd5
funjudge
}
main
[ .ssh]#优化方法1:
[ .ssh]# cat random1.sh 
#!/bin/bash
array=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
funmd5(){
for n in {1..32767}
   do
     echo "$n\t `$n|md5sum`" >>/tmp/md5sum1.log
   done
}
funjudge(){
   char="`echo ${array[*]} | tr " " "|"`"
     egrep $char /tmp/md5sum1.log
}
main(){
funmd5
funjudge
}
main
[ .ssh]#企业面试题:批量检查多个网站地址是否正常。
要求:
1、使用shell数组方法实现,检查策略尽量模拟用户访问。
2、每10s做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下:
解答:wget --spider #模拟爬虫,不下载html文件。
方法1
方法1
[ .ssh]# cat url.sh
#!/bin/bash
. /etc/init.d/functions
array=(
http://blog.oldboyedu.com
http://www.baidu.com
http://blog.ettiantian.org
http://www.luffycity.com
http://10.0.0.7
)
checkurl(){
        wget -t 2 -T 5 -o /dev/null -q $1
        if [ $? -eq 0 ]
        then
           action "$1 is successfull." /bin/true
        else
           action "$1 is failure." /bin/false
        fi
}
dealurl(){
      for n in ${array[*]}
      do 
        checkurl $n
      done
}
main(){
    while true
    do
          dealurl
          sleep 2
          echo "--------"
         
     done
}
main
[ .ssh]#方法2
方法2
[ .ssh]# cat url1.sh 
#!/bin/bash
. /etc/init.d/functions
array=(
http://blog.oldboyedu.com
http://www.baidu.com
http://blog.ettiantian.org
http://www.luffycity.com
http://10.0.0.7
)
checkurl(){
        wget -t 2 -T 5 -o /dev/null -q $1
        if [ $? -eq 0 ]
        then
           action "$1 is successfull." /bin/true
        else
           action "$1 is failure." /bin/false
        fi
}
dealurl(){
      for ((i=0;i<${#array[*]};i++))
      
      do 
        checkurl ${array[$i]}
      done
}
main(){
    while true
    do
          dealurl
          sleep 2
          echo "--------"
         
     done
}
main
[ .ssh]#方法3
方法3
[ .ssh]# cat url2.sh 
#!/bin/bash
. /etc/init.d/functions
checkurl(){
        wget -t 2 -T 5 -o /dev/null -q $1
        if [ $? -eq 0 ]
        then
           action "$1 is successfull." /bin/true
        else
           action "$1 is failure." /bin/false
        fi
}
dealurl(){
      while read line
      do 
        checkurl $line
      done < ./url.log
}
main(){
    while true
    do
          dealurl
          sleep 2
          echo "--------"
         
     done
}
main
[ .ssh]#写一个shell脚本解决dos攻击生成案例。
请根据web日志或者网络连接数,监控某个ip并发连接数或者短时间内pv达到100(读者根据实际请设定),即调用防火墙命令封掉对应的ip。防火墙命令为:iptables -I INPUT -s IP 地址 -j DROP
解答:
DOS deny of service
DDOS
分析:
1、封ip的命令
iptables -I INPUT -s IP 地址 -j DROP
2、web日志或者网络连接数
日志文件,netstat -an| grep -i est 排序去重。
3、判断pv或者连接数大于100,取出ip后封。
取攻击ip的方法:
方法1
[ scripts]# awk ‘{s[$1]++}END{for(key in s) print s[key],key}‘ access_2010-12-8.log | uniq  |sort -nr#依照数据大小排序,r逆序
35 59.33.26.105
23 123.122.65.226
8 124.115.4.18
方法2
[ scripts]# awk ‘{print $1}‘ access_2010-12-8.log | uniq -c | sort -nr
     35 59.33.26.105
     23 123.122.65.226
      8 124.115.4.18
[ scripts]#[ scripts]# cat dos.sh
#!/bin/bash
awk ‘{s[$1]++}END{for(key in s) print s[key],key}‘ access_2010-12-8.log  |sort -nr | head >/tmp/ip.log
while read line
do
  ip=`echo $line|awk ‘{print $2}‘`
  count=`echo $line|awk ‘{print $1}‘`
  if [ $count -gt 30 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ]
  then
     iptables -I INPUT -s `echo $line|awk ‘{print $2}‘` -j DROP &&     echo "echo $line|awk ‘{print $2}‘" >>/tmp/drop.log
  else
     echo "echo $line|awk ‘{print $2}‘" >>/tmp/accept.log
  fi
done </tmp/ip.log
[ scripts]# 
[ scripts]# iptables -nL获取网络连接数的方法:
[ scripts]# awk -F "[ :]+" ‘/ESTAB/{S[$(NF-3)]++}END{for(k in S) print S[k],k}‘ netstat.log| sort -rn | head
[ scripts]# awk ‘/ESTAB/{print $(NF-1)}‘ netstat.log | awk -F ":" ‘{print $1}‘| uniq -c | sort -rn |head[ scripts]# vim dos1.sh 
#!/bin/bash
awk -F "[ :]+" ‘/ESTAB/{S[$(NF-3)]++}END{for(k in S) print S[k],k}‘ netstat.log| sort -rn | head >/tmp/ip.log
while read line
do
  ip=`echo $line|awk ‘{print $2}‘`
  count=`echo $line|awk ‘{print $1}‘`
  if [ $count -gt 30 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ]
  then
     iptables -I INPUT -s `echo $line|awk ‘{print $2}‘` -j DROP &&     echo "echo $line|awk ‘{print $2}‘" >>/tmp/drop.log
  else
     echo "echo $line|awk ‘{print $2}‘" >>/tmp/accept.log
  fi
done </tmp/ip.log
[ scripts]# iptables -nL要求:用函数,case语句,if语句等实现。
解答:
/etc/init.d/mysqld {start | stop | restart}
分析:
1、启动
mysql_safe --user=mysql & 一定要在命令行测试成功。
2、停止
mysqladmin -uroot -ppasswd shutdown
killall,pkill
kill pid 推荐
[ scripts]# cat mysqld.sh 
# chkconfig: 2345 20 80
# description: mysql start stop
#!/bin/bash
lockfile=/var/lock/subsys/mysqld
. /etc/init.d/functions
mysqld_pid_file_path="/application/mysql/data/web01.pid"
mysqld_safe=/application/mysql/bin/mysqld_safe
start(){
    /bin/sh $mysqld_safe --datadir=/application/mysql/data --pid-file=$mysqld_pid_file_path &>/dev/null &
    retval=$?
    if [ $retval -eq 0 ]
     then
        action  "mysql start ok" /bin/true
        touch $lockfile
        return $retval
    else
        action "mysql start fail" /bin/false
        return $retval
    fi
}
stop(){
    if test -s "$mysqld_pid_file_path"
    then
       mysqld_pid=`cat $mysqld_pid_file_path`
       if (kill -0 $mysql_pid &>/dev/null) #kill -0 检查
       then
          kill $mysqld_pid
          retval=$?
          if [ $retval -eq 0 ]
          then
             action "mysql stop ok" /bin/true
             rm $lockfile
             return $retval
          else
              action "mysql stop fail" /bin/false
              return $retval
          fi
        else
            echo "mysqld process is not exits."
            return 2
       fi
    else
       echo "$mysqld_pid_file_path is not exist,or mysqld does not startup."  
  fi
}
case $1 in
     start)
        start
        retval=$?
        ;;
     stop)
        stop
        retval=$?
        ;;
     restart)
        stop 
        sleep 2
        start
        retval=$?
        ;;
     *)
        echo "usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval
[ scripts]#用shell脚本处理以下内容
1、按单词出现频率降序排序。
2、按字母出现频率降序排序。
the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation,by oldboy training.
1、按单词出现频率降序排序。
方法1:
[ scripts]# tr " ," "\n" <12.log | sort|uniq -c| sort -rn 空格逗号替换成回车
方法2:
[ scripts]# tr " ," "\n" <12.log | awk ‘{S[$1]++}END{for(k in S) print S[k],k}‘| sort -nr方法3
[ scripts]# xargs -n1 <12.log | sort|uniq -c|sort -nr
2、按字母出现的频率进行降序排序。
方法1
[ scripts]# grep -o "[^ ]" 12.log | sort|uniq -c|sort -nr [^ ]表示非空
方法2
[ scripts]# grep -o "[^ ]" 12.log | awk ‘{S[$1]++}END{for(k in S) print S[k],k}‘|sort -rn方法3
[ scripts]# sed ‘s#[ ,\.]##g‘ 12.log | awk -F "" ‘{for(i=1;i<NF;i++)s[$i]++}END{for(k in s) print s[k],k}‘| sort -nr竖着处理:
[ scripts]# awk -F ‘[ ,.]+‘ ‘{for(i=1;i<NF;i++)s[$i]++}END{for(k in s) print s[k],k}‘ 12.log | sort -nr