侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

shell 日常需要运维脚本

Wake
2022-10-09 / 0 评论 / 5 点赞 / 985 阅读 / 2,429 字

1.高亮显示函数:

function debug(){
    body="cakin say hi~"
    echo -e "\e[1;31m ${body} \e[1;0m"
}
debug

2.ubuntu 批量安装服务脚本

#!/bin/bash
Install_ubuntu() {
    sudo systemctl status cwp  >/dev/null
    if [ $? == 0 ];then
        echo "service is installed"
        return 0
    fi
    sudo apt install auditd lsb-release unzip > /dev/null 2>&1    ##install the prerequisite packages
    if [ $? == 0 ];then
        echo -e "\033[32m ####### auditd lsb-release unzip installed ####### \033[0m "
    else
        echo -e "\033[31m ####### auditd lsb-release unzip install ERROR ####### \033[0m"
    fi
    wget  https://atomintl-cwp.s3.ap-southeast-1.amazonaws.com/cwp.zip  > /dev/null 2>&1               ##download zip package canary_forwarder
    if [ $? != 0 ];then
        echo -e "\033[31m ####### please check url of file ####### \033[0m"
        return 0
    else
        echo -e "\033[32m ####### package download success####### \033[0m"
    fi
    sudo unzip -o  cwp.zip       ##unzip
    sudo mkdir -p /opt/redcanary
    if [ -d /opt/redcanary ];then
        echo -e "\033[32m ####### redcanary directories created success ####### \033[0m"
    else
        echo -e "\033[31m ####### redcanary directories created fail ####### \033[0m"
    fi
    sudo cp ./config.json /opt/redcanary/config.json
    if [ -f /opt/redcanary/config.json ];then
        echo -e "\033[32m ####### configfile copy success ####### \033[0m"
    else
        echo -e "\033[31m ####### configfile copy fail ####### \033[0m"
        return 0
    fi
    sudo dpkg -i cwp_1.4.10_amd64.deb
    if [ $? == 0 ];then
        echo -e "\033[32m ####### canary_forwarder installed ####### \033[0m"
    else
        echo -e "\033[31m ####### install error ####### \033[0m"
        return 0
    fi
    sudo systemctl status cwp >/dev/null        ##查看服务状态
    if [ $? == 0 ];then
        echo -e "\033[32m ####### success install canary forwarder ####### \033[0m"
    fi
}


SYSINFO=`cat /etc/issue |awk '{print $1}'`
case "$SYSINFO" in
        Ubuntu)
                Install_ubuntu
                ;;
        Debian)
                Install_ubuntu
                exit;
esac
#if [ $? == 0 ]
#then
#    install_ubuntu

3.shell脚本的列表 for循环

pod_list=(ubuntu centos)

function stop_pod(){
    for pod in ${pod_list[@]}
    do
    kubectl scale deploy $pod --replicas=1
    kubectl get deploy $pod
stop_pod

4.列出linux服务器文件大小前10非系统文件的shell脚本

#!/bin/bash
find / -type f -not -path "/proc/*" -not -path "/sys/*" -exec du -Sh {} + | sort -rh | head -n 10

5.将一个shell脚本复制到当前目录的第一层子目录下

#!/bin/bash
find . -mindepth 1 -maxdepth 1 -type d -print0 | while read -d $'\0' dir; do
  cp /path/to/deploy.sh "$dir"
done

这个脚本将/path/to/deploy.sh文件复制到当前目录下深度为1的子目录中。find命令用于查找当前目录及其所有子目录中深度为1的目录,-mindepth 1 和 -maxdepth 1 选项分别限制了查找的最小和最大深度, -type d 则指明只查找目录,-print0选项则以 NULL (\0) 分隔符来输出目录路径,以避免处理包含空格或其他特殊字符的目录名称时的问题。while循环用于读取find命令的输出,并将deploy.sh文件复制到每个目录中。

6.根据PID过滤进程所有信息

#! /bin/bash
# Function: 根据用户输入的PID,过滤出该PID所有的信息
read -p "请输入要查询的PID: " P
n=`ps -aux| awk '$2~/^'$P'$/{print $11}'|wc -l`
if [ $n -eq 0 ];then
 echo "该PID不存在!!"
 exit
fi
echo "--------------------------------"
echo "进程PID: $P"
echo "进程命令:`ps -aux| awk '$2~/^'$P'$/{print $11}'`"
echo "进程所属用户: `ps -aux| awk '$2~/^'$P'$/{print $1}'`"
echo "CPU占用率:`ps -aux| awk '$2~/^'$P'$/{print $3}'`%"
echo "内存占用率:`ps -aux| awk '$2~/^'$P'$/{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux| awk '$2~/^'$P'$/{print $9}'`"
echo "进程运行的时间:`ps -aux| awk '$2~/^'$P'$/{print $10}'`"
echo "进程状态:`ps -aux| awk '$2~/^'$P'$/{print $8}'`"
echo "进程虚拟内存:`ps -aux| awk '$2~/^'$P'$/{print $5}'`"
echo "进程共享内存:`ps -aux| awk '$2~/^'$P'$/{print $6}'`"
echo "--------------------------------"

效果展示:
image-1691136465283

7.根据进程名过滤进程信息

#! /bin/bash
# Function: 根据输入的程序的名字过滤出所对应的PID,并显示出详细信息,如果有几个PID,则全部显示
read -p "请输入要查询的进程名:" NAME
N=`ps -aux | grep $NAME | grep -v grep | wc -l` ##统计进程总数
if [ $N -le 0 ];then
  echo "该进程名没有运行!"
fi
i=1
while [ $N -gt 0 ]
do
  echo "进程PID: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $2}'`"
  echo "进程命令:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
  echo "进程所属用户: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $1}'`"
  echo "CPU占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $3}'`%"
  echo "内存占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $4}'`%"
  echo "进程开始运行的时刻:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $9}'`"
  echo "进程运行的时间:` ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
  echo "进程状态:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $8}'`"
  echo "进程虚拟内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $5}'`"
  echo "进程共享内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $6}'`"
  echo "***************************************************************"
  let N-- i++
done

效果展示:
image-1691136593167

8.根据用户名查询该用户的相关信息

#! /bin/bash
# Function:根据用户名查询该用户的所有信息
read -p "请输入要查询的用户名:" A
echo "------------------------------"
n=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l`
if [ $n -eq 0 ];then
echo "该用户不存在"
echo "------------------------------"
else
  echo "该用户的用户名:$A"
  echo "该用户的UID:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'`"
  echo "该用户的组为:`id $A | awk {'print $3'}`"
  echo "该用户的GID为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'`"
  echo "该用户的家目录为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'`"
  Login=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'`
  if [ $Login == "/bin/bash" ];then
  echo "该用户有登录系统的权限!!"
  echo "------------------------------"
  elif [ $Login == "/sbin/nologin" ];then
  echo "该用户没有登录系统的权限!!"
  echo "------------------------------"
  fi
fi

效果图展示:
image-1691136688035

9.批量删除docker 镜像中带有某个仓库名的镜像

如果您有多个镜像需要删除,可以使用循环或脚本来批量删除。

例如,如果您要删除仓库地址为 xxxxxxxxxx.dkr.ecr.xxxxxxxxx.amazonaws.com 的所有镜像,可以运行以下命令:

docker images | grep "xxxxxxxxxx.dkr.ecr.xxxxxxxxx.amazonaws.com" | awk '{print $1 ":" $2}' | xargs docker rmi

这个命令会列出所有符合条件的镜像,并使用 docker rmi 命令逐个删除。

10.在规定的时间里面执行命令,如果不满足条件则等待到满足的条件执行

#!/bin/bash

# 定义需要重启Nginx的分钟数
restart_minutes=("05" "35" "45" "55")

# 循环判断当前系统时间是否在需要重启的分钟数列表中
while true; do
    # 获取当前分钟数
    current_minute=$(date +%M)

    # 判断当前分钟数是否在需要重启的分钟数列表中
    if [[ " ${restart_minutes[@]} " =~ " ${current_minute} " ]]; then
        echo "Restarting Nginx..."
        # 在此处添加重启Nginx的命令,例如:
        # systemctl restart nginx
        break
    fi

    # 等待30秒后再次检查
    sleep 30
done

echo "Exiting the script."
#!/bin/bash

# 定义需要重启Nginx的时间段
restart_time_ranges=("05-07" "35-37" "45-47" "55-57")

# 标记是否满足重启条件的变量
is_restart_required=false

# 循环检查当前时间是否在需要重启的时间段内
while true; do
  # 获取当前分钟数
  current_minute=$(date +%M)

  for time_range in "${restart_time_ranges[@]}"; do
    # 获取时间段的开始和结束分钟数
    start_minute=$(echo "$time_range" | cut -d'-' -f1)
    end_minute=$(echo "$time_range" | cut -d'-' -f2)

    # 判断当前分钟数是否在时间段内
    if ((current_minute >= start_minute && current_minute <= end_minute)); then
      is_restart_required=true
      break 2
    fi
  done

  # 等待1分钟后再次检查
  sleep 60
done

# 执行重启Nginx操作
echo "Restarting Nginx..."
# 在此处添加重启Nginx的命令,例如:
# systemctl restart nginx

echo "Exiting the script."

在日常工作中可能会碰到有些项目在更新了代码后要等到每个小时规定的某些时间段才能更新的情况,这时候可以用jenkins调用这个脚本来等待规定的时间然后完成服务的重启更新。

11.cmatrix命令

这个很酷!《黑客帝国》那种矩阵风格的动画效果。
安装

sudo apt-get install cmatrix

运行

cmatrix

要关闭效果,按ctrl+c 结束。
image-1710746479729

12.如何替换某个路径下所有子目录文件的信息

find /home/ubuntu -type f -exec sed -i 's/192.168.1.1/192.168.2.1/g' {} +

这里是使用 find 命令结合 sed 来在指定目录及其子目录中进行替换操作。这个命令会在指定目录下及其子目录中的所有文件中查找并替换匹配的文本。

5

评论区