1.1 生成随机数

#!/bin/bash
# 2019-8-13
# 随机生成?位字符
function generate_random_strings(){
	# 数字0-9
	NUMBER=($(echo {0..9}))
	# 小写字母
	LOWERCASE_LETTERS=($(echo {a..z}))
	# 大写字母
	CAPITAL_LETTER=($(echo {A..Z}))
	# 特殊字符
	SPECIAL_CHARACTERS=(\! \@ \# \$ \% \^ \& \: \-)
	# 全部字符
	ALL_CHARACTERS=(${NUMBER[@]} ${LOWERCASE_LETTERS[@]} ${CAPITAL_LETTER[@]} ${SPECIAL_CHARACTERS[@]})
	# 全部字符长度
	ALL_CHARACTERS_LENGTH=${#ALL_CHARACTERS[@]}

	# 计数器
	COUNT=0
	# 生成密码个数
	# NUMBER_OF_PASSWORDS=10
	NUMBER_OF_PASSWORDS=$1
	while [[ true ]]; do
		# 生成密码长度
		# PASSWORD_LENGTH=16
		PASSWORD_LENGTH=$2
		PASSWORD=""
		for (( j = 0; j < ${PASSWORD_LENGTH}; j++ )); do
			# 随机下标
			INDEX=$(($RANDOM%${ALL_CHARACTERS_LENGTH}))
			# 密码组合
			PASSWORD=${PASSWORD}${ALL_CHARACTERS[INDEX]}
		done
		# 正则表达式,判断生成的密码强度
		REGULAR_EXPRESSION="[0-9a-zA-Z]{2,}[!@#$%^&:-]{2,}"
		echo ${PASSWORD} | egrep "${REGULAR_EXPRESSION}" > /dev/null
		# 符合正则表达式就输出
		if [[ $? -eq 0 ]]; then
			# 密码输出到文件
			# PASSWORD_STORAGE_DIRECTORY="/c/Users/Administrator/Desktop/生成16位随机密码.txt"
			# echo ${PASSWORD} >> ${PASSWORD_STORAGE_DIRECTORY}
			echo ${PASSWORD}
			# 多少个密码就停止输出
			let COUNT++
			if [[ ${COUNT} -ge ${NUMBER_OF_PASSWORDS} ]]; then
				break
			fi
		fi
	done
}

# generate_random_strings

# 生成?个密码,长度为?
generate_random_strings $1 $2

# 脚本运行不一定能成功,不喜勿喷!

1.2 时间倒计时

#!/bin/bash

# 时间倒计时
# 2019-09-19

function countdown(){
	# 倒计时多少时间
	TIME="120"
	i=0
	while [[ ${TIME} -ge ${i} ]]; do
		echo -e "\033[31m倒计时\033[0m \033[34m ${TIME} \033[0m"
		let TIME-=1
		sleep 1
	done
}

countdown

1.3 es日志清理

#/bin/bash
#指定日期(7天前)
DATA=`date -d "1 week ago" +%Y.%m.%d`
IPADD='http://101.37.32.7:9200'
#当前日期
time=`date`
#删除7天前的日志
curl -XDELETE $IPADD/testlog-${DATA}
curl -XDELETE $IPADD/devlog-${DATA} 
curl -XDELETE $IPADD/prodlog-${DATA}
curl -XDELETE $IPADD/uatlog-${DATA}
curl -XDELETE $IPADD/devbacklog-${DATA}
curl -XDELETE $IPADD/testbacklog-${DATA}
curl -XDELETE $IPADD/uatbacklog-${DATA}
curl -XDELETE $IPADD/prodbacklog-${DATA}
curl -XDELETE $IPADD/alllogback-${DATA}
 
if [ $? -eq 0 ];then
          echo $time"-->del $DATA log success.." >> /home/idouall/es-index-sucess-clear.log
else
          echo $time"-->del $DATA log fail.." >> /home/idouall/es-index-fail-clear.log
fi

1.4 ssh登录非白名单ip记录

安装
yum -y install sendmail mailx libreport-plugin-mailx sharutils mutt

配置
vim /etc/mail.rc
# For Linux and BSD, this should be set.
set bsdcompat
set from=qq@qq.com
set smtp=smtps://smtp.qiye.aliyun.com:465
set smtp-auth-user=qq@qq.com
set smtp-auth-password=password
set smpt-auth=login

##set smtp-use-starttls
set ssl-verify=ignore
set nss-config-dir=/root/.certs

#测试
echo "mail content" | mailx -s "mail title" 123456@qq.com
```
```yaml
#!/bin/bash
#user2.txt存放用户邮箱列表
#otice 原始文章内容
#filtering awk过滤后的文章内容
for i in  `cat user2.txt`
do
   awk -F "" 'BEGIN { OFS="" }{if(NR == 1) for(i=4;i<=4;i++) {$i=$user2;} print }' notice>filtering
   mailx -s "网站升级" $i <123
   sleep 3
done

1.5 批量邮件群发

#!/bin/bash

#临时变了存储for循环默认分隔符,便于使用完for循环恢复
IFS_OLD="$IFS"
#重新启动for循环默认分隔符
IFS=$'\n'

user_logs="test.logs"
sudo echo "123" | kinit 123
for line in `cat test.txt`
do
    user=`echo ${line} | awk '{print $1}'`
    echo 123 >> ./${user_logs}
done
IFS=$IFS_OLD

1.6 for循环文本批量执行

### 1.1根据日志文件shell写法
这个脚本会在指定的目录中查找大小大于300M的日志文件,对于每个文件执行清空文件操作,并在日志文件中记录清空过程和执行时间。日志文件保存在 /data/test.log 中,可以根据实际需要进行修改。通过 find 命令查找文件并使用 du 命令获取文件大小,并使用 awk 进行格式化。注意添加 -type f 限制只对文件进行操作,以防止在目录上执行清空操作。
```yaml
#!/bin/bash
log_dir="/var/log"  # 日志文件目录
log_file="test.log"  # 日志文件名
log_path="/data/${log_file}"  # 日志文件路径
threshold="300M"  # 容量阈值

# 记录日志函数
log() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "${log_path}"
}

# 清空文件函数
clean_file() {
  local file_path="$1"
  log "清空文件 ${file_path}"
  echo -n "" > "${file_path}"
}

# 查找文件并清空
while read -r file_path; do
  size=$(du -m "${file_path}" | awk '{print $1}')
  if [ "${size}" -gt "$(echo "${threshold}" | tr -d '[:alpha:]')" ]; then
    clean_file "${file_path}"
  fi
done < <(find "${log_dir}" -type f -size "+${threshold}" -name "*.log" 2>/dev/null)

# 记录清理完成时间
log "清理完成"


```

### 1.2 根据日志文件python写法
这个Python脚本与之前的Shell脚本实现相似,使用os模块来进行文件和目录操作。os.walk用于遍历目录和子目录,os.path.join用于构造文件路径。对于每个文件,使用os.path.getsize获取文件大小并进行比较,对于大于阈值的文件执行清空操作。清空操作使用with open(file_path, "w") as f:打开文件并使用pass占位,清空文件内容。最后记录清理完成时间。日志文件保存在/data/test.log中,可以根据实际需要进行修改。
```yaml
import os
import datetime

log_dir = "/var/log"  # 日志文件目录
log_file = "test.log"  # 日志文件名
log_path = "/data/" + log_file  # 日志文件路径
threshold = 300 * 1024 * 1024  # 容量阈值,单位为字节

# 记录日志函数
def log(msg):
    with open(log_path, "a") as f:
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        f.write(f"{now} {msg}\n")

# 清空文件函数
def clean_file(file_path):
    log(f"清空文件 {file_path}")
    with open(file_path, "w") as f:
        pass

# 查找文件并清空
for root, dirs, files in os.walk(log_dir):
    for file_name in files:
        if file_name.endswith(".log"):
            file_path = os.path.join(root, file_name)
            size = os.path.getsize(file_path)
            if size > threshold:
                clean_file(file_path)

# 记录清理完成时间
log("清理完成")

```

### 2.1 shell根据磁盘大小+文件大小清理
这个脚本会遍历所有挂载的文件系统,检查使用率是否超过阈值,如果超过则清理符合条件的日志文件,并记录脚本执行过程和时间戳到 /data/test.logs 文件中。脚本使用 df -h 命令获取磁盘使用情况,然后在 while 循环中逐行读取,并使用 awk 提取磁盘使用率和挂载路径。然后,如果磁盘使用率超过阈值,就清理挂载路径下的大小超过 300M 的日志文件,包括以 .logs 和 .log 结尾的文件,并将执行过程记录到 /data/test.logs 文件中。
```yaml
#!/bin/bash

# Log file
LOG_FILE=/data/test.logs

# Disk threshold and minimum file size
THRESHOLD=80
MIN_SIZE=300M

# Timestamp for log
TIMESTAMP=$(date +%Y-%m-%d\ %H:%M:%S)

# Loop through all mounted file systems
while read -r line; do
    usage=$(echo $line | awk '{print $5}' | tr -d '%')
    if [ $usage -gt $THRESHOLD ]; then
        path=$(echo $line | awk '{print $6}')
        echo "$TIMESTAMP - Cleaning logs in $path" >> $LOG_FILE
        find $path -maxdepth 1 -type f -name '*.logs' -o -name '*.log' -size +$MIN_SIZE -exec truncate -s 0 {} \;
    fi
done < <(df -h)
```

### 2.2 python根据磁盘大小+文件大小清理
使用 os.popen 执行 df -h 命令获取磁盘使用情况,然后遍历所有挂载的分区,检查使用率是否超过阈值,如果超过则清理符合条件的日志文件,并将执行过程记录到 /data/test.log 文件中。

脚本使用 os.walk 遍历指定目录下的所有文件和子目录,找到以 .logs 和 .log 结尾的文件,并检查文件大小。如果文件大小超过 300MB,则清空文件内容。清理过程中,脚本会记录每个被清理的文件名和大小,并将记录写入 /data/test.log 文件中。

注意:这个脚本可能会在不同的系统上表现不同,因为不同的操作系统和文件系统可能会在磁盘使用情况报告和文件大小计算上有所不同。
```yaml
import os
import datetime

LOG_FILE = '/data/test.log'
THRESHOLD = 80
MIN_SIZE = 300 * 1024 * 1024

now = datetime.datetime.now()
timestamp = now.strftime('%Y-%m-%d %H:%M:%S')

for partition in os.popen('df -h').readlines()[1:]:
    partition = partition.split()
    usage = int(partition[4].rstrip('%'))
    if usage > THRESHOLD:
        path = partition[5]
        msg = f'{timestamp} - Cleaning logs in {path}'
        print(msg)
        with open(LOG_FILE, 'a') as f:
            f.write(msg + '\n')
        for root, dirs, files in os.walk(path):
            for file in files:
                if file.endswith('.logs') or file.endswith('.log'):
                    file_path = os.path.join(root, file)
                    file_size = os.path.getsize(file_path)
                    if file_size > MIN_SIZE:
                        with open(file_path, 'w'):
                            pass
                        msg = f'{timestamp} - Cleaned {file_path} (size: {file_size})'
                        print(msg)
                        with open(LOG_FILE, 'a') as f:
                            f.write(msg + '\n')

1.7 根据清理日志文件大小自动清理文件内容

### 1.1根据日志文件shell写法
这个脚本会在指定的目录中查找大小大于300M的日志文件,对于每个文件执行清空文件操作,并在日志文件中记录清空过程和执行时间。日志文件保存在 /data/test.log 中,可以根据实际需要进行修改。通过 find 命令查找文件并使用 du 命令获取文件大小,并使用 awk 进行格式化。注意添加 -type f 限制只对文件进行操作,以防止在目录上执行清空操作。
```yaml
#!/bin/bash
log_dir="/var/log"  # 日志文件目录
log_file="test.log"  # 日志文件名
log_path="/data/${log_file}"  # 日志文件路径
threshold="300M"  # 容量阈值

# 记录日志函数
log() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "${log_path}"
}

# 清空文件函数
clean_file() {
  local file_path="$1"
  log "清空文件 ${file_path}"
  echo -n "" > "${file_path}"
}

# 查找文件并清空
while read -r file_path; do
  size=$(du -m "${file_path}" | awk '{print $1}')
  if [ "${size}" -gt "$(echo "${threshold}" | tr -d '[:alpha:]')" ]; then
    clean_file "${file_path}"
  fi
done < <(find "${log_dir}" -type f -size "+${threshold}" -name "*.log" 2>/dev/null)

# 记录清理完成时间
log "清理完成"


```

### 1.2 根据日志文件python写法
这个Python脚本与之前的Shell脚本实现相似,使用os模块来进行文件和目录操作。os.walk用于遍历目录和子目录,os.path.join用于构造文件路径。对于每个文件,使用os.path.getsize获取文件大小并进行比较,对于大于阈值的文件执行清空操作。清空操作使用with open(file_path, "w") as f:打开文件并使用pass占位,清空文件内容。最后记录清理完成时间。日志文件保存在/data/test.log中,可以根据实际需要进行修改。
```yaml
import os
import datetime

log_dir = "/var/log"  # 日志文件目录
log_file = "test.log"  # 日志文件名
log_path = "/data/" + log_file  # 日志文件路径
threshold = 300 * 1024 * 1024  # 容量阈值,单位为字节

# 记录日志函数
def log(msg):
    with open(log_path, "a") as f:
        now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        f.write(f"{now} {msg}\n")

# 清空文件函数
def clean_file(file_path):
    log(f"清空文件 {file_path}")
    with open(file_path, "w") as f:
        pass

# 查找文件并清空
for root, dirs, files in os.walk(log_dir):
    for file_name in files:
        if file_name.endswith(".log"):
            file_path = os.path.join(root, file_name)
            size = os.path.getsize(file_path)
            if size > threshold:
                clean_file(file_path)

# 记录清理完成时间
log("清理完成")

```

### 2.1 shell根据磁盘大小+文件大小清理
这个脚本会遍历所有挂载的文件系统,检查使用率是否超过阈值,如果超过则清理符合条件的日志文件,并记录脚本执行过程和时间戳到 /data/test.logs 文件中。脚本使用 df -h 命令获取磁盘使用情况,然后在 while 循环中逐行读取,并使用 awk 提取磁盘使用率和挂载路径。然后,如果磁盘使用率超过阈值,就清理挂载路径下的大小超过 300M 的日志文件,包括以 .logs 和 .log 结尾的文件,并将执行过程记录到 /data/test.logs 文件中。
```yaml
#!/bin/bash

# Log file
LOG_FILE=/data/test.logs

# Disk threshold and minimum file size
THRESHOLD=80
MIN_SIZE=300M

# Timestamp for log
TIMESTAMP=$(date +%Y-%m-%d\ %H:%M:%S)

# Loop through all mounted file systems
while read -r line; do
    usage=$(echo $line | awk '{print $5}' | tr -d '%')
    if [ $usage -gt $THRESHOLD ]; then
        path=$(echo $line | awk '{print $6}')
        echo "$TIMESTAMP - Cleaning logs in $path" >> $LOG_FILE
        find $path -maxdepth 1 -type f -name '*.logs' -o -name '*.log' -size +$MIN_SIZE -exec truncate -s 0 {} \;
    fi
done < <(df -h)
```

### 2.2 python根据磁盘大小+文件大小清理
使用 os.popen 执行 df -h 命令获取磁盘使用情况,然后遍历所有挂载的分区,检查使用率是否超过阈值,如果超过则清理符合条件的日志文件,并将执行过程记录到 /data/test.log 文件中。

脚本使用 os.walk 遍历指定目录下的所有文件和子目录,找到以 .logs 和 .log 结尾的文件,并检查文件大小。如果文件大小超过 300MB,则清空文件内容。清理过程中,脚本会记录每个被清理的文件名和大小,并将记录写入 /data/test.log 文件中。

注意:这个脚本可能会在不同的系统上表现不同,因为不同的操作系统和文件系统可能会在磁盘使用情况报告和文件大小计算上有所不同。
```yaml
import os
import datetime

LOG_FILE = '/data/test.log'
THRESHOLD = 80
MIN_SIZE = 300 * 1024 * 1024

now = datetime.datetime.now()
timestamp = now.strftime('%Y-%m-%d %H:%M:%S')

for partition in os.popen('df -h').readlines()[1:]:
    partition = partition.split()
    usage = int(partition[4].rstrip('%'))
    if usage > THRESHOLD:
        path = partition[5]
        msg = f'{timestamp} - Cleaning logs in {path}'
        print(msg)
        with open(LOG_FILE, 'a') as f:
            f.write(msg + '\n')
        for root, dirs, files in os.walk(path):
            for file in files:
                if file.endswith('.logs') or file.endswith('.log'):
                    file_path = os.path.join(root, file)
                    file_size = os.path.getsize(file_path)
                    if file_size > MIN_SIZE:
                        with open(file_path, 'w'):
                            pass
                        msg = f'{timestamp} - Cleaned {file_path} (size: {file_size})'
                        print(msg)
                        with open(LOG_FILE, 'a') as f:
                            f.write(msg + '\n')

1.8 批量替换文件内容

#!/bin/bash
##检测是否安装iostat工具
##stress --cpu 4 --timeout 60 通常使用stress压测cpu触发脚本是否执行成功

##判断目录是否存在
# 定义目录路径
dir_logs=/data/script/logs

# 定义cpu5分钟的告警触发阀值数值:Load average:5分钟超过3 则执行以下采集命令
threshold=3 


# 判断目录是否存在
if [ -d "$dir_logs" ]; then
  echo "目录已存在,无需创建。"
else
  echo "目录不存在,创建目录:$dir_logs"
  sudo mkdir -p $dir_logs
fi

##判断命令是否存在
if ! command -v iostat &> /dev/null
then
    echo "iostat command not found, installing..."
    sudo yum install -y sysstat
fi

if ! command -v iotop &> /dev/null
then
    echo "iostat command not found, installing..."
    sudo yum install -y iotop
fi

#5分钟负载大于XX则触发分析命令并存储
logs_file="${dir_logs}/cpu-$(date +"%Y-%m-%d_%H:%M:%S").logs"

uptime | awk -F 'load average: ' '{print $2}' | awk -F ', ' '{print $2}' | while read load; do
  if (( $(echo "$load > ${threshold}" | bc -l) )); then
    echo "故障" >> ${logs_file}
    echo "以下是详细信息:" >> ${logs_file}
    echo "1 内核产生的信息:dmesg | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -n 10" >> ${logs_file}
    dmesg | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -n 10 >> ${logs_file}
    
    
    echo "3 CPU每个计算核心的使用情况: mpstat -P ALL 5 2" >> ${logs_file}
    mpstat -P ALL 5 2 >> ${logs_file}
    
    echo "4 cpu利用率分析: sar -u 2 10" >> ${logs_file}
    sar -u 2 10 >> ${logs_file}
    
	echo "4 cpu的io进程: iotop -oP" >> ${logs_file}
    iotop -oP >> ${logs_file}
	
    echo "5 磁盘信息:iostat -x 1 3" >> ${logs_file}
    iostat -x 1 3 >> ${logs_file}
    
    echo "6 系统负载统计:vmstat 5 10" >> ${logs_file}
    vmstat 5 10 >> ${logs_file}
    
    echo "7 进程信息:ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 11" >> ${logs_file}
    ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 11 >> ${logs_file}
    
	echo "2 进程数统计: ss -s"  >> ${logs_file}
    ss -s  >> ${logs_file}
	
    echo "8 监控进程:pidstat  2 2" >> ${logs_file}
    pidstat  2 2 >> ${logs_file}
  fi
done