shell 100例

1、每天写一个文件

(题目要求)
·请按照这样的日期格式(xxxx-xx-xx每日生成一个文件
·例如生成的文件为2017-12-20.log,并且把磁盘的使用情况写到到这个文件中·不用考虑cron,仅仅写脚本即可
[核心要点]
date命令用法
df命令

知识补充:date
在这里插入图片描述

#!/bin/bash 
date=`date +%F`
dir=/root/shell/disklog
if [ ! -d $dir ]
then mkdir -p  $dir 
fidf -h > $dir/$date.logfind $dir/ -mtime +365 |xargs rm -rf

2、根据日志统计访问量

2409:8c5b:ffff:2802::12|18/Sep/2023:14:54:58 +0800]|GET /StorageWeb/servlet/GetFileByURLServlet?dm=D950&root=/mnt/wfs210&pt=/db0/3c&fileid=L0db03c39ca7fe50189f50b7c5fdefbf59.m4a&type=3&ui=MTAwcG41ak4xMzg4&ci=0a0LLEGN1559034202309151704013v4&cn=15717012094+2023-09-...&ct=2&time=1695020117&exp=86400&code=C8C83177ED3323F4868218945448B338B844839D2A270E2B718187A6538AB607&ec=1&bucketName=hcy-dg-21 HTTP/1.1|0.137|200|507533|-|migu/mCloud10.2.1 (Linux;Android 8.0.0) ExoPlayerLib/2.11.4
2409:8c5b:ffff:2802::12|18/Sep/2023:14:55:00 +0800]|GET /StorageWeb/servlet/GetFileByURLServlet?dm=D950&root=/mnt/wfs210&pt=/cc6/65&fileid=L2cc665e6961e4596c9db5cedf98ab1e4b.m4a&type=3&ui=MTAwcG41ak4xMzg4&ci=0a0LLEGN1559070202309151703581do&cn=18296193091+2023-09-...&ct=2&time=1695020117&exp=86400&code=5B417BF97BF91525AF08146323BB065D05559AE2FA68C645CD115BDC33CBCF4B&ec=1&bucketName=hcy-dg-21 HTTP/1.1|0.090|200|1154259|-|migu/mCloud10.2.1 (Linux;Android 8.0.0) ExoPlayerLib/2.11.4
10.19.2.55|18/Sep/2023:14:55:19 +0800]|GET /StorageWeb/servlet/GetFileByURLServlet?dm=D953&root=/mnt/wfs203&pt=/7fd/24&fileid=LB7fd2451f123d64eb80416987e3a1e5b7.mp3&type=3&ui=MDEwSFVwNFIxNzU5&ci=010HUp4R175914520220323113403bai&cn=%E9%83%91%E4%B8%AD%E5%9F%BA+-+%E6%A2%A6%E9%86%92%E6%97%B6%E5%88%86&ct=2&time=1695009524&exp=86400&code=AF1B6990923437217D271AA102149FDF6EC9C58F56C057F7FB61FB77C6C4E317&ec=1 HTTP/1.1|0.049|206|1|-|mCloud_iPhone/09051207 CFNetwork/1390 Darwin/22.0.0

统计出每个IP访问量有多少

核心要点
awk、sort、uniq命令

sudo cat /usr/local/c3ms/logs/access.log | awk -F "|" '{print $1}'  | sort | uniq -c | sort -n -r | more 

在这里插入图片描述

3、统计所有进程占内存之和

题目要求
写一个脚本计算一下linux系统所有进程占用内存大小的和。

核心要点

ps命令用法
for循环
加法运算

在这里插入图片描述

#!/bin/bash 
sum=0 
for n in `ps -aux | grep -v COMMAND | awk '{print $6}'`
dosum=$[$sum + $n]
done echo $sum

4、检查机器存活

设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,并将主机是否通的信息打印到前台信息

#!/bin/bash 
IP=$1
n=`ping -c2 $IP | grep "packets" | awk -F '%' '{print $1}' | awk '{print $NF}'`
if [ $n -ge 50 ];then echo "该主机死机"
elseecho "该主机通"
fi

5、批量修改文件名称

  • 1、找到/123目录下所有后缀名为.txt的文件1.批量修改txt为.txt.bak
  • 2、把所有bak文件打包压缩为123.tar.gz3.批量还原文件的名字,即把增加的.bak再删除
  • [核心要点]
    find用来查找所有.txt文件
    tar打包一堆文件
    还原文件名用for循环
#!/bin/bash 
#第一种写法
find /123 -type f -name  "*.txt" > /123/txt.list for f in `cat /123/txt.list`
domv $f $f.bak
done #第二种写法
#find /123 -type f -name "*.txt"  | xargs -i mv {} {}.bak
#find /123 -type f -name "*.txt" -exec mv {} {}.bak \;for f in `cat /123/txt.list`
do echo $f.bak 
done > /123/txt.bak.listtar -czvf 123.tar.gz `cat /123/txt.bak.list | xargs `

6、检查本地的80端口是否开启

题目要求:
写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

核心要点:
检测80端口使用nmap-p 80 127.0.0.1或者netstat -ntplgrep -w 80
重启httpd服务的命令要知道 systemctl restart httpd

利用死循环

#!/bin/bash m=10288226404@qq.com
while :
don=`netstat -ntulp | grep ":80 " | wc -l`if [ $n -eq 0 ]then systemctl restart nginx # python main.py $m "80端口关闭,已经将nginx进行重启操作" fisleep 20
done

7 、 数据库备份

*题目要求

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝份,本地保存一周的数据,远程保存一个月。假定,我们知道mysqlroot账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql,远程服务器ip为192.168.123.30,远程提供了一个rsync服务,备份的地址是192168.123.30:backup.写完脚本后,需要加入到cron中,每天凌晨3点执行。

  • 核心要点
    备份数据库的命令
    同步到远程去的命令
    命名规则
#!/bin/bash 
d1=`date +%w`
d2=`date +%d`loca_bakdir=/bak/mysgl
remote_bakdir=192.168.123.30::backupexec 1> /tmp/mysglbak.log 2>/tmp/mysglbak.err
echo"mysql bakcup begin at `date`"
mysqldump -uroot -pxxxx discz > $local bakdir/discuz.sql.$d1
rsync -az $local_bakdir/discuz.sql.$dl $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at `date`"

8、检查502状态码

  • 背景
    服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的借误状态码。由于502只是暂时的,并且只要一重启php-fpm服务则502消失但不重启的话,则会一直持续很长时间。所以有必要写一个监控脚本,监控访问日志的状态码,旦发生502,则自动重启一下php-fpm。
    我们设定:
  1. access log /data/log/access.log
  2. 脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右
  3. 重启php-fpm的方法是 /etc/init.d/php-fpm restart
  • 技术核心
    使用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率,
    重启php-fpm服务的命令。
#!/bin/bash 
log=/data/log/access.log
while :
do
502_n=`tail -n 300 $log | grep -c '502/'`
if [ -z "$502_n" ]
then exit 
fi if [ "$502_n" -gt 100  ]
then /etc/init.d/php.fpm > /dev/null 2>/tmp/php.fpm.errfpm_p_n=`pgrep -l php.fpm | wc -l `if [ $fpm_p_n -eq 0 ]then python main.py xxx@xx.com "php.fpm重启失败 " "head -10 /tmp/php.fpm.err"exit fi
fi
sleep 10
done

9、删除文件中包含字母的行

  • 背景:
    把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
  • 技术要求
    使用sed
#!/bin/bash 
sed -n '1,5p'  /opt/shell/9.txt | sed '/[a-zA-Z]/d' 
sed '1,5d' /opt/shell/9.txt | sed '1,5s/[a-zA-Z]/g'

10、找单词

  • 题目要求
    用shell打印下面这句话中字母数小于6的单词。
    Bash also interprets a number of multi-character options.

  • [核心要点]
    for循环遍历所有单词 wc-l 获取字符串长度

for w in Bash also interprets a number of multi-character options. ; do echo $w ;done
echo Bash also interprets a number of multi-character options. | awk -F '[ +-.]' '{print NF}'
#!/bin/bash
c="Bash also interprets a number of multi-character options."
n=`echo $c | awk -F '[ +-.]' '{print NF}'`
for ((i=l;i<$n;i++))
dol=`echo $c | awk -F '[ +-.]' -v j=$i '{print $j}'| wc -L`if [ $l -lt 6 ]thenecho $c | awk -F '[ +-.]' -v j=$i '{print $j}'fi
done

11、输入数字运行命令

  • [题目要求]
    写一个脚本实现如下功能:
    输入一个数字,然后运行对应的一个命令显示命令如下:
    cmd meau* 1 - date 2 - ls 3 - who 4 - pwd当输入1时,会运行date,输入2时运行ls,以此类推
  • [核心要点]
    case判断
#/bin/bash 
echo "*cmd meau** 1 - date 2 - ls 3 - who 4 - pwd"
read -p  "Please input a number: " n 
if [ -z "$n" ]
then echo "请输入一个1-4的数字"
fi
n1=`echo $n | sed 's/[0-9]//g'`
if [ -n $n1 ]
then echo "请输入一个纯数字,范围1-4"
fi case $n in 1) date ;;2) ls ;;3)who;;4)pwd;;*) echo "请输入一个纯数字,范围1-4";;
esac

12、批量创建用户

用shell脚本实现如下需求:

添加user_00 – user_09 10个用户,并且给他们设置一个随机密码,密码要求10位包含大小写字母以及数字,注意需要把每个用户的密码记录到一个日志文件里。

提示:

  1. 随机密码使用命令 mkpasswd
  2. 在脚本中给用户设置密码,可以使用echo 然后管道passwd命令
  • 核心要点
  • seq实现数字递增
  • mkpasswd产生随机字符

1、 安装mkpasswd命令

yum -y install  expect-5.45-14.el7_1.x86_64

设置10个随机数字

mkpasswd -l 10 -s 0
#!/bin/bash
for i in `seq -w 00 09`
douseradd user_$ip=`mkpasswd -l 10 -s 0 `echo "user_$i $p" >> /tmp/pass.tmpecho $p |passwd --stdin user_$i
done

13、监控apache

题目要求

在服务器上,写一个监控脚本,要求如下:

  1. 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
  2. 若没有正常启动还需再一次启动,最大不成功数超过5次则需要立即发邮件通知管理员,并且以后不需要再检测!
  3. 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前使用的mail.py

核心要点

  • pgrep -l httpd或者ps -C httpd --no-heading检查进程
  • for循环5次计数器

101 自动屏蔽攻击IP:增强您的服务器安全性的有效策略

在当今的数字世界中,服务器安全性成为了每个企业或个人都必须面对的重要议题。特别是当面对如DoS(拒绝服务)攻击等网络威胁时,一个有效的防范措施显得尤为关键。本文将探讨如何通过自动屏蔽攻击IP来增强您的服务器抵御DoS攻击的能力,并提供一个实用的Bash脚本作为参考。

理解DoS攻击

DoS攻击是一种恶意行为,通过向目标服务器发送大量无用的请求,耗尽其资源,使合法用户无法访问服务。这种攻击不仅影响服务器的正常运行,还可能导致数据丢失、系统崩溃等严重后果。

自动屏蔽攻击IP的策略

为了有效应对DoS攻击,我们需要一个能够实时监控服务器流量,并自动识别和屏蔽攻击IP的系统。以下是实现这一目标的基本步骤:

1、监控服务器日志:通过分析Nginx等服务器的访问日志,我们可以识别出异常流量模式,如短时间内来自同一IP的大量请求。

2、识别攻击IP:使用脚本或工具对日志数据进行处理,提取出那些行为异常的IP地址。

3、自动屏蔽:一旦发现攻击IP,立即使用iptables等防火墙工具将其加入黑名单,阻止其进一步的访问。

4、记录和报告:将屏蔽的IP地址和时间记录在日志文件中,以便后续分析和报告。

#!/bin/bash  # 定义日志文件路径和临时黑名单文件路径  
LOG_FILE=/usr/local/nginx/logs/demo2.access.log  
BLACKLIST_FILE=/tmp/blacklist.txt  
DROP_LOG=/tmp/drop_ip.log  # 获取当前时间并格式化为日期  
DATE=$(date +"%d/%b/%Y:%H:%M")  # 从日志文件中提取异常IP地址(这里假设每分钟超过10个请求的IP为异常)  
tail -n 5000 $LOG_FILE | grep "$DATE" | awk '{print $1, $4}' | sort -n | uniq -c | awk '$1 > 10 {print $2}' > $BLACKLIST_FILE  # 读取黑名单文件,并屏蔽这些IP地址  
while IFS= read -r IP; do  if ! iptables -vnL INPUT | grep -q "$IP"; then  iptables -I INPUT -s "$IP" -j DROP  echo "$(date +'%F_%T') $IP" >> $DROP_LOG  echo "Blocked IP: $IP"  fi  
done < $BLACKLIST_FILE  # (可选)清理过时的iptables规则,避免规则过多导致性能下降  
# 这里可以根据需要添加逻辑来定期清理旧的屏蔽规则

脚本说明

脚本首先定义了所需的文件路径和日期格式。

使用tail和grep命令结合当前时间从Nginx访问日志中提取最近的访问记录。

通过awk和sort命令处理这些记录,识别出每分钟请求次数超过10次的IP地址,并将它们写入临时黑名单文件。

脚本接着读取黑名单文件中的每个IP地址,并使用iptables命令将它们加入INPUT链的DROP目标中,从而屏蔽这些IP的访问。同时,将屏蔽操作记录在日志文件中。

最后,您可以根据需要添加额外的逻辑来定期清理iptables中的旧规则,以保持防火墙的性能。

请注意,此脚本是一个基本示例,可能需要根据您的服务器配置、日志格式和安全策略进行定制。在实际使用中,还应考虑脚本的性能影响、错误处理和日志管理等方面的问题。

脚本2:

#!/bin/bash  log=/data/nginx/access.log  #
function add_iptables()   
{  while read line  do  ip=$(echo $line | awk '{print $2}')  count=$(echo $line | awk '{print $1}')  rule_count=$(iptables -L -n | grep "$ip" | wc -l)  if [ $count -gt 100 ] && [ $rule_count -eq 0 ]; then  iptables -I INPUT -s $ip -j DROP  echo "$ip is dropped" >> /tmp/droplist.log   fi  done < $log   
}  function main()  
{  add_iptables  
}  main  

脚本3:

#!/bin/bash ################################################################################ ####
#根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁 ################################################################################ ####
logfile=/data/log/access.log
#显示一分钟前的小时和分钟
d1=`date -d "-1 minute" +%H%M`
d2=`date +%M`
ipt=/sbin/iptables
ips=/tmp/ips.txt
block()
{
#将一分钟前的日志全部过滤出来并提取IP以及统计访问次数
grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips #利用for循环将次数超过100的IP依次遍历出来并予以封禁
for i in `awk '$1>100 {print $2}' $ips`
do$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECTecho "`date +%F-%T` $i" >> /tmp/badip.logdone
}
unblock()
{ #将封禁后所产生的pkts数量小于10的IP依次遍历予以解封for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print
$1}'|sort -nr`do$ipt -D INPUT $adone$ipt -Z
}
#当时间在00分以及30分时执行解封函数
if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]
then #要先解再封,因为刚刚封禁时产生的pkts数量很少 unblock
block
else
block
fi

101 监控网站的URL

#!/bin/bash  
URL_LIST="www.baidu.com www.ctnrs.com www.der-matech.net.cn www.der-matech.com.cn www.der-matech.cn www.der-matech.top www.der-matech.org"  for URL in $URL_LIST; do  FAIL_COUNT=0  for ((i=1;i<=3;i++)); do  curl -s --head http://$URL > /dev/null  HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}\n" http://$URL)  if [ $HTTP_CODE -eq 200 ]; then  echo "$URL OK"  break  else  echo "$URL retry $FAIL_COUNT"  let FAIL_COUNT++  fi  done  if [ $FAIL_COUNT -eq 3 ]; then  echo "Warning: $URL Access failure!"  echo "网站$URL坏掉,请及时处理" | mail -s "$URL网站高危" 1242253055@qq.com  fi  
done

102 利用sshpass远程登陆主机,并执行命令

#/bin/bash
if [ -z $1 ]; thenecho "usage: $0 command"exit 1
fi
HOST_LIST_FILE=host_list.txt # 这个修改$1COMMAND=$@ ## 这个修改$2
for IP in $(awk '/^[^#]/{print $1}' $HOST_LIST_FILE); do USER=$(awk -v I=$IP 'I==$1{print $2}' $HOST_LIST_FILE)PASS=$(awk -v I=$IP 'I==$1{print $3}' $HOST_LIST_FILE)PORT=$(awk -v I=$IP 'I==$1{print $4}' $HOST_LIST_FILE)echo "-----$IP------"sshpass -p "$PASS" ssh -p "$PORT" "$USER@$IP" "$COMMAND" 
done## 核心关键sshpass命令安装
# 源码包安装wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz tar xvzf sshpass-1.05.tar.gz cd sshpass-1.05.tar.gz ./configure make make install # yum安装
yum  -y install sshpass

1、脚本闭坑注意事项
第一次登陆,需要手动输入密码,保证对方服务,有认证秘钥
如果是修改密码,需要对过期的秘钥内容进行删除,重新手动输入
在这里插入图片描述
2、脚本执行效果
在这里插入图片描述

103 你的网站守护神脚本,通过测试URL并返回码

#!/bin/bash  
URL_LIST="www.baidu.com www.ctnrs.com www.der-matech.net.cn www.der-matech.com.cn www.der-matech.cn www.der-matech.top www.der-matech.org"  for URL in $URL_LIST; do  FAIL_COUNT=0  for ((i=1;i<=3;i++)); do  curl -s --head http://$URL > /dev/null  HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}\n" http://$URL)  if [ $HTTP_CODE -eq 200 ]; then  echo "$URL OK"  break  else  echo "$URL retry $FAIL_COUNT"  let FAIL_COUNT++  fi  done  if [ $FAIL_COUNT -eq 3 ]; then  echo "Warning: $URL Access failure!"  echo "网站$URL坏掉,请及时处理" | mail -s "$URL网站高危" 1242253055@qq.com  fi  
done

首先,它定义了一个包含多个网站URL的列表。然后,对每个URL进行循环检测。对于每个网站,脚本会尝试连接并获取HTTP状态码。如果状态码为200,表示网站正常,脚本会打印出“$URL OK”并继续检测下一个网站。如果状态码不是200,则表示网站可能存在问题,脚本会进行重试,并记录失败次数。如果连续三次尝试都失败,那么脚本会发送一封警告邮件,通知你网站可能存在问题

104 使用shell脚本批量清理kubernetes集群中Evicted状态的pod

测试环境有一台宿主机出现了异常,大量的异常日志导致宿主机的磁盘使用率超过了85%,触发了上面的pod驱离策略,该宿主机上的的pod处于Evicted状态。在清理了磁盘之后,得手动处理掉这些Evicted状态的pod。

查看了下该状态的pod数目有50+,一条条的删除到猴年马月,写个shell脚本批量处理下。

#!/bin/bash## 获取当前状态为Evicted的pod
## 并输出到一个临时文件内## 这是输出的文件按制表符tab键间隔
#kubectl get pods --all-namespaces | awk '/Evicted/ {print $1 "\t" $2}'  > evicted_pods.txt## 这是输出的文件按空格符间隔
kubectl get pods --all-namespaces | awk '/Evicted/ {print $1 " " $2}'  > evicted_pods.txt## 这是按空格示例,截取文本解析成字段:命名空间和pod名
while IFS=' ' read -r namespace pod_name; do## 这是按制表符tab键示例,截取文本解析成字段
#while IFS=$'\t' read -r namespace pod_name; do## 验证命名空间和 Pod 名称是否存在if [[ ! -z "$namespace" && ! -z "$pod_name" ]]; thenecho "kubectl delete pod $pod_name -n $namespace:"kubectl delete pod "$pod_name" -n "$namespace"fi
done < evicted_pods.txt## 可选是否清理临时文件
rm -f evicted_pods.txt

105、nginx日志分割

#!/bin/bash# 源日志目录
logs_path="/var/log/nginx"# 备份日志目录
back_logs_path="${logs_path}/$(date -d 'yesterday' +'%F')"# 创建备份目录,以日期命名,注意,每天零点整切割,开始记录新的一天的日志,备份目录应该是昨天
mkdir -p ${back_logs_path}# 重命名旧日志名,注意日期
cd ${logs_path} && find . -type f |xargs -i mv {} {}.$(date -d 'yesterday'  +'%F') # 移动旧日志文件到该目录下
cd ${logs_path} && find . -type f  |xargs -i mv {}   ${back_logs_path}# 重新生成新日志
kill -USR1 `cat /var/run/nginx.pid`

106、k8s查看deployment的对应版本号

因版本发布,总是需要查看对应的版本号;编写脚本,只需要在脚本后面添加对应的deployment名称,输出对应的deployment名称和镜像版本。只需将结果发生给开发即可,开发根据进行版本进行ci的构建

 #!/bin/bashfor deployment_name in "$@"
doimage_version=$( sudo kubectl get deployment $deployment_name -n prod -o=jsonpath='{.spec.template.spec.containers[*].image}' | awk -F '/' '{print $NF}')echo " $deployment_name   $image_version"
done
#!/bin/bash"""
逐个处理传入的部署名称,获取它们的镜像版本,并打印出来。
参数:@ - 传入的所有参数,预期为部署的名称。
返回值:无
"""for deployment_name in "$@"
do# 获取指定部署的镜像版本,-o输出格式是jsonimage_version=$( sudo kubectl get deployment $deployment_name -n prod -o=jsonpath='{.spec.template.spec.containers[*].image}' | awk -F '/' '{print $NF}')# 打印部署名称和对应的镜像版本echo "Deployment: $deployment_name - Image Version: $image_version"
done
  • 使用while循环
## 命令1:
echo "deploymnt名称1  deployment名称2" | tr ' ' '\n' | while read -r deployment_name; do image_version=$(sudo kubectl get deployment $deployment_name -n prod -o=jsonpath='{.spec.template.spec.containers[*].image}' | awk -F '/' '{print $NF}'); echo "$deployment_name   $deployment_name:$image_version"; done## 命令2:
echo "deploymnt名称1  deployment名称2" | tr ' ' '\n' | while read -r deployment_name; do image_version=$(sudo kubectl get deployment $deployment_name -n prod -o=jsonpath='{.spec.template.spec.containers[*].image}' | awk -F '/' '{print $NF}'); printf "%-20s %s\n" "$deployment_name" "$deployment_name:$image_version"; done
  • 脚本解析
# 该脚本段用于列出指定命名空间中特定部署的名称及其对应的镜像版本号。
# 它首先通过管道传递一个包含多个部署名称的字符串,然后对每个部署名称进行处理,
# 获取对应的镜像版本号,并以部署名称和版本号的形式打印出来。echo "album-saas-mq yun-album-migration album-saas-manage album-saas-job" | tr ' ' '\n' | while read -r deployment_name; do# 获取指定部署的镜像版本号image_version=$(sudo kubectl get deployment $deployment_name -n prod -o=jsonpath='{.spec.template.spec.containers[*].image}' | awk -F '/' '{print $NF}')# 打印部署名称和对应的镜像版本号printf "%-20s %s\n" "$deployment_name" "$deployment_name:$image_version"
done

107 k8s批量执行驱赶node节点

for IP in "$@"
do node_name=$(sudo kubectl  get node  -o wide  | awk 'NR >2 {print $1" " $6}' | grep $IP | awk '{print $1}')kubectl  get pod  -A | grep $node_name kubectl drain $node_name --ignore-daemonsetsecho " $IP is SchedulingDisabled"
done

执行脚本: sh drain-node.sh 192.168.1.202 192.168.1.203 192.168.1.204 ## 输入主机列表,自动将node进行驱赶

108 批量执行多个IP和端口的网络联通性测试

#!/bin/bash# 检查输入参数
if [ $# -ne 1 ]; thenecho "Usage: $0 <input_file>"exit 1
fiinput_file=$1# 检查输入文件是否存在
if [ ! -f $input_file ]; thenecho "Input file not found"exit 1
fi# 遍历输入文件中的每行
while IFS= read -r line; doip=$(echo $line | awk '{print $1}')port=$(echo $line | awk '{print $2}')# 使用 sudo traceroute 测试网络连通性echo -n "Testing $ip:$port... "result=$(sudo traceroute -n -T $ip -p $port 2>&1)if [[ $result == *"Hops"* ]]; thenecho "网络可访问"elseecho "网络不可访问"fi
done < $input_file

脚本2:

#!/bin/bash# 定义要测试的 IP 地址和端口列表
read -p "请输入要测试的IP地址: " IP_LIST
read -p "请输入要测试的端口: " PORT_LIST
IP_LIST=($IP_LIST)
PORT_LIST=($PORT_LIST)# 循环遍历 IP 地址和端口列表
for ip in "${IP_LIST[@]}"
dofor port in "${PORT_LIST[@]}"doecho "Testing connectivity to $ip on port $port"sudo traceroute -n -T $ip -p $portecho "-----------------------------------------"done
done

109 磁盘空间大小和Inode大小监控

  • 1、磁盘空间大少
#!/bin/bash  
# 检查硬盘,如果剩余空间超过80%,则发送消息  
# Tue Aug  2 09:45:56 CST 2016  
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin  
export PATH  
for RemainingSpace in $(df -h | awk '{print $5}' | grep -v 'Use' | sed -e 's/[%]//g')  
do  if [[ $RemainingSpace > 80 ]];then  echo -e "$RemainingSpace"  echo -e "$(df -h | grep $RemainingSpace)" > /service/script/.HarddiskWarning  mail -s "disk Warning" wl < /service/script/.HarddiskWarning  fi  
done
#!/bin/bash
# 检查磁盘使用情况,如果超过80%则发送警报
THRESHOLD=80
df -h | awk -v threshold="$THRESHOLD" '{ if($5+0 > threshold) print $0; }' | while read output;
doecho "磁盘使用警报: $output"
done
#!/bin/bash
# 检查磁盘空间,如果根分区使用率超过80%,则发送警告邮件
THRESHOLD=80
EMAIL="admin@example.com"df -h | grep -q "/dev/root"
if [ $? -eq 0 ]; thenUSAGE=$(df -h | grep "/dev/root" | awk '{ print $5 }' | sed 's/%//g')if [ $USAGE -ge $THRESHOLD ]; thenecho "警告:根分区使用率已达 $USAGE%" | mail -s "磁盘空间警告" "$EMAIL"fi
fi
  • 3、INode大小监控
#!/bin/bash  
# 检查Inode:如果空闲的Inode少于200,则发送消息给wl  
# Tue Aug  2 10:21:29 CST 2016  
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin  
export PATH  
# 循环检查每个文件系统的空闲Inode数量  
for FreeInode in $(df -i | grep -v "Filesystem" | awk '{print $4}')  
do  # 如果空闲Inode少于200,则执行以下操作  if [[ $FreeInode < 200 ]];then  # 将包含空闲Inode数量少于200的文件系统信息写入文件  echo -e "$(df -i | grep "$FreeInode")" > /service/script/.FreeInode  # 发送警告邮件给wl,邮件内容为包含空闲Inode数量少于200的文件系统信息  mail -s "FreeInode Warning" wl < /service/script/.FreeInode  fi  
done

110 一键监控CPU,轻松应对性能瓶颈

#!/bin/bash  
#Inspect CPU  # 设置环境变量,确保脚本可以正确找到所需的命令  
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin  
export PATH  
TERM=linux  
export TERM  # 使用top命令获取CPU的空闲率,并去掉小数点及后面的数字,只保留整数部分  
CpuResult=$(top -bn 1 | grep "Cpu" | awk '{print $5}' | sed 's/\..*$//g')  # 判断CPU的空闲率是否低于20%,如果是,则执行以下操作  
if [[ $CpuResult < 20 ]];then  # 将警告信息写入文件  echo "CPU WARNING : $CpuResult" > /service/script/.cpu_in.txt  # 将top命令的输出追加到文件中,以便后续分析  top -bn 1 >> /service/script./cpu_in.txt  # 发送邮件警告  mail -s "Inspect CPU" wl < /service/script/.cpu_in.txt  
fi

111 一键监控多台服务器磁盘使用情况

#!/bin/bash  
# 设定磁盘使用率的最大阈值,默认为80%  
FSMAX="80"  
# 设定远程连接的用户名,这里为root  
remote_user='root'  
# 设定要监控的服务器IP地址列表,替换(IP地址列表)为实际的IP地址,多个IP之间用空格分隔  
remote_ip=(IP地址列表)   
# 初始化服务器IP地址的索引变量  
ip_num='0'  # 循环遍历服务器IP地址列表  
while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)"]  
do  # 初始化读取行数变量  read_num='1'  # 通过SSH远程连接到服务器,并执行df -h命令获取磁盘使用情况,结果重定向到临时文件  ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h > /tmp/diskcheck_tmp  # 使用grep, awk和sed命令解析磁盘使用情况,提取出各分区的使用率并去除百分号,结果重定向到另一个临时文件  grep '^/dev/*' /tmp/diskcheck_tmp | awk '{print $5}' | sed 's/\%//g' > /tmp/diskcheck_num_tmp  # 循环读取磁盘使用率,并进行判断  while [ "$read_num" -le $(wc -l < /tmp/diskcheck_num_tmp) ]  do  # 提取某一行的磁盘使用率  size=$(sed -n "$read_num"p /tmp/diskcheck_num_tmp)  # 判断磁盘使用率是否超过阈值  if [ "$size" -gt "$FSMAX" ]  then  # 如果超过阈值,则发送警报邮件(此处代码有误,稍后修正)  fi  # 提取对应的磁盘分区信息,并追加到邮件内容中(此处代码有误,稍后修正)  # ...(省略部分代码)  # 更新读取行数变量  read_num=$(expr $read_num + 1)  done  # 更新服务器IP地址的索引变量  ip_num=$(expr $ip_num + 1)  
done

112 端口探测脚本

#!/bin/bash  HOST=$1  
PORT="22 25 80 8080"  for PORT in $PORT; do  if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then  echo "$PORT open"  else  echo "$PORT close"  fi  
done

if echo &>/dev/null > /dev/tcp/ H O S T / HOST/ HOST/PORT; then … else … fi:使用Bash的内置TCP/IP功能尝试连接指定主机的端口。如果连接成功(即端口开放),则输出“PORTopen”,否则输出“PORT close”。

113 shell:将文件从当前服务器迁移到另一个服务器

#!/bin/bash
filename=$1
ip=192.168.1.202
passwd=1
expect <<EOF
spawn scp $filename root@$ip:/root
#expect "yes/no" {send "yes\n"} 
expect "password" {send "$passwd\n"}
expect eof
EOF

114 kubernetes中的yaml配置文件保持

#/bin/bash#
# K8S_YAML_SHELL_DIR:记录脚本和resources.txt存放位置,移动是需要修改其值
# 一键备份K8s集群YAML文件脚本
# resources.txt文件,编写需要备份资源
## 定时任务示例
# 0 0 */1 * * /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1
# 后台运行示例
# nohup /usr/bin/bash /a/k8s-yaml-all-bak/start.sh > /a/k8s-yaml-all-bak/yaml_bak.logs 2>&1 &# 当前时间
DATE=`date +%Y-%m-%d--%H-%M-%S`# 备份路径
K8S_YAML_BACKUP_DIR="/opt/k8s_yaml_bak"# 脚本存放目录
K8S_YAML_SHELL_DIR="/a/k8s-yaml-all-bak"if [ ! -d $K8S_YAML_BACKUP_DIR ];thenmkdir -p $K8S_YAML_BACKUP_DIR
fi# 获取备份资源
if [ -f ${K8S_YAML_SHELL_DIR}/resources.txt ];thenRESOURCES=`cat ${K8S_YAML_SHELL_DIR}/resources.txt`# 判断资源文件是否为空if [[ $RESOURCES == "" ]]; thenecho "${DATE} ${K8S_YAML_SHELL_DIR}/resources.txt 文件为空,请输入资源名称"exit 1fi
elseecho "resources.txt文件,不存在!"exit 1
fi# 每次备份单独创建一个家目录+时间
mkdir -p ${K8S_YAML_BACKUP_DIR}/k8s-${DATE}# 获取家目录
GET_HOME_DIR=`ls -l ${K8S_YAML_BACKUP_DIR} | tail -n 1 | awk '{print $9}'`echo "备份路径:$K8S_YAML_BACKUP_DIR/$GET_HOME_DIR"# 获取k8s名称空间
NAMESPACE=`kubectl get ns | awk '{print $1}' | tail -n +2`dump_yaml(){# 遍历NSfor NS in $NAMESPACE ;do# 创建NS备份目录mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}# 过滤NS(kube-public、kube-system)if [[ $NS != "kube-public" && $NS != "kube-system" && $NS != "default" && $NS != "velero" ]]; then# 遍历k8s资源for RESOURCE in $RESOURCES; do# 创建资源目录mkdir -p ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/${NS}/${RESOURCE}# 遍历对应资源名称for RESOURCE_NAME in $(kubectl get $RESOURCE -n $NS | awk '{print $1}' | tail -n +2);doDATE_YAML=`date +%Y-%m-%d--%H:%M:%S`echo "${DATE_YAML} 导出YAML: ${NS} ${RESOURCE} ${RESOURCE_NAME} "# 导出对应名称空间下对应资源的yamlkubectl get ${RESOURCE} ${RESOURCE_NAME} -n ${NS}  -o yaml > ${K8S_YAML_BACKUP_DIR}/${GET_HOME_DIR}/$NS/${RESOURCE}/${RESOURCE_NAME}.yamlecho ""donedonefidone
}del_yaml(){for DIR_NAME in $(find $K8S_YAML_BACKUP_DIR -type d  -mtime +7);doDATE_YAML=`date +%Y-%m-%d--%H:%M:%S`echo "${DATE_YAML} 删除:$DIR_NAME" > ${K8S_YAML_SHELL_DIR}/del-yaml.logsrm -rf $DIR_NAME  >> ${K8S_YAML_SHELL_DIR}/del-yaml.logsecho ""  >> ${K8S_YAML_SHELL_DIR}/del-yaml.logsdone
}dump_yaml
del_yaml

115 Shell脚本批量监控网站健康状态

#/bin/bash
check_url() { HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)if [ $HTTP_CODE -eq 200 ];thenecho "$URL  Access successful"continuefi}URL_LIST="
www.baidu.com 
www.qq.com 
https://hao.360.com
"for URL in $URL_LIST ; do check_url $URLcheck_url $URLcheck_url $URLecho "$URL Access failure!"
done

在这里插入图片描述

116、使用expect工具自动进行SSH连接,自动远程登陆,并发送命令

#!/bin/bash#!/bin/bash# 接收所有传入的参数作为需要远程执行的命令
COMMAND=$*# 主机信息文件,记录着每台主机的IP、用户名、端口和密码
HOST_INFO=host.info# 遍历host.info文件中的每一行,提取IP地址
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do# 根据IP地址从host.info文件中提取对应的用户名USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)# 根据IP地址从host.info文件中提取对应的端口号PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)# 根据IP地址从host.info文件中提取对应的密码PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)# 使用expect工具自动进行SSH连接,并发送命令expect -c "spawn ssh -p $PORT $USER@$IP  ## spawn这个不是一个独立命令,而是 expect 工具中的一个关键字。expect 是一个用于自动化交互式应用程序(如 SSH、FTP、passwd 等)的工具。spawn 关键字用于启动一个新的进程,并与之交互。expect {\"(yes/no)\" {send \"yes\r\"; exp_continue}\"password:\" {send \"$PASS\r\"; exp_continue}\"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}}"# 输出分隔线,方便查看每台主机的执行结果echo "-------------------"
done

117、定时清理与统计日志文件的艺术

#!/bin/bash################################################################
# 每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内容清空,
# 但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时间和日期命名的文件中,
# 需要考虑目标目录下二级、三级等子目录的文件
################################################################# 定义日志文件,以小时和日期命名
logfile=/tmp/`date +%H-%F`.log# 获取当前小时数
n=`date +%H`# 判断当前时间是否为0点或12点
if [ $n -eq 00 ] || [ $n -eq 12 ]
then# 如果是0点或12点,则遍历目标目录下的所有文件,并清空文件内容for i in `find /data/log/ -type f`dotrue > $idone
else# 如果不是0点或12点,则遍历目标目录下的所有文件,并统计文件大小,输出到日志文件for i in `find /data/log/ -type f`dodu -sh $i >> $logfiledone
fi#######################################################################
# 使用 chmod +x log_manage.sh 命令为脚本文件赋予执行权限。
# 使用 crontab -e 命令编辑 crontab 文件,添加一行定时任务:## 每小时执行一次脚本
# 0 * * * * /path/to/log_manage.sh
### 每半个小时执行一次脚本
# 0,30 * * * * /path/to/log_manage.sh
########################################################################

118、查看所有用户的定时任务

sudo bash -c 'for user in $(cut -f1 -d: /etc/passwd); do echo "===== $user ====="; crontab -l -u $user 2>/dev/null; done'

119、自动备份脚本

  • 这个脚本创建了重要目录的自动备份,确保数据始终受到保护。
#!/bin/bash
# 备份一个目录并将其存储在带有时间戳的备份文件夹中
SOURCE="/path/to/important/data"
DEST="/path/to/backup/location"
TIMESTAMP=$(date +"%Y%m%d%H%M%S")tar -czvf "$DEST/backup_$TIMESTAMP.tar.gz" "$SOURCE"
echo "备份完成: $DEST/backup_$TIMESTAMP.tar.gz"

120、日志轮转

日志可能会变得很大并占用宝贵的磁盘空间。此脚本会循环并压缩日志文件。

#!/bin/bash
# 轮转并压缩日志
LOG_FILE="/path/to/logfile.log"
BACKUP_DIR="/path/to/log/backup"
TIMESTAMP=$(date +"%Y%m%d")mv "$LOG_FILE" "$BACKUP_DIR/log_$TIMESTAMP.log"
gzip "$BACKUP_DIR/log_$TIMESTAMP.log"
touch "$LOG_FILE"
echo "日志轮转完成。"

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acrobat Pro DC 2023(pdf免费转化word)

所在位置 通过网盘分享的文件&#xff1a;Acrobat Pro DC 2023(64bit).tar 链接: https://pan.baidu.com/s/1_m8TT1rHTtp5YnU8F0QGXQ 提取码: 1234 --来自百度网盘超级会员v4的分享 安装流程 打开安装所在位置 进入安装程序 找到安装程序 进入后点击自定义安装&#xff0c;这里…

linux之调度管理(5)-实时调度器

一、概述 在Linux内核中&#xff0c;实时进程总是比普通进程的优先级要高&#xff0c;实时进程的调度是由Real Time Scheduler(RT调度器)来管理&#xff0c;而普通进程由CFS调度器来管理。 实时进程支持的调度策略为&#xff1a;SCHED_FIFO和SCHED_RR。 SCHED_FIFO&#xff…

在arm64架构下, Ubuntu 18.04.5 LTS 用命令安装和卸载qt4、qt5

问题&#xff1a;需要在 arm64下安装Qt&#xff0c;QT源码编译失败以后&#xff0c;选择在线安装&#xff01; 最后安装的版本是Qt5.9.5 和QtCreator 4.5.2 。 一、ubuntu安装qt4的命令(亲测有效)&#xff1a; sudo add-apt-repository ppa:rock-core/qt4 sudo apt updat…

Qt 之 qwt和QCustomplot对比

QWT&#xff08;Qt Widgets for Technical Applications&#xff09;和 QCustomPlot 都是用于在 Qt 应用程序中绘制图形和图表的第三方库。它们各有优缺点&#xff0c;适用于不同的场景。 以下是 QWT 和 QCustomPlot 的对比分析&#xff1a; 1. 功能丰富度 QWT 功能丰富&a…

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域&#xff0c;有时我们需要深入到视频文件的底层结构中去。UltraEdit&#xff08;UE&#xff09;和UEStudio作为强大的文本编辑器&#xff0c;允许我们以十六进制模式打开和搜索MP4文件。本文将指导…

使用nossl模式连接MySQL数据库详解

使用nossl模式连接MySQL数据库详解 摘要一、引言二、nossl模式概述2.1 SSL与nossl模式的区别2.2 选择nossl模式的场景三、在nossl模式下连接MySQL数据库3.1 准备工作3.2 C++代码示例3.3 代码详解3.3.1 初始化MySQL连接对象3.3.2 连接到MySQL数据库3.3.3 执行查询操作3.3.4 处理…

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…

号卡分销系统,号卡系统,物联网卡系统源码安装教程

号卡分销系统&#xff0c;号卡系统&#xff0c;物联网卡系统&#xff0c;&#xff0c;实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台)&#xff0c;PHP 持久化框架&#xff0c;助力管理系统敏捷开发&#xff0c;长期持续更新中。 主要特性 基于Auth验证的权限…

Java基础-集合

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 一、Java集合框架概述 二、Collection接口及其实现 2.1 Collection接口 2.2 List接口及其实现 …

基于Python的仓库管理系统设计与实现

背景&#xff1a; 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发&#xff0c;利用Django框架和MySQL数据库&#xff0c;实现了高效、便捷的仓库管理功能。 用户管理&#xff1a; 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

机器学习(基础2)

特征工程 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程API 实例化…

MATLAB向量元素的引用

我们定义一个向量后&#xff0c;如果想引用的话&#xff0c;可以通过索引 i n d ind ind来实现。 注意&#xff1a;MATLAB中向量的开始索引是1&#xff0c;与许多编程语言不同。 例如&#xff1a; 如果想引用多个的话&#xff0c;可以用索引 i n d ind ind来提取多个位置 例如…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

贪心算法入门(三)

相关文章 贪心算法入门&#xff08;一&#xff09;-CSDN博客 贪心算法入门&#xff08;二&#xff09;-CSDN博客 1.什么是贪心算法&#xff1f; 贪心算法是一种解决问题的策略&#xff0c;它将复杂的问题分解为若干个步骤&#xff0c;并在每一步都选择当前最优的解决方案&am…

QT仿QQ聊天项目,第三节,实现聊天界面

一&#xff0c;界面控件示意图 界面主要由按钮QPushButton,标签QLabel,列表QListWidget 要注意的是QListWidget既是实现好友列表的控件&#xff0c;也是实现聊天气泡的控件 二&#xff0c;控件样式 QPushButton#btn_name {border:none;}QPushButton#btn_close {border:1px;bac…

Gin 框架入门(GO)-1

解决安装包失败问题(*) go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct 1 介绍 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,Gin 最擅长的就是 Api 接口的高并发。 2 Gin 环境搭建 1.下载并安装 gin go get -u github.…

workerman的安装与使用

webman是一款基于workerman开发的高性能HTTP服务框架。webman用于替代传统的php-fpm架构&#xff0c;提供超高性能可扩展的HTTP服务。你可以用webman开发网站&#xff0c;也可以开发HTTP接口或者微服务。 除此之外&#xff0c;webman还支持自定义进程&#xff0c;可以做worker…

学习日记_20241117_聚类方法(高斯混合模型)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序

今天给大家分析一个音频分解器&#xff0c;通过傅里叶变换和信封匹配分离音乐中的各个音符和乐器&#xff0c;实现音乐到乐谱的转换。将音乐开源分离为组成乐器。该方式是盲源分离&#xff0c;从头开始制作&#xff0c;无需外部乐器分离库。 相关链接 代码&#xff1a;https:…

多模态基础模型:从专家到通用助手

概要 本文对展示视觉和视觉语言能力的多模态基础模型的分类和演变进行了全面调查&#xff0c;重点关注从专业模型到通用助手的过渡。研究领域包括五个核心主题&#xff0c;分为两类。&#xff08;i&#xff09; 我们从对成熟研究领域的调查开始&#xff1a;为特定目的预先训练…