Shell运维实战3-while、case、for、select

news2024/11/15 10:02:37

目录

      • case
        • 基本
        • case 企业级案例
      • while 循环
        • 当型与直到
        • 后台运行
        • while 实战
      • for & select
        • for 循环方法
        • linux 生成随机数
        • select

case


基本

请注意 case 使用后的闭合问题,开头 case,结尾 esac

#! /bin/bash

read -p "input your number:" ans

# 双引号内写判据
case "$ans" in
  # 对应值+右小括号
  1)
  echo "1";; # 末尾两个引号可视为break
  2)
  echo "2";;
  # *)可视为default
  *)
  echo "i dont understand what you input"
  exit; # 最后一个程序结尾直接退出
esac # 别忘了case末尾需要闭合!

case 企业级案例

此次案例展示:使用函数传参的方式来为 conf 添加用户

[root@oldboy scripts]# cat add-openvpn-user
#! /bin/bash

. /etc/init.d/functions

#config file path
FILE_PATH=/etc/openvpn_authfile.conf           #<==这是openvpn的登录授权文件路径。
[ ! -f $FILE_PATH ] && touch $FILE_PATH        #<==如果变量对应的文件不存在,则创建文件。
usage(){                                       #<==帮助函数。
    cat <<EOF                                #<==这是一个可以替代echo的输出菜单等内
                                                        容的方法。
    USAGE: `basename $0` {-add|-del|-search} username
EOF
}

#judge run user
if [ $UID -ne 0 ] ; then    #<==必须是root用户,才能执行本脚本。
    echo "Youare not supper user, please call root! "
    exit 1;
fi

#judge arg numbers.
if [ $# -ne 2 ] ; then      #<==传入的参数必须为两个。
    usage
    exit 2
fi
#满足条件后进入case语句判断。
case "$1" in                #<==获取命令行第一个参数的值。
    -a|-add)                #<==如果匹配-a或-add,则执行下面的命令语句。
        shift               #<==将$1清除,将$2替换为$1,位置参数左移。
        if grep "^$1$" ${FILE_PATH} >/dev/null 2>&1     #<==过滤命令行第一个参
                                                                数的值,如果有
            then              #<==则执行下面的指令。
            action $"vpnuser, $1 is exist" /bin/false
            exit
            else              #<==如果文件中不存在命令行传参的一个值,则执行下面的指令。
            chattr -i ${FILE_PATH}             #<==解锁文件。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
#<==备份文件(尾部加时间)。
            echo "$1" >> ${FILE_PATH}        #<==将第一个参数(即用户名)加入到文件。
            [ $? -eq 0 ] && action $"Add $1" /bin/true      #<==如果返回值为0,提
                                                                示成功。
            chattr +i ${FILE_PATH}             #<==给文件加锁。
        fi
        ;;
    -d|-del)       #<==如果命令行的第一个参数匹配-d或-del,则执行下面的命令语句。
        shift
        if [ `grep "\b$1\b" ${FILE_PATH}|wc -l` -lt 1 ]   #<==过滤第一个参数值,
                                                                并看文件中是否存在。

            then     #<==如果不存在,则执行下面的指令。
            action $"vpnuser, $1 is not exist." /bin/false
            exit
        else       #<==否则执行下面的指令,存在才删除,不存在就提示不存在,不需要删除。
            chattr -i ${FILE_PATH}                #<==给文件解锁,准备处理文件的内容。
            /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
#<==备份文件(尾部加时间)。
            sed -i "/^${1}$/d" ${FILE_PATH}       #<==删除文件中包含命令行传参的用户。
            [ $? -eq 0 ] && action $"Del $1" /bin/true
#<==如果返回值为0,提示成功。
            chattr +i ${FILE_PATH}                #<==给文件加锁。
            exit
        fi
        ;;
    -s|-search)    #<==如果命令行的第一个参数匹配-s或-search,就执行下面的命令语句。
        shift
        if [ `grep -w "$1" ${FILE_PATH}|wc -l` -lt 1 ]
#<==过滤第一个参数值,并看文件中是否存在。
            then
            echo $"vpnuser, $1 is not exist."; exit
        else
            echo $"vpnuser, $1 is exist."; exit
        fi
        ;;
    *)
        usage
        exit
        ;;
esac

while 循环


当型与直到

当型即 while,当条件成立时才继续执行

while <条件表达式>
do
    指令...
done

直到即 until,当条件成立后就停止循环

until <条件表达式>
do
    指令...
done

每隔两秒输出一次负载值的程序

#! /bin/bash

while [ 1 ]
do
  uptime
  sleep 2
done

后台运行

在这里插入图片描述

比如这样子可以让程序后台执行 sh demo1.sh &


while 实战

每个十秒检测一个网站是否正常

#! /bin/sh
if [ $# -ne 1 ]; then               #<==判断,若传参的个数不为1,
    echo $"usage $0 url"            #<==则打印正确使用提示。
    exit 1                          #<==以返回值1退出脚本。
fi

while true                          #<==永远为真,进入while循环。
do
    if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}"   $1|
egrep -w "200|301|302"|wc -l` -ne 1 ]
    #<==对传入的URL参数获取状态码,过滤200、301、302任意之一转为数字,如果不等于1,
则表示状态信息不对。
        then
        echo "$1 is error."         #<==提示URL访问错误。
        #echo "$1 is error."|mail -s "$1 is error." 31333741--@qq.com
                                    #<==发送邮件报警。
    else
        echo "$1 is ok"             #<==否则,提示URL访问OK。
    fi
    sleep 10   #<==休息10秒继续执行while循环,注意,当while后面有true等永远为真的条件时,一般在循环里要有退出循环的条件或类似sleep休息的命令,否则会大量消耗系统资源。
done

日常开发时,推荐吧常用的函数放置到函数库 function 里面,类似于前端封装的工具类,便于后期调用


每一个小时检测某个 IP 是否访问量超过了 500 次,如果是,则判定其为恶意的,直接自动封禁

file=$1          #<==定义一个变量接收命令行传参,参数为日志文件类型。

while true
do
    awk '{print $1}' $1|grep -v "^$"|sort|uniq -c >/tmp/tmp.log
    #<==分析传入的日志文件,并在排序去重后追加到一个临时文件里。
    exec </tmp/tmp.log     #<==读取上述临时文件。
    while read line         #<==进入while循环处理。
    do
        ip=`echo $line|awk '{print $2}'`          #<==获取文件中的每一行的第二列。
        count=`echo $line|awk '{print $1}'`       #<==获取文件中的每一行的第一列。
        if [ $count -gt 500 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]
        #<==如果PV数大于500,并且防火墙里没有封过此IP。
            then
            iptables -I INPUT -s $ip -j DROP      #<==则封掉PV数大于500的IP。
            echo "$line is dropped" >>/tmp/droplist_$(date +%F).log
                                                    #<==记录处理日志。
        fi
    done
    sleep 3600  #<==读者可以按分钟进行分析,不过日志的分割或过滤也得按分钟才行。
done

for & select


for 循环方法

由两种典型的定义 for 循环的方法

# shell中foreach风格的for
# 下面展示的被迭代的数据为一个数组,数字之间使用空格隔开
for num in 1 2 3 4 5
do
  echo $num
done

# C风格的for
for ((i=1; i<=3; i++))
do
  echo $i
done

配合其他语法可以实现特殊的效果

# 花括号列表形式
for n in {5..1}        #<==实质上也相当于列表。
do
    echo $n
done

# seq步长,反引号实际上规定了一个执行linux命令的区域
for n in `seq 5 -1 1` #<==5是起始数字,-1是步长,即每次减一,1是结束数字。
do
    echo $n
done

linux 生成随机数

# $RANDOM 系统变量,生成随机数
# 后面的参数表示使用md5进行加密
echo "oldboy$RANDOM"|md5sum|cut -c 8-15

# 借助openssl生成安全稳定的随机数
openssl rand -base64 8

# 通过date获取随机数
date +%s%N

# 借助UUID生成随机数
cat /proc/sys/kernel/random/uuid

# 使用expect的子库mkpassowrd快速生成随机数
# -l长度 -d数字个数 -c小写字母个数 -C大写字母个数 -s特殊字符个数
mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1

select

select 的作用和 foreach 对应功能差不多一样,可以借鉴

他可以根据给定数组或者列表,输出对应列表项(即 select 过后,echo 输出的结果将以列表的形式呈现)

arr=(hey shit pig)
select s in "${arr[@]}"
do
  echo $s
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++刷题集】-- day3

目录 选择题 单选 OR59 字符串中找出连续最长的数字串⭐ 【题目解析】 【解题思路】 JZ39 数组中出现次数超过一半的数字⭐ 【题目解析】 【解题思路1】 【解题思路2】 选择题 单选 1、以下程序的输出结果是 ( ) #include <stdio.h> int main() {char a[10] …

vite + vue3 + storybook + ts 搭建组件库记录

目标 只按需引入&#xff0c;不依赖babel-import-plugin 插件。第三方依赖都不打包。用原生fetch请求数据。仅支持esmodule。配置package.json type:"module" 搭建 根据storybook 官网文档&#xff0c;需要在已有的项目中运行 npx storybooklatest init 也就是事…

电源原理分析、波形分析、应力计算、回路布局

1、Flyback变换器工作模态分析&#xff1b; 2、Flyback关键波形分析&#xff1b; 3、RCD吸收电路设计及开关管应力&#xff1b; 4、从噪音回路看布线要点。 5、基于实际项目&#xff0c;原创反激开关电源视频教程曝光 Flyback 变换器模态分析 ​ ON&#xff1a;开关管导通&…

516. 最长回文子序列

516. 最长回文子序列 C代码&#xff1a;dp int longestPalindromeSubseq(char* s) {int n strlen(s);int dp[n][n];memset(dp, 0, sizeof(dp));for (int i 0; i < n; i) {dp[i][i] 1;}for (int i n - 1; i > 0; i--) {for (int j i 1; j < n; j) {if (s[i] s[…

2023最新CTF入门的正确姿势

前言 随着网络安全意识的增强&#xff0c;越来越多的人开始涉足网络安全领域&#xff0c;其中CTF比赛成为了重要的学习和竞赛平台。本人从事网络安全工作多年&#xff0c;也参加过大大小小的CTF比赛&#xff0c;今天就来详细介绍CTF的流程&#xff0c;以及需要具备的知识&…

【前端相关】elementui使用el-upload组件实现自定义上传

elementui使用el-upload组件实现自定义上传 一、问题描述二、实现方式三、实现步骤3.1 方式一&#xff1a;选择后自动上传3.2 方式二&#xff1a;选择图片后手动上传3.3 拓展&#xff1a;上传文件夹 四、服务器相关接口 一、问题描述 elmentui 中的upload默认的提交行为是通过…

[C++]哈希表实现,unordered_map\set封装

目录​​​​​​​ 前言&#xff1a; 1 哈希 1.1 为什么有哈希 1.2 哈希结构 1.3 哈希冲突 2 闭散列 2.1 闭散列结点结构和位置状态表示 2.2 哈希类结构 2.3 插入 2.4 查找 2.5 删除 3 开散列 3.1 哈希表结点结构 3.2 哈希表结构 3.3 插入 3.4 查找、删除 3.5…

Ubuntu/Debian/CentOS搭建Socks5代理一键脚本

说明 Socks5属于明文代理&#xff0c;不要用于科学上网&#xff0c;否则会被阻断端口&#xff0c;可用于正常的跳板使用&#xff1b; 比如SSH转发加速国外VPS的连接速度&#xff0c;特别是一些延迟高或者丢包高的VPS&#xff1b; 使用Socks5转发后SSH就可以快速稳定的连接了&a…

Java中的Replace和ReplaceAll的区别

replace和replaceAll是都是String类中提供的两种用于字符/字符串替换的方法&#xff0c;从字面意思理解&#xff0c;replace表示替换单个匹配项&#xff0c;而replaceAll表示替换所有匹配项&#xff1b;实际上并不是这样子的,replace和replaceAll都是替换所有匹配项,replace是非…

链式二叉树OJ题思路分享

⏩博主CSDN主页:杭电码农-NEO⏩   ⏩专栏分类:刷题分享⏪   ⏩代码仓库:NEO的学习日记⏩   &#x1f339;关注我&#x1faf5;带你刷更多C语言和数据结构的题!   &#x1f51d;&#x1f51d; 链式二叉树OJ题分享 1. 前言&#x1f6a9;2. 单值二叉树&#x1f6a9;2.1 审题…

macOS Ventura 13.5beta OpenCore黑苹果双引导分区原版镜像

镜像特点&#xff08;原文地址&#xff1a;http://www.imacosx.cn/113700.html&#xff0c;转载请注明出处&#xff09; 完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引…

六级备考25天|CET-6|听力第五讲|演讲满分技巧|分值最高|2022年6月考题16-18题|18:15~19:00

14.2分一题 抓重点 目录 2. 听力原文复现 问题16 问题17 问题18 3. 听力原文重点词汇 问题16 问题17 问题18 2. 听力原文复现 问题16 What does the speaker say about most American hospitals&#xff1f; visit brief useless Dont challenge with the authority unle…

HEVC熵编码核心点介绍

熵编码基本原理 消息与信息 把客观物质运动和主观思维的活动状态表达出来就成为了消息&#xff1b;消息中包含信息&#xff0c;是信息的载体&#xff1b;因此&#xff0c;信息与消息既有区别又有联系的&#xff1b; 获取信息的过程就是一个消除或部分消除不确定性的过程&…

Linux网络基础-4

在之前的网络基础博客中&#xff0c;我们对网络进行了概要解释&#xff0c;了解了应用层和传输层的知名协议。接下来我们来对网络层的典型协议进行解析。 目录 1.网络层协议 2.IP协议 2.1协议格式 2.2地址管理 2.3特殊网络 2.3.1私网的组建 2.3.2特殊IP地址 2.4路由选…

ACP(MaxCompute篇)-Tunnel上传下载数据

概述 相关命令 odpscmd里面包含了tunnel test11_123>tunnel help; Usage: tunnel <subcommand> [options] [args] Type tunnel help <subcommand> for help on a specific subcommand.Available subcommands:upload (u)download (d)resume (r)show (s)purge …

探索SpringBoot 3.1的惊艳新特性

一、介绍 1.1 新特性概述 经过半年的沉淀 Spring Boot 3.1于2023年5月18日正式发布了&#xff0c;带来了许多令人兴奋的新特性和改进。本篇博客将详细介绍Spring Boot 3.1的新特性、升级说明以及核心功能的改进。 同时&#xff0c;2.6.x 版本线已经停止维护了&#xff0c;最新…

《消息队列高手课》课程笔记(二)

消息模型&#xff1a;主题和队列有什么区别&#xff1f; 两类消息模型 早期的消息队列&#xff0c;就是按照“队列”的数据结构来设计的。 生产者&#xff08;Producer&#xff09;发消息就是入队操作&#xff0c;消费者&#xff08;Consumer&#xff09;收消息就是出队也就是…

数字逻辑习题

第一次作业 第二次作业 第三次作业 卡诺图最小项 计算模数M考察74LS161的特点 计数器数据选择器 在A和C加上非门即可 求计数器的模数M 该计数器是环形计数器&#xff08;循环右移&#xff09;&#xff0c;模数根据初始状态而定 由n个移位寄存器构成的环形计数器最大可能模值为n…

韩流在元宇宙中崛起,感受韩国文化的魅力!

大获成功&#xff01;第一波 K-verse 土地全部售罄&#xff01; 多家领先韩国文化公司&#xff0c;包括 SMBM、CUBE 娱乐、LINE Studio、Gravity、乐天世界、K League 等进驻 The Sandbox&#xff0c;并在第一波 K-verse 土地销售活动上发布了邻近这些公司的 LAND。 所有土地全…

哈希表(散列表)详解

&#x1f495;**今天的每一秒都是珍贵的&#xff0c;因为它永远不会再次出现。**&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f386; &#x1f697;本文章主要内容&#xff1a;深入理解哈希表&#…