shell脚本一百例

  1. 编写 hello world 脚本
    #!/bin/bash
    echo “hello world”
  2. 通过位置变量创建 Linux 系统账户及密码
    #!/bin/bash
    #$1 是执行脚本的第一个参数,2useradd"2 是执行脚本的第二个参数 useradd "!"
    echo “$2” | passwd --stdin “$2”
  3. 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
    #vim /root/logbak.sh
    #编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖
    #注意 date 命令需要使用反引号括起来,反引号在键盘键上面
    tar -czf log-date +%Y%m%d.tar.gz /var/log
    # crontab -e #编写计划任务,执行备份脚本
    00 03 * * 5 /root/logbak.sh
  4. 一键部署 LNMP(RPM 包版本)
    #!/bin/bash
    #使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败
    #本脚本使用于 centos7.2 或 RHEL7.2
    yum -y install httpd
    yum -y install mariadb mariadb-devel mariadb-server
    yum -y install php php-mysql
    systemctl start httpd
    systemctl start mariadb
    systemctl enable httpd
    systemctl enable mariadb
  5. 实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M 时,发送报警邮件给
    root 管理员
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #提取根分区剩余空间
    disk_size=$(df / |awk '///{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲') #提取内存剩余空间 me…(free |awk ‘/Mem/{print $4}’)
    while :
    do
    #注意内存和磁盘提取的空间大小都是以 Kb 为单位
    if [ $disk_size -le 512000 -a $mem_size -le 1024000 ];then
    mail -s Warning root <<EOF
    Insufficient resources,资源不足
    EOF
    fi
    done
  6. 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,猜小了或猜大了,直
    至用户猜对脚本结束。
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #RANDOM 为系统自带的系统变量,值为 0-32767 的随机数
    #使用取余算法将随机数变为 1-100 的随机数
    num=$[RANDOM%100+1]
    #使用 read 提示用户猜数字
    #使用 if 判断用户猜数字的大小关系:-eq(等于),-ne(不等于),-gt(大于),-ge(大于等于),-lt(小于),-le(小于等于)
    while :
    do
    read -p "计算机生成了一个 1-100 的随机数,你猜: " cai
    if [ $cai -eq $num ];then
    echo “恭喜,猜对了”
    exit
    elif [ $cai -gt $num ];then
    echo “Oops,猜大了”
    else
    echo “Oops,猜小了”
    fi
    done
  7. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理
    员(使用子串对比版本)
    #!/bin/bash
    if [ $USER == “root” ];then
    yum -y install vsftpd
    else
    echo “您不是管理员,没有权限安装软件”
    fi
  8. 检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理
    员(使用 UID 数字对比版本)
    #!/bin/bash
    if [ $UID -eq 0 ];then
    yum -y install vsftpd
    else
    echo “您不是管理员,没有权限安装软件”
    fi
  9. 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提
    示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。
    #!/bin/bash
    read -p "请输入用户名: " user
    #使用-z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2 #没有输入用户名脚本退出后,使用$?查看的返回码为 2
    if [ -z KaTeX parse error: Expected 'EOF', got '#' at position 39: …账户名" exit 2 fi #̲使用 stty -echo 关…{pass:-123456}
    useradd “user"echo"user" echo "pass” | passwd --stdin “$user”
  10. 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
    #!/bin/bash
    read -p “请输入一个整数:” num1
    read -p “请输入一个整数:” num2
    read -p “请输入一个整数:” num3
    #不管谁大谁小,最后都打印 echo “num1,num1,num2,$num3”
    #num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
    #如果输入的不是这样的顺序,则改变数的存储顺序,如:可以将 num1 和 num2 的值对调
    tmp=0
    #如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt num2];thentmp=num2 ];then tmp=num1
    num1=num2num2=num2 num2=tmp
    fi
    #如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt num3];thentmp=num3 ];then tmp=num1
    num1=num3num3=num3 num3=tmp
    fi
    #如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值
    if [ $num2 -gt num3];thentmp=num3 ];then tmp=num2
    num2=num3num3=num3 num3=tmp
    fi
    echo “排序后数据为:num1,num1,num2,$num3”
  11. 编写脚本,实现人机<石头,剪刀,布>游戏
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    game=(石头 剪刀 布)
    num=[RANDOMcomputer=[RANDOM%3] computer={game[$num]}
    #通过随机数获取计算机的出拳
    #出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能
    echo “请根据下列提示选择您的出拳手势”
    echo “1.石头”
    echo “2.剪刀”
    echo “3.布”
    read -p “请选择 1-3:” person
    case $person in
    1)
    if [ $num -eq 0 ];then
    echo “平局”
    elif [ $num -eq 1 ];then
    echo “你赢”
    else
    echo “计算机赢”
    fi;;
    2)
    if [ $num -eq 0 ];then
    echo “计算机赢”
    elif [ $num -eq 1 ];then
    echo “平局”
    else
    echo “你赢”
    fi;;
    3)
    if [ $num -eq 0 ];then
    echo “你赢”
    elif [ $num -eq 1 ];then
    echo “计算机赢”
    else
    echo “平局”
    fi;;
    *)
    echo “必须输入 1-3 的数字”
    esac
  12. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)
    #!/bin/bash
    for i in {1…254}
    do
    ping -c2 -i0.3 -W1 192.168.4.$i &>/dev/null
    if [ ?eq0];thenecho"192.168.4.? –eq 0 ];then echo "192.168.4.i is up"
    else
    echo “192.168.4.$i is down”
    fi
    done
  13. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(while 版本)
    #!/bin/bash
    i=1
    while [ ile254]dopingc2i0.3W1192.168.4.i -le 254 ] do ping -c2 -i0.3 -W1 192.168.4.i &>/dev/null
    if [ ?eq0];thenecho"192.168.4.? –eq 0 ];then echo "192.168.4.i is up"
    else
    echo “192.168.4.$i is down”
    fi
    let i++
    done
  14. 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #定义一个函数,ping 某一台主机,并检测主机的存活状态
    myping(){
    ping -c2 -i0.3 -W1 $1 &>/dev/null
    if [ $? -eq 0 ];then
    echo “$1 is up”
    else
    echo "KaTeX parse error: Expected 'EOF', got '}' at position 15: 1 is down" fi }̲ for i in {1..2…i &
    done
    #使用&符号,将执行的函数放入后台执行
    #这样做的好处是不需要等待 ping 第一台主机的回应,就可以继续并发 ping 第二台主机,依次类推。
  15. 编写脚本,显示进度条
    #!/bin/bash
    jindu(){
    while :
    do
    echo -n ‘#’
    sleep 0.2
    done
    }
    jindu &
    cp -a $1 $2
    killall $!
    echo "拷贝完成’’
  16. 进度条,动态时针版本
    #!/bin/bash
    #定义一个显示进度的函数,屏幕快速显示| / -
    rotate_line(){
    INTERVAL=0.1 #设置间隔时间
    COUNT=“0” #设置 4 个形状的编号,默认编号为 0(不代表任何图像)
    while :
    do
    COUNT=expr $COUNT + 1 #执行循环,COUNT 每次循环加 1,(分别代表 4 中不同的形状)
    case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样
    “1”) #值为 1 显示-
    echo -e ‘-’"\b\c"
    sleep $INTERVAL
    ;;
    “2”) #值为 2 显示\,第一个\是转义
    echo -e ‘\’"\b\c"
    sleep $INTERVAL
    ;;
    “3”) #值为 3 显示|
    echo -e “|\b\c”
    sleep $INTERVAL
    ;;
    “4”) #值为 4 显示/
    echo -e “/\b\c”
    sleep $INTERVAL
    ;;
    *) #值为其他时,将 COUNT 重置为 0
    COUNT=“0”;;
    esac
    done
    }
    rotate_line
  17. 99 乘法表(编写 shell 脚本,打印 99 乘法表)
    #!/bin/bash
    for i in seq 9
    do
    for j in seq $i
    do
    echo -n "ii*j=$[i*j] "
    done
    echo
    done
  18. 使用死循环实时显示 eth0 网卡发送的数据包流量
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    while :
    do
    echo '本地网卡 eth0 流量信息如下: ’
    ifconfig eth0 | grep “RX pack” | awk ‘{print $5}’
    ifconfig eth0 | grep “TX pack” | awk ‘{print $5}’
    sleep 1
    done
  19. 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码
    #!/bin/bash
    #本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
    for i in cat user.txt
    do
    useradd $i
    echo “123456” | passwd --stdin $i
    done
  20. 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
    #!/bin/bash
    #执行脚本时,需要给脚本添加位置参数
    #脚本名 txt doc(可以将 txt 的扩展名修改为 doc) #脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg)
    for i in "ls .$1"
    do
    mv $i ${i%.
    }.$2
    done
  21. 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机
    rm -rf ~/.ssh/known_hosts
    expect <<EOF
    spawn ssh 192.168.4.254
    expect “yes/no” {send “yes\r”}
    #根据自己的实际情况将密码修改为真实的密码子串
    expect “password” {send “密码\r”}
    expect “#” {send “yum -y install httpd\r”}
    expect “#” {send “exit\r”}
    EOF
  22. 一键部署 LNMP(源码安装版本)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    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
  23. 编写脚本快速克隆 KVM 虚拟机
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #本脚本针对 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 [ VMNUMle9];thenVMNUM=0VMNUM -le 9 ];then VMNUM=0VMNUM
    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 VMNUMgt99];thenecho"Inputoutofrange"exit67fiNEWVM=rh7node{VMNUM} -gt 99 ]; then echo "Input out of range" exit 67 fi NEWVM=rh7_node{VMNUM}
    if [ -e IMGDIR/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 IMGDIR/.IMG_DIR/.{BASEVM}.img IMGDIR/IMG_DIR/{NEWVM}.img &> /dev/null
    echo -e “\e[32;1m[OK]\e[0m”
    #virsh dumpxml BASEVM>/tmp/myvm.xmlcat/var/lib/libvirt/images/.rhel7.xml>/tmp/myvm.xmlsedi"/<name>{BASEVM} > /tmp/myvm.xml cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml sed -i "/<name>{BASEVM}/s/BASEVM/{BASEVM}/{NEWVM}/” /tmp/myvm.xml
    sed -i “/uuid/s/.*</uuid>/KaTeX parse error: Undefined control sequence: \/ at position 11: (uuidgen)<\̲/̲uuid>/" /tmp/my…{BASEVM}.img/s/BASEVM/{BASEVM}/{NEWVM}/” /tmp/myvm.xml
    #修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值
    #最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机
    sed -i “/mac /s/a1/0c/” /tmp/myvm.xml
    echo -en “Defining new virtual machine…\t\t”
    virsh define /tmp/myvm.xml &> /dev/null
    echo -e “\e[32;1m[OK]\e[0m”
  24. 编写一个点名器脚本
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #该脚本,需要提前准备一个 user.txt 文件
    #该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名
    while :
    do
    #统计 user 文件中有多少用户
    line=cat user.txt |wc -l
    num=[RANDOMsedn"[RANDOM%line+1] sed -n "{num}p" user.txt
    sleep 0.2
    clear
    done
  25. 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #使用 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
  26. 对 100 以内的所有正整数相加求和(1+2+3+4…+100)
    #!/bin/bash
    #seq 100 可以快速自动生成 100 个整数
    sum=0
    for i in seq 100
    do
    sum=[sum+i]doneecho":[sum+i] done echo "总和是:sum"
  27. 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #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
  28. 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么
    #!/bin/bash
    #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
  29. 打印国际象棋棋盘,效果如下图:
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #设置两个变量,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 “\033[46m \033[0m”
    else
    echo -ne “\033[47m \033[0m”
    fi
    done
    echo
    done
  30. 统计每个远程 IP 访问了本机 apache 几次?
    #!/bin/bash
    awk ‘{ip[$1]++}END{for(i in ip){print ip[i],i}}’ /var/log/httpd/access_log
  31. 统计当前 Linux 系统中可以登录计算机的账户有多少个
    #!/bin/bash
    #方法 1:
    grep "bashKaTeX parse error: Expected 'EOF', got '#' at position 23: …passwd | wc -l #̲方法 2: awk -f: '…/{x++}end{print x}’ /etc/passwd
  32. 统计/var/log 有多少个文件,并显示这些文件名
    #!/bin/bash
    #使用 ls 递归显示所有,再判断是否为文件,如果是文件则计数器加 1
    cd /var/log
    sum=0
    for i in ls -r *
    do
    if [ -f i];thenletsum++echo":i ];then let sum++ echo "文件名:i"
    fi
    done
    echo “总文件数量为:$sum”
  33. 自动为其他脚本添加解释器信息#!/bin/bash,如脚本名为 test.sh 则效果如下: #./test.sh abc.sh 自动为 abc.sh 添加解释器信息
    #./test.sh user.sh 自动为 user.sh 添加解释器信息
    #!/bin/bash
    #先使用 grep 判断对象脚本是否已经有解释器信息,如果没有则使用 sed 添加解释器以及描述信息
    if ! grep -q “^#!” $1; then
    sed ‘1i #!/bin/bash’ $1
    sed '2i #Description: ’
    fi
    #因为每个脚本的功能不同,作用不同,所以在给对象脚本添加完解释器信息,以及 Description 后还希望
    #继续编辑具体的脚本功能的描述信息,这里直接使用 vim 把对象脚本打开,并且光标跳转到该文件的第 2 行
    vim +2 $1
  34. 自动化部署 varnish 源码包软件
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #本脚本需要提前下载 varnish-3.0.6.tar.gz 这样一个源码包软件,该脚本即可用自动源码安装部署软件
    yum -y install gcc readline-devel pcre-devel
    useradd -s /sbin/nologin varnish
    tar -xf varnish-3.0.6.tar.gz
    cd varnish-3.0.6
    #使用 configure,make,make install 源码安装软件包
    ./configure --prefix=/usr/local/varnish
    make && make install
    #在源码包目录下,将相应的配置文件拷贝到 Linux 系统文件系统中
    #默认安装完成后,不会自动拷贝或安装配置文件到 Linux 系统,所以需要手动 cp 复制配置文件
    #并使用 uuidgen 生成一个随机密钥的配置文件
    cp redhat/varnish.initrc /etc/init.d/varnish
    cp redhat/varnish.sysconfig /etc/sysconfig/varnish
    cp redhat/varnish_reload_vcl /usr/bin/
    ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
    ln -s /usr/local/varnish/bin/* /usr/bin
    mkdir /etc/varnish
    cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/
    uuidgen > /etc/varnish/secret
  35. 编写 nginx 启动脚本
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本
    #如果本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务
    #service nginx stop 就可以关闭服务
    #service nginx restart 可以重启服务
    #service nginx status 可以查看服务状态
    program=/usr/local/nginx/sbin/nginx
    pid=/usr/local/nginx/logs/nginx.pid
    start(){
    if [ -f $pid ];then
    echo “nginx 服务已经处于开启状态”
    else
    $program
    fi
    stop(){
    if [ -! -f $pid ];then
    echo “nginx 服务已经关闭”
    else
    $program -s stop
    echo “关闭服务 ok”
    fi
    }
    status(){
    if [ -f $pid ];then
    echo “服务正在运行…”
    else
    echo “服务已经关闭”
    fi
    }
    case $1 in
    start)
    start;;
    stop)
    stop;;
    restart)
    stop
    sleep 1
    start;;
    status)
    status;;
    *)
    echo “你输入的语法格式错误”
    esac
  36. 自动对磁盘分区、格式化、挂载
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk
    #n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区)
    #注意:1 后面的两个回车(空白行)是必须的!
    fdisk /dev/vdb << EOF
    np1
    wq
    EOF
    #格式化刚刚创建好的分区
    mkfs.xfs /dev/vdb1
    #创建挂载点目录
    if [ -e /data ]; then
    exit
    fi
    mkdir /data
    #自动挂载刚刚创建的分区,并设置开机自动挂载该分区
    echo ‘/dev/vdb1 /data xfs defaults 1 2’ >> /etc/fstab
    mount -a
  37. 自动优化 Linux 内核参数
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #脚本针对 RHEL7
    cat >> /usr/lib/sysctl.d/00-system.conf <<EOF
    fs.file-max=65535
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_synack_retries = 5
    net.ipv4.tcp_syn_retries = 5
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    #net.ipv4.tcp_keepalive_time = 120
    net.ipv4.ip_local_port_range = 1024 65535
    kernel.shmall = 2097152
    kernel.shmmax = 2147483648
    kernel.shmmni = 4096
    kernel.sem = 5010 641280 5010 128
    net.core.wmem_default=262144
    net.core.wmem_max=262144
    net.core.rmem_default=4194304
    net.core.rmem_max=4194304
    net.ipv4.tcp_fin_timeout = 10
    net.ipv4.tcp_keepalive_time = 30
    net.ipv4.tcp_window_scaling = 0
    net.ipv4.tcp_sack = 0
    EOF
    sysctl –p
  38. 切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)
    #mkdir /data/scripts
    #vim /data/scripts/nginx_log.sh
    #!/bin/bash
    logs_path="/usr/local/nginx/logs/"
    mv ${logs_path}access.log KaTeX parse error: Expected group after '_' at position 18: …ogs_path}access_̲(date -d “yesterday” +"%Y%m%d").log
    kill -USR1 cat /usr/local/nginx/logs/nginx.pid

    chmod +x /data/scripts/nginx_log.sh

    #crontab -e #脚本写完后,将脚本放入计划任务每天执行一次脚本
    0 1 * * * /data/scripts/nginx_log.sh
  39. 检测 MySQL 数据库连接数量
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #本脚本每 2 秒检测一次 MySQL 并发连接数,可以将本脚本设置为开机启动脚本,或在特定时间段执行
    #以满足对 MySQL 数据库的监控需求,查看 MySQL 连接是否正常
    #本案例中的用户名和密码需要根据实际情况修改后方可使用
    log_file=/var/log/mysql_count.log
    user=root
    passwd=123456
    while :
    do
    sleep 2
    count=mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'
    echo "date +%Y-%m-%d 并发连接数为:$count" >> $log_file
    done
  40. 根据 md5 校验码,检测文件是否被修改
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件
    #本脚本在目标数据没有被修改时执行一次,当怀疑数据被人篡改,再执行一次
    #将两次执行的结果做对比,MD5 码发生改变的文件,就是被人篡改的文件
    for i in (ls/etc/.conf)domd5sum"(ls /etc/*.conf) do md5sum "i" >> /var/log/conf_file.log
    done
  41. 检测 MySQL 服务是否存活
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码
    #这些信息需要根据实际情况修改后方可使用
    host=127.0.0.1
    user=root
    passwd=123456
    mysqladmin -h 127.0.0.1 -u root -p’$passwd’ ping &>/dev/null
    if [ $? -eq 0 ];then
    echo “MySQL is UP”
    else
    echo “MySQL is down”
    fi
  42. 备份 MySQL 的 shell 脚本(mysqldump 版本)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签)
    #dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库)
    user=root
    passwd=123456
    dbname=mysql
    date=KaTeX parse error: Expected 'EOF', got '#' at position 16: (date +%Y%m%d) #̲测试备份目录是否存在,不存在则…user" -p"passwd""passwd" "dbname" > /mysqlbackup/"dbname"dbname"-{date}.sql
  43. 将文件中所有的小写字母转换为大写字母
    #!/bin/bash
    #$1 是位置参数,是你需要转换大小写字母的文件名称
    #执行脚本,给定一个文件名作为参数,脚本就会将该文件中所有的小写字母转换为大写字母
    tr “[a-z]” “[A-Z]” < $1
  44. 非交互自动生成 SSH 密钥文件
    #!/bin/bash
    #-t 指定 SSH 密钥的算法为 RSA 算法;-N 设置密钥的密码为空;-f 指定生成的密钥文件存放在哪里
    rm -rf ~/.ssh/{known_hosts,id_rsa*}
    ssh-keygen -t RSA -N ‘’ -f ~/.ssh/id_rsa
  45. 检查特定的软件包是否已经安装
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    if [ $# -eq 0 ];then
    echo “你需要制定一个软件包名称作为脚本参数”
    echo “用法:KaTeX parse error: Expected 'EOF', got '#' at position 17: … 软件包名称 ..." fi #̲@提取所有的位置变量的值,相当于forpackagein"* for package in "@”
    do
    if rpm -q KaTeX parse error: Expected 'EOF', got '&' at position 11: {package} &̲>/dev/null ;the…{package}\033[32m 已经安装\033[0m"
    else
    echo -e “${package}\033[34;1m 未安装\033[0m”
    fi
    done
  46. 监控 HTTP 服务器的状态(测试返回码)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #设置变量,url 为你需要检测的目标网站的网址(IP 或域名)
    url=http://192.168.4.5/index.html
    #定义函数 check_http: #使用 curl 命令检查 http 服务器的状态
    #-m 设置 curl 不管访问成功或失败,最大消耗的时间为 5 秒,5 秒连接服务为相应则视为无法连接
    #-s 设置静默连接,不显示连接时的连接速度、时间消耗等信息
    #-o 将 curl 下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容) #-w 设置 curl 命令需要显示的内容%{http_code},指定 curl 返回服务器的状态码
    check_http(){
    status_code=$(curl -m 5 -s -o /dev/null -w %{http_code} KaTeX parse error: Expected 'EOF', got '}' at position 6: url) }̲ while : do che…(date +%Y%m%d-%H:%M:%S)
    #生成报警邮件的内容
    echo “当前时间为:$date
    url,url 服务器异常,状态码为{status_code}.
    请尽快排查异常.” > /tmp/httpKaTeX parse error: Expected 'EOF', got '#' at position 6: .pid #̲指定测试服务器状态的函数,并根….pid
    else
    echo “$url 连接正常” >> /var/log/http.log
    fi
    sleep 5
    done
  47. 自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #设置变量定义需要添加到防火墙规则的服务和端口号
    #使用 firewall-cmd --get-services 可以查看 firewall 支持哪些服务
    service=“nfs http ssh”
    port=“80 22 8080”
    #循环将每个服务添加到防火墙规则中
    for i in $service
    do
    echo "Adding iservicetofirewall"firewallcmdaddservice=i service to firewall" firewall-cmd --add-service={i}
    done
    #循环将每个端口添加到防火墙规则中
    for i in $port
    do
    echo "Adding iPorttofirewall"firewallcmdaddport=i Port to firewall" firewall-cmd --add-port={i}/tcp
    done
    #将以上设置的临时防火墙规则,转换为永久有效的规则(确保重启后有效)
    firewall-cmd --runtime-to-permanent
  48. 使用脚本自动创建逻辑卷
    #!/bin/bash
    #Author:丁丁历险(Jacob)
    #清屏,显示警告信息,创建将磁盘转换为逻辑卷会删除数据
    clear
    echo -e “\033[32m !!!警告(Warning)!!!\033[0m”
    echo
    echo “+++++++++++++++++++++++++++++++++++++++++++++++++”
    echo “脚本会将整个磁盘转换为 PV,并删除磁盘上所有数据!!!”
    echo “This Script will destroy all data on the Disk”
    echo “+++++++++++++++++++++++++++++++++++++++++++++++++”
    echo
    read -p “请问是否继续 y/n?:” sure
    #测试用户输入的是否为 y,如果不是则退出脚本
    [ $sure != y ] && exit
    #提示用户输入相关参数(磁盘、卷组名称等数据),并测试用户是否输入了这些值,如果没有输入,则脚本退出
    read -p “请输入磁盘名称,如/dev/vdb:” disk
    [ -z $disk ] && echo “没有输入磁盘名称” && exit
    read -p “请输入卷组名称:” vg_name
    [ -z $vg_name ] && echo “没有输入卷组名称” && exit
    read -p “请输入逻辑卷名称:” lv_name
    [ -z $lv_name ] && echo “没有输入逻辑卷名称” && exit
    read -p “请输入逻辑卷大小:” lv_size
    [ -z $lv_size ] && echo “没有输入逻辑卷大小” && exit
    #使用命令创建逻辑卷
    pvcreate $disk
    vgcreate $vg_name $disk
    lvcreate -L ${lv_size}M -n ${lv_name} ${vg_name}
  49. 显示 CPU 厂商信息
    #!/bin/bash
    awk ‘/vendor_id/{print $3}’ /proc/cpuinfo |uniq
  50. 删除某个目录下大小为 0 的文件
    #!/bin/bash
    #/var/www/html 为测试目录,脚本会清空该目录下所有 0 字节的文件
    dir="/var/www/html"
    find $dir -type f -size 0 -exec rm -rf {} ;
发布了30 篇原创文章 · 获赞 0 · 访问量 772
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览