Linux运维高薪必看 | shell编程15例(二)

华盟原创文章投稿奖励计划

在下方公众号回复“001”,即可获取氪肝整理的154页Linux学习笔记。

1、进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示|  / ‐

#!/bin/bash  # 进度条,动态时针版本 # 定义一个显示进度的函数,屏幕快速显示|  / ‐  rotate_line(){
INTERVAL=0.5  #设置间隔时间 COUNT="0"     #设置4个形状的编号,默认编号为 0(不代表任何图像) while : do   COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表4种不同的形状)   case $COUNT in          #判断 COUNT 的值,值不一样显示的形状就不一样   "1")                    #值为 1 显示‐           echo -e '‐'"bc"           sleep $INTERVAL           ;;
    "2")                  #值为 2 显示\,第一个是转义           echo -e '\'"bc"           sleep $INTERVAL           ;;
    "3")                  #值为 3 显示|           echo -e "|bc"           sleep $INTERVAL           ;;
   "4")                   #值为 4 显示/           echo -e "/bc"           sleep $INTERVAL           ;;
    *)                    #值为其他时,将 COUNT 重置为 0           COUNT="0";;
    esac done }
rotate_line 

2、9*9 乘法表

#!/bin/bash  # 9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)  for i in `seq 9` do     for j in `seq $i`
     do          echo -n "$j*$i=$[i*j]  "      done     echo done  

3、使用死循环实时显示 eth0 网卡发送的数据包流量

#!/bin/bash  # 使用死循环实时显示 eth0 网卡发送的数据包流量    while : do    echo  '本地网卡 eth0 流量信息如下: '     ifconfig eth0 | grep "RX pack" | awk '{print $5}'     ifconfig eth0 | grep "TX pack" | awk '{print $5}'      sleep 1 done 

4、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息

#!/bin/bash  # 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码 # 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息 for i in `cat user.txt` do      useradd  $i      echo "123456" | passwd ‐‐stdin $i done 

5、编写批量修改扩展名脚本

#!/bin/bash  # 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件  # 执行脚本时,需要给脚本添加位置参数 # 脚本名  txt  doc(可以将 txt 的扩展名修改为 doc) # 脚本名  doc  jpg(可以将 doc 的扩展名修改为 jpg)   for i in `ls *.$1` do      mv $i ${i%.*}.$2 done 

6、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

#!/bin/bash  # 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件    # 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机 rm  ‐rf  ~/.ssh/known_hosts
expect <<EOF
spawn ssh 192.168.4.254
expect "yes/no" {send "yesr"} # 根据自己的实际情况将密码修改为真实的密码字串 expect "password" {send  "密码r"}
expect "#" {send  "yum ‐y install httpdr"}
expect "#" {send  "exitr"}
EOF 

7、一键部署 LNMP(源码安装版本)

#!/bin/bash  # 一键部署 LNMP(源码安装版本) menu()
{
clear echo "  ##############‐‐‐‐Menu‐‐‐‐##############" echo "# 1. Install Nginx" echo "# 2. Install MySQL" echo "# 3. Install PHP" echo "# 4. Exit Program" echo "  ########################################" }
  choice()
{
  read -p "Please choice a menu[1‐9]:" select
}
  install_nginx()
{
  id nginx &>/dev/null
  if [ $? -ne 0 ];then     useradd -s /sbin/nologin nginx
  fi   if [ -f nginx‐1.8.0.tar.gz ];then     tar -xf nginx‐1.8.0.tar.gz
    cd nginx‐1.8.0
    yum -y install  gcc pcre‐devel openssl‐devel zlib‐devel make
    ./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
    make
    make install
    ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
    cd ..
  else     echo "没有 Nginx 源码包"   fi }
  install_mysql()
{
  yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
  id mysql &>/dev/null
  if [ $? -ne 0 ];then     useradd -s /sbin/nologin mysql
  fi   if [ -f mysql‐5.6.25.tar.gz ];then     tar -xf mysql‐5.6.25.tar.gz
    cd mysql‐5.6.25
    cmake .
    make
    make install
    /usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
‐‐basedir=/usr/local/mysql/
    chown -R root.mysql /usr/local/mysql
    chown -R mysql /usr/local/mysql/data
    /bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld
    /bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
    echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
    ldconfig
    echo 'PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
    export PATH
  else     echo  "没有 mysql 源码包"     exit   fi }
  install_php()
{ #安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等 yum  -y  install  gcc  libxml2‐devel if [ -f mhash‐0.9.9.9.tar.gz ];then   tar -xf mhash‐0.9.9.9.tar.gz
  cd mhash‐0.9.9.9
  ./configure
  make
  make install
  cd .. if [ ! ‐f /usr/lib/libmhash.so ];then   ln -s /usr/local/lib/libmhash.so /usr/lib/ fi ldconfig else   echo "没有 mhash 源码包文件"   exit fi if [ -f libmcrypt‐2.5.8.tar.gz ];then   tar -xf libmcrypt‐2.5.8.tar.gz
  cd libmcrypt‐2.5.8
  ./configure
  make
  make install
  cd ..
  if [ ! -f /usr/lib/libmcrypt.so ];then  
    ln -s /usr/local/lib/libmcrypt.so /usr/lib/
  fi   ldconfig else   echo "没有 libmcrypt 源码包文件"   exit fi if [ -f php‐5.4.24.tar.gz ];then   tar -xf php‐5.4.24.tar.gz
  cd php‐5.4.24
  ./configure  ‐‐prefix=/usr/local/php5  ‐‐with‐mysql=/usr/local/mysql  ‐‐enable‐fpm    ‐‐
  enable‐mbstring  ‐‐with‐mcrypt  ‐‐with‐mhash  ‐‐with‐config‐file‐path=/usr/local/php5/etc  ‐‐with‐
  mysqli=/usr/local/mysql/bin/mysql_config
  make && make install
  /bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
  /bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
  cd .. else   echo "没有 php 源码包文件"   exit fi 
}
  while : do   menu
  choice
  case $select in   1)
    install_nginx
    ;;
  2)
    install_mysql
    ;;
  3)
    install_php
    ;;
  4)
    exit     ;;
  *)
    echo Sorry!
  esac done 

8、编写脚本快速克隆 KVM 虚拟机

#!/bin/bash  # 编写脚本快速克隆 KVM 虚拟机   # 本脚本针对 RHEL7.2 或 Centos7.2 # 本脚本需要提前准备一个 qcow2 格式的虚拟机模板, # 名称为/var/lib/libvirt/images  /.rh7_template 的虚拟机模板 # 该脚本使用 qemu‐img 命令快速创建快照虚拟机 # 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址 # exit code:   #    65 ‐> user input nothing #    66 ‐> user input is not a number #    67 ‐> user input out of range #    68 ‐> vm disk image exists  
IMG_DIR=/var/lib/libvirt/images
BASEVM=rh7_template read -p "Enter VM number: " VMNUM if [ $VMNUM -le 9 ];then VMNUM=0$VMNUM fi   if [ -z "${VMNUM}" ]; then     echo "You must input a number."     exit 65 elif [[  ${VMNUM} =~ [a‐z]  ]; then     echo "You must input a number."     exit 66 elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then     echo "Input out of range"     exit 67 fi  
NEWVM=rh7_node${VMNUM}   if [ -e $IMG_DIR/${NEWVM}.img ]; then     echo "File exists."     exit 68 fi   echo -en "Creating Virtual Machine disk image......t" qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
  echo -e "e[32;1m[OK]e[0m"   #virsh dumpxml ${BASEVM} > /tmp/myvm.xml cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
sed -i "/uuid/s/<uuid>.*</uuid>/<uuid>$(uuidgen)</uuid>/" /tmp/myvm.xml
sed -i "/${BASEVM}.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
  # 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值  # 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机  sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
  echo -en "Defining new virtual machine......tt" virsh define /tmp/myvm.xml &> /dev/null echo -e "e[32;1m[OK]e[0m" 

9、点名器脚本

#!/bin/bash  # 编写一个点名器脚本   # 该脚本,需要提前准备一个 user.txt 文件 # 该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名 while : do #统计 user 文件中有多少用户 line=`cat user.txt |wc ‐l`
num=$[RANDOM%line+1]
sed -n "${num}p"  user.txt
sleep 0.2
clear done 

10、查看有多少远程的 IP 在连接本机

#!/bin/bash  # 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)    # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有, # -t仅显示 tcp 连接的信息,‐n 数字格式显示 # Local Address(第四列是本机的 IP 和端口信息) # Foreign Address(第五列是远程主机的 IP 和端口信息) # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息 # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数 netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c 

11、对 100 以内的所有正整数相加求和(1+2+3+4...+100)

#!/bin/bash  # 对 100 以内的所有正整数相加求和(1+2+3+4...+100)   #seq 100 可以快速自动生成 100 个整数 sum=0 for i in `seq 100` do     sum=$[sum+i] done echo "总和是:$sum" 

12、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个

#!/bin/bash  # 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个   # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 最后使用 wc ‐l 统计这样的数据有多少行,即多少个 awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l 

13、统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么

#!/bin/bash  # 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么  # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 日志文档内容里面,第 1 列是远程主机的 IP 地址,使用 awk 单独显示第 1 列即可 awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log 

14、打印国际象棋棋盘

#!/bin/bash  # 打印国际象棋棋盘 # 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘 # i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列 # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列 # 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块 # 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块 for i in {1..8} do     for j in {1..8}
    do       sum=$[i+j]
    if [  $[sum%2] -eq 0 ];then        echo -ne "�33[46m  �33[0m"     else       echo -ne "�33[47m  �33[0m"     fi     done     echo done 
www.idc126.com

15、统计每个远程 IP 访问了本机 apache 几次?

#!/bin/bash  # 统计每个远程 IP 访问了本机 apache 几次?  awk  '{ip[$1]++}END{for(i in ip){print ip[i],i}}'  /var/log/httpd/access_log
本文来源云计算就该这么学,经授权后由congtou发布,观点不代表华盟网的立场,转载请联系原作者。

发表评论