精华内容
下载资源
问答
  • SHELL脚本实战

    2021-01-10 13:35:54
    SHELL脚本实战(一)SHELL脚本速成shell是什么 SHELL脚本速成 bash(通常意义上的shell脚本编程):可用于自动化那些通常没有人愿意手动完成的任务,比如:web爬取、文件改名、磁盘用量跟踪,天气数据下载等 shell是...

    SHELL脚本速成

    bash(通常意义上的shell脚本编程):可用于自动化那些通常没有人愿意手动完成的任务,比如:web爬取、文件改名、磁盘用量跟踪,天气数据下载等

    1. shell是什么

    shell命令有很多种,包括tcsh、zsh和广受欢迎的bash,不管哪种类的Ubuntu,打开terminal应用,得到的都是bash。

    执行命令:

    输出“Hello World”

    echo "Hello World"
    

    输出当前环境变量PATH

    echo $PATH
    

    可以用which查看命令在PATH中的位置:

    which ruby
    which echo
    

    试着编写一个完整的shell脚本,然后通过sh *.sh命令运行,比如:

    # neqn.sh
    echo "Hello World"
    echo $(which neqn)
    cat $(which neqn)
    
    sh neqn.sh
    

    在首行加入“#! /bin/bash”可以不输入命令自动运行,
    或是通过chmod +x neqn 修改权限运行。
    在这里插入图片描述

    2. POSIX是什么

    POSIX:可移植操作系统接口,posix操作系统本身是买不到的,使用的unix/linux通常都是兼容posix的,但是现如今linux/unix已成为事实标准的情况下,关于是否还需要POSIX标准尚存争议。

    3.脚本实战

    下一章节笔记开始正式的SHELL脚本实战,101个经典案例,让你真正学会SHELL脚本。

    展开全文
  • Shell脚本实战

    2020-11-17 20:05:47
    Shell脚本编程的灵活运用需要有对脚本基础,不同的语句组合应用具有十分熟悉的理解。接下来就通过一些实际项目来更加深刻的体会Shell在生活中的应用。 步骤 需求分析:根据系统管理的需求,分析脚本要实现的功能,...

    前言

    Shell脚本编程的灵活运用需要有对脚本基础,不同的语句组合应用具有十分熟悉的理解。接下来就通过一些实际项目来更加深刻的体会Shell在生活中的应用。

    步骤

    1. 需求分析:根据系统管理的需求,分析脚本要实现的功能,功能实现的层次,实现的命令与语句等
    2. 命令测试:将要用到的命令逐个进行测试,以决定使用的选项,要设置的变量等
    3. 脚本编程:将测试好的命令写入到脚本文件中,并通过各种语句将命令执行的结果保存,判断或者发出报警等
    4. 测试调优:对脚本进行测试,并根据结果进行优化建议一边编程一边调试,以减少错误的发生

    项目实战:

    1.实现ssh的免密登录。

    #!/bin/bash
    # 实现ssh的免密登录。
    yum -y install expect
    CLIENT1=$1
    USER=$2
    PASSWD=$3
    expect << -EOF
    spawn ssh-keygen -t rsa
    expect {
            "save the key" {send "\r";exp_continue}
            "Overwrite" {send "y\r";exp_continue}
            "Enter passphrase" {send "\r";exp_continue}
            "same passphrase" {send "\r"}
    }
    spawn ssh-copy-id ${USER}@${CLIENT1}
    expect {
            "yes/no" {send "yes\r";exp_continue}
            "password" {send "$PASSWD\r"}
    }
    expect eof
    -EOF
    
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@20.0.0.13'"
    and check to make sure that only the key(s) you wanted were added.
    
    [root@server1 ~]# ssh root@20.0.0.13
    Last login: Tue Nov 17 20:02:33 2020 from 20.0.0.1
    [root@server1 ~]# exit
    登出
    Connection to 20.0.0.13 closed.
    
    

    2.实现dns及apache服务的一键化部署,要求apche服务器绑定域名,客户机实现访问。

    dns_zones=/etc/named.rfc1912.zones
    local=/var/named/lzw.com.local
    zone=/var/named/lzw.com.zone
    
    yum -y install httpd
    yum -y install bind*
    
    [ -e /var/www/html/index.html ] || touch /var/www/html/index.html
    index=/var/www/html/index.html
    cat /root/index.html.txt > $index
    
    sed -i '/port/s/{.*}/{ 20.0.0.13; }/' $dns_conf
    sed -i '/allow-query/s/{.*}/{ any; }/' $dns_conf
    cat /root/named_zones.txt >> $dns_zones
    
    cp -p $dns/named.localhost $dns/lzw.com.local
    cp -p $dns/named.loopback $dns/lzw.com.zone
    chown $dns/root:named $dns/lzw.com.zone
    chown $dns/root:named $dns/lzw.com.local
    
    cat /root/local.txt > $local
    cat /root/zone.txt > $zone
    
    sed -i '1anameserver 20.0.0.13' /etc/resolv.conf
    sed -i '1{H;d};2G' /etc/resolv.conf
    systemctl restart named.service
    systemctl status named.service
    systemctl restart httpd
    systemctl status httpd
    
    nslookup www.lzw.com
    
    
    展开全文
  • Shell 脚本实战:日志关键字监控+自动告警该程序使用场景说明:主要用于Linux服务器监控程序日志,如出现关键字异常则触发相应的动作或告警操作,通知到邮件联系人。一、安装邮件服务1、解压tar -jxf mailx-12.4.tar...
    88b4cc507fc07650b012c4a6a0fe44ac.gif

    Shell 脚本实战:日志关键字监控+自动告警

    该程序使用场景说明:主要用于Linux服务器监控程序日志,如出现关键字异常则触发相应的动作或告警操作,通知到邮件联系人。

    一、安装邮件服务

    1、解压

    tar -jxf mailx-12.4.tar.bz2 -C /usr/src/ && cd /usr/src/mailx-12.4/

    2、编译

    make install UCBINSTALL=/usr/bin/install

    327768fe5b00c6342fcbe57d806e8805.png

    异常报错解决方法

    下载mailx补丁文件“mailx-12.4-openssl_1.0.0_build_fix-1.patch”,将补丁文件和mailx解压缩目录放置同一路径

    ba2118d502319b5b8af0efa4d893a3bc.png

    执行打补丁命令:

    patch -p0 

    8a70d1f003c55dcb452bc757f778d51d.png

    进入mailx-12.4重新执行编译命令:

    make install UCBINSTALL=/usr/bin/install

    752923979ef80a02f58309f90d4a693e.png

    检测mailx是否安装成功:mailx -V

    e636fa1c3169bda21e9bd5c562517853.png

    3、配置

    vi /etc/nail.rc,在文件的最后添加

    set from=

    set smtp=

    set smtp-auth-user=

    set smtp-auth-password=

    set smtp-auth=login

    如下图所示,修改配置完后保存

    7c111e0b6057e17cef77a462174616e1.png

    4、测试发送邮件

    echo '邮件正文'|mailx -v -s "邮件标题" 邮箱地址

    82dff57b77cc10eecea6766bab25f42b.png

    至此邮件功能测试正常,接下来是关键字监控脚本的编写工作,通过日志关键字脚本触发邮件告警脚本实现日志监控

    二、关键字监控脚本开发

    CheckLogs.sh 日志监控程序

    SendMail.sh 发邮件脚本,该脚本可自定义

    conf 配置文件目录,chklist为配置文件

    16e726c2f55852cb6031794b76cb7c13.png

    初次执行CheckLogs.sh脚本会读取日志文件并记录当前读取的行数

    48de9ad3f82126f27459840e08b7734d.png

    后续运行脚本则读取更新日志,例如当前日志更新了9行数据,则脚本从最新的9行数据获取关键字

    056f2aa07ac5b68312521942beb8382a.png

    测试插入关键字error

    5dea647c7092ac4570943aae5ba69e6f.png

    继续执行脚本可以看到已捕获关键字并触发告警

    fdf1c019d0116dec71cd51fcbdbc6e06.png

    测试多关键字

    b61c25def1b5c3bb53ef428257308bef.png

    再次执行可以看到已捕获最新更新的日志信息

    ef94a950b9a533da824ea9e13a3bfa05.png

    测试频率控制

    284735f1d10b3f7790abe1803cfc1d67.png

    至此相关功能测试已完成。最后附上脚本相关代码如下:

    #!/bin/bash
    basedir=$(cd `dirname "$0"`;pwd)
    logsdir=$basedir/logs
    tmpsdir=$basedir/tmps
    confdir=$basedir/conf
    chkfile=$confdir/chklist
    logfile=$logsdir/log.log_$(date +%F)
    #创建各种目录
    mkdir -p $logsdir $tmpsdir $confdir
    #创建配置文件
    if test ! -e "$chkfile";then
        echo "#日志文件,关键字(多关键字|隔开),重试次数,最大执行次数,启动命令,停止命令" >$chkfile
    fi
    #生成日志函数
    do_writelog() {
        case $1 in
        i|I)
            shift
            echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|INFO|$@" >>$logfile
            ;;
        e|E)
            shift
            echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|ERROR|$@" >>$logfile
            ;;
        w|W)
            shift
            echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|WARNING|$@" >>$logfile
            ;;
        *)
            echo "$(date +%Y-%m-%d) $(date +%H:%M:%S)|DEBUG|$@" >>$logfile
            esac
    }
    #日志处理部分代码
    cat $chkfile|egrep -v "^($|#)"|while read i;do
    (
        app_name=$(echo "$i"|awk -F, '{print $1}')
        if test -z "$app_name";then
            do_writelog e "应用名称为空,退出执行"
            exit 0
        fi
        log_filename=$(echo "$i"|awk -F, '{print $2}')
        if test ! -e "$log_filename";then
            do_writelog e "日志文件($log_filename)不存在,退出执行"
            exit 0
        fi
        log_md5sum=$(echo -n "$log_filename"|md5sum|awk '{print $1}')
        log_gjz=$(echo "$i"|awk -F, '{print $3}')
        if test -z "$log_gjz";then
            do_writelog i "日志文件($log_filename),关键字为空,退出执行"
            exit 0
        fi
        log_retry=$(echo "$i"|awk -F, '{print $4}')
        expr $log_retry + 0 &>/dev/null
        if [ $? -ne 0 ];then
            log_retry=0
        fi
        log_max=$(echo "$i"|awk -F, '{print $5}')
        expr $log_max + 0 &>/dev/null
        if [ $? -ne 0 ];then
            log_max=3
        fi
        start_command=$(echo "$i"|awk -F, '{print $6}')
        stops_command=$(echo "$i"|awk -F, '{print $7}')
        open_sendmail=$(echo "$i"|awk -F, '{print $8}')
        mail_scripts=$(echo "$i"|awk -F, '{print $9}')
        mail_contacts=$(echo "$i"|awk -F, '{print $10}')
        if [ $open_sendmail -eq 1 ];then
            if test -z "$mail_scripts";then
                do_writelog i "应用($app_name),触发动作脚本为空,退出执行"
                exit 0
            fi
            if test -z "$mail_contacts";then
                do_writelog i "应用($app_name),联系人为空,退出执行"
                exit 0
            fi
        fi
        if test ! -e "$tmpsdir/$log_md5sum";then
            log_new_count=$(wc -l $log_filename|awk '{print $1}')
            echo "$log_new_count" >$tmpsdir/$log_md5sum
            do_writelog i "日志文件($log_filename),初始化读取日志行数:$log_new_count,退出执行"
        else
            log_old_count=$(cat $tmpsdir/$log_md5sum)
            expr $log_old_count + 0 &>/dev/null
            if [ $? -ne 0 ];then
                do_writelog e "日志文件($log_filename),读取历史行数失败,退出执行"
                exit 0
            fi
            log_new_count=$(wc -l $log_filename|awk '{print $1}')
            if [ $log_new_count -eq $log_old_count ];then
                do_writelog i "日志文件($log_filename),未更新,退出执行"
                exit 0
            elif [ $log_new_count -lt $log_old_count ];then
                do_writelog i "日志文件($log_filename),跨日更新日志行数:$log_new_count,退出执行"
                echo "$log_new_count" >$tmpsdir/$log_md5sum
            else
               log_upd_count=$(expr $log_new_count - $log_old_count)
               do_writelog i "日志文件($log_filename),历史行数:$log_old_count,最新行数:$log_new_count,更新行数:$log_upd_count" 
               #读取更新的日志
               log_content=$(tail -n +`expr $log_old_count + 1` $log_filename|head -n +$log_upd_count)
               oldIFS=$IFS
               IFS="|"
               count=0
               for i in $log_gjz;do
                   if [ $(echo "$log_content"|grep -c -w "$i") -ge 1 ];then
                       let count+=1  
                   fi
                   if [ $count -gt 0 ];then
                       break
                   fi
               done
               IFS=$oldIFS
               if [ $count -gt 0 ];then
                   echo "0" >>$tmpsdir/${log_md5sum}.retry
               else
                  do_writelog i "日志文件($log_filename),未获取到关键字,退出执行"
                  echo "$log_new_count" >$tmpsdir/$log_md5sum
                  exit 0
               fi
               if [[ $(wc -l $tmpsdir/${log_md5sum}.retry|awk '{print $1}') -gt $log_retry ]];then
                   echo "0" >>$tmpsdir/${log_md5sum}_$(date +%F)
                   if [ $(wc -l $tmpsdir/${log_md5sum}_$(date +%F)|awk '{print $1}') -le $log_max ];then
                       $stops_command 1>>$logfile 2>&1
                       $start_command 1>>$logfile 2>&1
                       do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,停止命令:$stops_command,启动命令:$start_command,重启服务"
                       if [ $open_sendmail -eq 1 ];then
                           if test -n "$mail_scripts";then
                               $mail_scripts "应用[$app_name]故障" "日志文件($log_filename),日志内容:$log_content,找到关键字:$i" "$mail_contacts" 1>>$logfile 2>&1
                               if [ $? -ne 0 ];then
                                   do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,触发告警失败"
                               fi
                               do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,触发告警通知联系人:[$mail_contacts]"
                           fi
                       else
                           do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,不触发告警"
                       fi
                   else
                       do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,重启服务超出当天限制次数:$log_max,退出执行"
                   fi
                   rm -f $tmpsdir/${log_md5sum}.retry &>/dev/null
               else
                   do_writelog i "日志文件($log_filename),日志内容:$log_content,找到关键字:$i,重试检测:$(wc -l $tmpsdir/${log_md5sum}.retry|awk '{print $1}')"
               fi
               echo "$log_new_count" >$tmpsdir/$log_md5sum
               do_writelog i "日志文件($log_filename),更新记次文件完成" 
            fi
        fi
    )&
    done

    本文转自:Linux爱好者

    4c6b5ed9718b3ee9299c969a59c16e7a.gif
    展开全文
  • shell脚本实战

    2017-08-10 18:48:00
    想写个脚本,发现都忘了,蛋疼,一边回忆一边查一边写,总算完成了,贴在下面: 1 #!/bin/bash 2 #Program: 3 # This program can help you quickly redeploy the project 4 #History: 5 # 2017/08/10 ...

    想写个脚本,发现都忘了,蛋疼,一边回忆一边查一边写,总算完成了,贴在下面:

     1 #!/bin/bash
     2 #Program:
     3 #   This program can help you quickly redeploy the project
     4 #History:
     5 # 2017/08/10    shichaogeng    First release
     6 
     7 #variable
     8 jar_file="usp-lm-1.1.4.jar"
     9 project="usp-lm"
    10 project_path_prefix="/alidata/projects/"
    11 project_path_midfix="/Atomcat/webapps/"
    12 project_path_suffix="/WEB-INF/lib"
    13 source_path="/alidata/source_code/"
    14 
    15 #accept the parameters
    16 if [ ! -n "${1}"]; then
    17     jar_file="${1}"
    18 fi
    19 if [ ! -n "${2}"]; then
    20     project="${2}"
    21 fi
    22 
    23 #judge if exist
    24 if [ ! -f "$source_path$jar_file" ]; then
    25     echo "The jar is not exist in the path $source_path"
    26 fi
    27 if [ ! -d "$project_path_prefix$project" ]; then
    28     echo "The project is not exist in the path $project_path_prefix"
    29 fi
    30 
    31 #ready
    32 cd $project_path_prefix$project$project_path_midfix$project$project_path_suffix
    33 rm -rf $jar_file
    34 cp $source_path$jar_file ./
    35 cd $project_path_prefix$project/Atomcat
    36 pid=$(ps x | grep "usp-lm" | grep -v grep | awk '{print $1}')
    37 kill -9 $pid 
    38 rm -rf logs/*
    39 rm -rf work/*
    40 
    41 #restart
    42 ./bin/startup.sh
    43 tail -f logs/catalina.out

     写这么个玩意弄了一小时,笑cry。

    转载于:https://www.cnblogs.com/gengsc/p/7340894.html

    展开全文
  • 主要介绍了Shell脚本实战之DNS主从同步脚本实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 循序渐进学运维-shell脚本实战更新完毕

    千次阅读 热门讨论 2020-08-22 19:22:13
    shell脚本实战目录 【Linux】shell脚本概述 【Linux】shell脚本基础-变量 【Linux】shell脚本实战-使用shell进行数学运算 【Linux】shell脚本实战-各类运算符介绍 【Linux】shell脚本实战-if单双分支条件语句详解 ...
  • 文章目录前言shell函数的定义函数的优势shell 函数的调用实战案例总结 ...今天我们就来讨论下shell脚本的函数 shell函数的定义 shell中的函数的语法有以下三种: 方法一: function 函数名 () { 指令... } 方法二
  • 我的读书笔记,《shell脚本实战(第二版)》
  • v -s "邮件标题" 邮箱地址 至此邮件功能测试正常,接下来是关键字监控脚本的编写工作,通过日志关键字脚本触发邮件告警脚本实现日志监控 二、关键字监控脚本开发 CheckLogs.sh 日志监控程序 SendMail.sh 发邮件脚本,...
  • " sh operate_mysql.sh school "select * from score" 导出txt文本,-B去掉多余的符号可以导入到excel表格中 sh operate_mysql.sh school "select * from score" > result.txt 利用shell脚本将文本数据导入到mysql中...
  • Shell 脚本实战之报警监控

    千次阅读 2018-11-29 22:45:21
    Shell 脚本实战之报警监控 0. 需求 今天碰到的一个需求是:我们部门的人晚上需要看钉钉监控,手动排监控表很麻烦,于是想着使用shell 整一个脚本,用以轮流通知大家监控。 1. 代码 #!/bin/bash startDay=...
  • 我们可以通过本次课程学习,提高shell编程的技巧,掌握一个知识点运用比较综合的项目开发过程, 而且还会学习到shell脚本优化的一些思想。 适用人群 :        适合有一定的linux shell...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,682
精华内容 672
关键字:

shell脚本实战