04-流程控制之if

image-20210315174845847

1. 单分支if

image-20210315180808843

伪代码

风格1

if [ 你有八分像吴彦祖 ];then
        出门在外男孩子要保护自己
fi


风格2


if [ 你是女孩子 ]
then
        男人的嘴,骗人的鬼,女孩子在外要保护好自己
fi

案例

先看系统脚本中的if玩法,作为你学习的参考写法。

image-20220617113306274

给脚本传入2个参数,判断是否相等。

cat > if_1.sh <<'EOF'
#!/bin/bash

if [ "$1" -eq "$2" ];then
    echo "相等"
fi
EOF

执行

[root@yuchaoit666 ~/p3-shell]#bash if_1.sh  3 4
[root@yuchaoit666 ~/p3-shell]#
[root@yuchaoit666 ~/p3-shell]#
[root@yuchaoit666 ~/p3-shell]#bash if_1.sh  3 5
[root@yuchaoit666 ~/p3-shell]#
[root@yuchaoit666 ~/p3-shell]#bash if_1.sh  55 55
相等

2.双条件分支

伪代码

if [ 帅似吴彦祖 ];then
        男孩子在外要保护好自己
else
        男人的嘴,骗人的鬼
fi

案例

image-20220617160044017

猜大小

接收2个数字,判断数字大小关系。

cat > if_2.sh<<'EOF'
if [ $1 -eq $2 ];then
    echo "相等"
else 
    echo "不相等"
fi
EOF

执行

[root@yuchaoit666 ~/p3-shell]#bash if_2.sh 2 43
不相等
[root@yuchaoit666 ~/p3-shell]#bash if_2.sh 2 2
相等

3.多条件分支

image-20210315201050234

从这个系统脚本中,你可以可以学到,也可以省略else的关键字,但是 if 、fi是必须成对的。

image-20220617170542410

伪代码

if [ 帅似吴彦祖 ];then
        echo "男孩子在外要保护好自己!!"
elif [ 胖似金三胖 ];then
        echo "嫌弃我胖?给我打!!"
else
        echo "你是什么玩意,凭啥对我指指点点"
fi

案例

输入2个数字,判断数字关系


cat > if_3.sh <<'EOF'
if [ $1 -eq $2 ];then
    echo "两数相等"
elif [ $1 -gt $2 ];then
    echo "$1 大于 $2 "
else
    echo "$1 小于 $2 "
fi
EOF

案例

[root@yuchaoit666 ~]#bash if_3.sh 3 4
3 小于 4
[root@yuchaoit666 ~]#bash if_3.sh 5 1
5 大于 1
[root@yuchaoit666 ~]#bash if_3.sh 5 5
两数相等

案例

4.实战案例

4.1 完善计算器脚本

v1初代版本

要求输入2个数字,然后进行加减乘除计算。


#!/bin/bash
num1=$1
num2=$2

#. [[ $n1 =~ ^[0-9]+$ ]]


# 用于判断是否是两个纯数字 
all_int=$(echo ${num1}${num2}|sed -r 's#[0-9]+##g')

# 限定数字个数
if [ $# -ne 2 ];then
    echo "只能2个参数!"
    exit 1

# 如果$all_int为空字符串,表示num1和num2都是纯数字
# -z 如果变量为空,结果为真

elif [ -z $all_int ];then
  echo "加法计算:$num1 + $num2 = $[ $num1 + $num2 ] "
  echo "减法计算:$num1 - $num2 = $[ $num1 - $num2 ] "
  echo "乘法计算:$num1 * $num2 = $[ $num1 * $num2 ] "
  echo "除法计算:$num1 / $num2 = $[ $num1 / $num2 ] "

else
    echo "只能输入2个纯数字!!"
fi

image-20220617175828562

v2条件选择版

需求如下

优化功能
1. 用read接收用户输入,更像计算器
2. 提供符号菜单选择
3. 添加if条件判断

效果如下

请输入第一个数字: 8
请输入第二个数字: 2
请选择运算符:
  1. +
  2. - 
  3. *
  4. /
请输入您的选择: 1

计算结果:
8 + 2 = 10

脚本开发

#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
echo -e "请选择运算符:
1. +
2. -
3. *
4. /"

read -p "请选择运算符:" sign

# 计算器条件判断

if [ $sign == 1 ];then
        echo "$num1 + $num2 = $[ $num1 + $num2 ]"
elif [ $sign == 2 ];then
        echo "$num1 - $num2 = $[ $num1 - $Num2 ] "
elif [ $sign == 3 ];then
        echo "$num1 * $num2 = $[ $num1 * $num2 ]"
elif [ $sign == 4 ];then
        echo "$num1 / $num2 = $[ $num1 / $num2 ]"
else
    echo "只能输入1到4的选项"
fi

image-20220617202203405

v3异常处理版本

#!/bin/bash
read -p "请输入第一个数字:" num1
# 不是纯数字就直接结束
if [ ! -z $(echo ${num1}|sed -r 's#[0-9]+##g') ];then
    echo "请输入纯数字整数!"
    exit
fi


read -p "请输入第二个数字:" num2
if [ ! -z $(echo ${num2}|sed -r 's#[0-9]+##g') ];then
    echo "请输入纯数字整数!"
    exit
fi

echo -e "请选择运算符:
1. +
2. -
3. *
4. /"

read -p "请选择运算符:" sign

if [ ! -z $(echo ${sign}|sed -r 's#[1-4]##g') ];then
    echo "只能输入加减乘除四个符号!"
    exit
fi



# 计算器条件判断

if [ $sign == 1 ];then
        echo "$num1 + $num2 = $[ $num1 + $num2 ]"
elif [ $sign == 2 ];then
        echo "$num1 - $num2 = $[ $num1 - $Num2 ] "
elif [ $sign == 3 ];then
        echo "$num1 * $num2 = $[ $num1 * $num2 ]"
elif [ $sign == 4 ];then
        echo "$num1 / $num2 = $[ $num1 / $num2 ]"
else
    echo "只能输入1到4的选项"
fi

简易计算器

#!/bin/bash

# 提示用户输入操作符
echo "请输入操作符(+ - * /):"
read operator

# 提示用户输入第一个数字
echo "请输入第一个数字:"
read num1

# 对输入校验 ,必须是纯数字
# 提示用户输入第二个数字
echo "请输入第二个数字:"
read num2

# 根据操作符进行相应的计算
if [ "$operator" = "+" ]; then
    result=$(echo "$num1 + $num2" | bc)
elif [ "$operator" = "-" ]; then
    result=$(echo "$num1 - $num2" | bc)
elif [ "$operator" = "*" ]; then
    result=$(echo "$num1 * $num2" | bc)
elif [ "$operator" = "/" ]; then
    # 检查除数是否为 0
    if [ "$num2" -eq 0 ]; then
        echo "除数不能为 0"
        exit 1
    fi
    result=$(echo "scale=2; $num1 / $num2" | bc)
else
    echo "无效的操作符"
    exit 1
fi

# 输出结果
echo "结果是:$result"

校验版计算器

#!/bin/bash

# 提示用户输入操作符
echo "请输入操作符(+ - * /):"
read operator

# 校验操作符是否有效
if [[ "$operator" != "+" && "$operator" != "-" && "$operator" != "*" && "$operator" != "/" ]]; then
    echo "无效的操作符,请输入 +、-、* 或 /"
    exit 1
fi

# 提示用户输入第一个数字
echo "请输入第一个数字:"
read num1

# 校验第一个数字是否为纯数字
if ! [[ "$num1" =~ ^-?[0-9]+(\.[0-9]+)?$ ]]; then
    echo "输入的第一个数字无效,请输入有效数字"
    exit 1
fi

# 提示用户输入第二个数字
echo "请输入第二个数字:"
read num2

# 校验第二个数字是否为纯数字
if ! [[ "$num2" =~ ^-?[0-9]+(\.[0-9]+)?$ ]]; then
    echo "输入的第二个数字无效,请输入有效数字"
    exit 1
fi

# 检查除数是否为 0
if [ "$operator" = "/" ] && [ "$num2" = "0" ]; then
    echo "除数不能为 0"
    exit 1
fi

# 根据操作符进行相应的计算
if [ "$operator" = "+" ]; then
    result=$(echo "$num1 + $num2" | bc)
elif [ "$operator" = "-" ]; then
    result=$(echo "$num1 - $num2" | bc)
elif [ "$operator" = "*" ]; then
    result=$(echo "$num1 * $num2" | bc)
elif [ "$operator" = "/" ]; then
    result=$(echo "scale=2; $num1 / $num2" | bc)
fi

# 输出结果
echo "结果是:$result"

4.2 备份数据

如果目录不存在自动创建

#!/bin/bash

if [ -e /backup/ ];then
    echo "目录以存在"
else
    mkdir -p "backup"
fi

如果备份文件不存在自动创建

#!/bin/bash

if [ -e /backup/ ];then
    echo "目录以存在"
else
    mkdir -p "/backup"
fi

if [ -f /backup/all_log.tgz];then
    echo "备份数据已存在"
else
    echo "备份文件中"
    tar -zcvf /backup/all_log.tgz /var/log/
fi

4.3 程序运行检查脚本

写一个脚本,传递一个参数,即可检查该服务运行状态。

#!/bin/bash
# 限定只能检查一个服务
if [ $# -eq 1 ];then
    # 检查服务运行状态
    systemctl status $1 &>/dev/null
    # 通过命令结果判断
    if [ $? -eq 0 ];then
        echo "$1 服务运行中"
    else
        echo "$1 服务挂了!!"
    fi
# 否则提示用户正确参数用法
else
    # 提示用户正确语法
    echo "usage:bash $0 service_name"
    # 程序退出
    exit
fi

image-20220617204329065

服务检查脚本

#!/bin/bash

# 提示用户输入服务名称
echo "请输入要检查的 systemctl 服务名称:"
read service_name

# 检查服务是否存在
if ! systemctl list-unit-files | grep -q "$service_name.service"; then
    echo "服务 $service_name 不存在"
    exit 1
fi

# 检查服务状态
status=$(systemctl status $service_name | grep Active | awk '{print $2}')

# 根据状态输出信息
if [ "$status" = "active" ]; then
    echo "服务 $service_name 正在运行"
elif [ "$status" = "inactive" ]; then
    echo "服务 $service_name 未运行"
elif [ "$status" = "failed" ]; then
    echo "服务 $service_name 运行失败"
else
    echo "服务 $service_name 状态未知"
fi

4.4 资源使用率监控脚本

开发思路

1.想清楚监控哪些资源,如何用命令提取,是什么命令
2.如何提取百分比的数据
3. 如何将提取出的数据,和阈值比较,判定超过85%就该报警了
4.结果写入到文件

提示
一是通过linux命令获取
二是提取/proc目录提供的资源数据

这里仅是为了练习思考如何通过shell的条件判断语句,以及通过linux命令拿到数据

学会、看懂语法即可。

具体如何采集精确的值,还得有更多的思考。
#!/bin/bash
# 获取当前时间,精准统计
now=$(date +%F_%T)

# 提取内存使用率 free -m


# 具体写法,内存统计

mem_used=$(free -m | awk '/Mem/{used=$3/$2;print used*100}'|sed -r  's#\..*##g')
# 具体数值判断,根据你业务需求来,超过多少需要记录,报警。。
if [ $mem_used -ge 30 ];then
    echo "${USER}:${now}:内存使用率 $mem_used " > /tmp/mem_used.log
fi



# 根目录磁盘使用率
# 先统计出现有的使用率,超过85%之后,报警
disk_used=$(df -h |grep '/$' | awk '{print $5}' |sed 's#%##g')
# 条件判断
if [ $disk_used -ge 30 ];then
    echo "${USER}:${now}:磁盘使用率 ${disk_used} 请尽快修复。" >> /tmp/disk_used.log
fi


# cpu使用率
# 通过top命令 查看cpu整体情况,查看%Cpus行的信息,查看idle行,表示当前有多少百分比的空闲cpu。
# sar mpstat
cpu_used=$(mpstat 1 1 | awk '/Average:/ {print 100-$NF}' | awk '{printf "%.0f\n", $1}')
if [ $cpu_used -ge 1 ]; then
    echo "$user:$now:CPU 使用率 $cpu_used 请尽快修复。" >> /tmp/cpu_used.log
fi

脚本优化

  1. 在进行比较时,原脚本中使用 -ge 3 作为阈值,可能不符合实际需求,通常会使用更高的阈值,例如对于内存和磁盘使用率使用 80 或 90 等,对于 CPU 使用率使用 70 或 80 等。
  2. 在计算内存使用率时,原脚本中使用 sed -r 's#\..*##g' 来去除小数部分,这种方式不够精确,可以使用 printfawkprintf 函数进行四舍五入处理。
  3. 原脚本中直接使用 ${USER} ,可能会受到环境变量的影响,如果在不同的用户环境下运行,可能会出现混淆,建议明确指定用户或者使用 whoami 命令来获取当前用户。
  4. 原脚本在使用 top 命令时,对于不同系统或 top 命令的不同版本,输出格式可能不同,导致 awk 的匹配失败,可以使用 mpstatsar 命令来获取更稳定的 CPU 使用率。
  5. 对于日志输出,原脚本只是简单的将信息追加到文件中,没有考虑文件大小限制,可能会导致文件无限增长,可以添加文件大小检查和轮转功能。
#!/bin/bash

# 获取当前时间,精准统计
now=$(date +%F-%T)
user=$(whoami)

# 提取内存使用率
mem_used=$(free -m | awk '/Mem/{used=$3/$2;printf "%.0f\n", used*100}')
if [ $mem_used -ge 80 ]; then
    echo "$user:$now:内存使用率 $mem_used " >> /tmp/mem_used.log
fi

# 根目录磁盘使用率
disk_used=$(df -h | grep '/$' | awk '{print $5}' | sed 's#%##g')
if [ $disk_used -ge 85 ]; then
    echo "$user:$now:磁盘使用率 $disk_used 请尽快修复。" >> /tmp/disk_used.log
fi

# cpu 使用率
cpu_used=$(mpstat 1 1 | awk '/Average:/ {print 100-$NF}' | awk '{printf "%.0f\n", $1}')
if [ $cpu_used -ge 80 ]; then
    echo "$user:$now:CPU 使用率 $cpu_used 请尽快修复。" >> /tmp/cpu_used.log
fi


# 检查日志文件大小,如果超过 10MB,备份并清空
check_log_size() {
    log_file=$1
    max_size=$((10 * 1024 * 1024))  # 10MB
    if [ -f $log_file ]; then
        size=$(stat -c %s $log_file)
        if [ $size -ge $max_size ]; then
            mv $log_file "${log_file}.$(date +%F-%T)"
            touch $log_file
        fi
    fi
}

# 检查并轮转日志文件
check_log_size /tmp/mem_used.log
check_log_size /tmp/disk_used.log
check_log_size /tmp/cpu_used.log

4.5 判断用户输入是否为空

#!/bin/bash
read -p "随便输入点啥:" word

if [ -z $word ];then
        echo "内容为空!!"
else
    echo "您输入的内容为空:" ${word}
fi

4.6 成绩查询

需求:

让用户输入自己的成绩
1. 分数在0 ~ 59 不及格,需要补考
2. 分数在 60 ~ 85 属于良好
3. 分数在86 ~ 100 属于优秀

初代版本

#!/bin/bash
read -p "请输入你的成绩:" score

if [ $score -ge 0 ] && [ $score -le 59 ];then
    echo "平时少玩点游戏兄弟,回去等通知吧,建议多看看于超老师的课程 www.yuchaoit.cn"
elif [ $score -ge 59 ] && [ $score -le 85 ];then
    echo "考得不错,下次继续努力"
elif [ $score -ge 86 ] && [ $score -le 100 ];then
    echo "大佬,带带弟弟"
else
    echo "分数只能在0~100。。。别瞎整!!"
    exit
fi

优化版本

思考这个脚本存在的缺陷

1. 用户输入了多个参数?或者没有参数?是不是要对参数做异常处理?
2. 用户就是不太正常,输入的是非数字,要不要异常处理?
3. 用户啥也不输入?

改进的v2版本

#!/bin/bash

if [ $# != 0  ];then
    echo "本脚本无须传入参数!!"
    exit
else
    read -p "请输入你的成绩:" score
    if [ -z $score ];then
        echo "大哥,你好歹输入点东西吧!!滚粗!"
        exit
    fi

    # 成绩数字判断,如果能替换为空字符串,证明就是纯数字,输入正确
    all_int=$(echo "$score"|sed -r 's#[0-9]+##g')
    # 非空字符串的话,就表示非纯数字
    if [ -n "$all_int" ];then
            echo "请输入纯数字!!"
            exit
    elif [ $score -ge 0 ] && [ $score -le 59 ];then
        echo "平时少玩点游戏兄弟,回去等通知吧,建议多看看于超老师的课程 www.yuchaoit.cn"
    elif [ $score -ge 59 ] && [ $score -le 85 ];then
        echo "考得不错,下次继续努力"
    elif [ $score -ge 86 ] && [ $score -le 100 ];then
        echo "大佬,带带弟弟"
    else
        echo "分数只能在0~100。。。别瞎整!!"
    exit
    fi
fi

还有很多bug需要优化,还有v3 v4 v5..版本,软件开发就是如此的迭代,不断修复bug。

4.7 系统服务管理脚本

#!/bin/bash

source /etc/init.d/functions

read -p "请输入你要查询的服务名:" services_name

# 查询结果记录
rpm -qa $services_name > /tmp/status_install.log
# -s 限制文件存在且有内容才为true
if [ ! -s /tmp/status_install.log ];then
    echo "$services_name 该服务未安装!!"
    exit
fi

# 否则该服务就是存在的
echo -e "请选择执行的步骤:\n1.start\n2.stop\n3.restart\n4.status"

read -p "请输入你的选择序号:" num

if [ $num -eq 1 ];then
        systemctl start $services_name > /dev/null 2>&1
        # 异常处理
        [ $? -eq 0 ] && action "$services_name 启动成功" /bin/true || action "$services_name 启动失败" /bin/false

elif [ $num -eq 2 ];then
    systemctl stop $services_name > /dev/null 2>&1
    [ $? -eq 0 ] && action "$services_name 停止成功" /bin/true || action "$services_name 停止失败" /bin/false

elif [ $num -eq 3 ];then
    systemctl restart $services_name > /dev/null 2>&1
    [ $? -eq 0 ] && action "$services_name 重启成功" /bin/true || action "$services_name 重启失败" /bin/false

elif [ $num -eq 4 ];then
    systemctl status $services_name
    [ $? -eq 0 ] && action "$services_name 服务正常运行中" /bin/true || action "$services_name 服务未运行" /bin/false
else
    echo "请输入正确选项!!1 ~ 4"
fi

5.今日作业

前言,所有脚本务必手敲,别复制粘贴,只有手敲,你才会踩一堆坑,单词敲错了,语法忘了,你才能成长!!!

1.完成上述所有脚本练习

2.自主开发脚本,要求如下

1. 猜数字

2. 根据选择安装不同的软件,可选【search,info,update、remove、install】

3. 系统优化脚本
- 根据用户选择,选择对应的apt源【阿里源,清华源】
- 时间同步写入定时任务
- 安装常用基础软件,net-tools vim lsof zip 
- 修改主机名和IP地址

参考答案

#!/bin/bash

# 猜数字游戏
guess_number_game() {
    secret_number=$((RANDOM % 100 + 1))
    attempts=0
    echo "欢迎来到猜数字游戏!我已经选好了一个 1 到 100 之间的数字。"
    while true; do
        echo -n "请输入你的猜测: "
        read guess
        ((attempts++))
        if [[ $guess -eq $secret_number ]]; then
            echo "恭喜你,猜对了!你用了 $attempts 次尝试。"
            break
        elif [[ $guess -lt $secret_number ]]; then
            echo "太小了,再试一次。"
        else
            echo "太大了,再试一次。"
        fi
    done
}

# 软件管理功能
software_management() {
    echo "请选择软件管理操作 [search, info, update, remove, install]:"
    read operation
    case $operation in
        search)
            echo "请输入要搜索的软件名称:"
            read software_name
            yum search $software_name
            ;;
        info)
            echo "请输入要查看信息的软件名称:"
            read software_name
            yum info $software_name
            ;;
        update)
            yum update -y
            ;;
        remove)
            echo "请输入要移除的软件名称:"
            read software_name
            yum remove -y $software_name
            ;;
        install)
            echo "请输入要安装的软件名称:"
            read software_name
            yum install -y $software_name
            ;;
        *)
            echo "无效的操作,请重新输入。"
            ;;
    esac
}

# 系统优化脚本
system_optimization() {
    # 选择 yum 源
    echo "请选择 yum 源 [阿里源, 清华源]:"
    read yum_source
    case $yum_source in
        "阿里源")
            echo "正在切换到阿里源..."
            # 备份并替换 yum 源配置文件,这里仅为示例,具体配置文件内容需根据实际情况修改
            cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
            cat > /etc/yum.repos.d/CentOS-Base.repo << EOF
[base]
name=CentOS-$releasever - Base - Aliyun
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
EOF
            ;;
        "清华源")
            echo "正在切换到清华源..."
            # 备份并替换 yum 源配置文件,这里仅为示例,具体配置文件内容需根据实际情况修改
            cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
            cat > /etc/yum.repos.d/CentOS-Base.repo << EOF
[base]
name=CentOS-$releasever - Base - Tsinghua
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/centos/RPM-GPG-KEY-CentOS-7
EOF
            ;;
        *)
            echo "无效的 yum 源选择,请重新输入。"
            return
            ;;
    esac

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    echo "防火墙已关闭。"

    # 关闭 SELinux
    setenforce 0
    sed -i's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    echo "SELinux 已关闭。"

    # 时间同步写入定时任务
    echo "*/5 * * * * /usr/sbin/ntpdate time.nist.gov" >> /etc/crontab
    echo "时间同步已添加到定时任务。"

    # 安装常用基础软件
    yum install -y wget curl vim net-tools epel-release
    echo "常用基础软件已安装。"

    # 修改主机名和 IP 地址,这里仅为示例,需要根据实际情况修改
    echo "请输入新的主机名:"
    read hostname
    hostnamectl set-hostname $hostname
    echo "请输入新的 IP 地址:"
    read ip_address
    # 这里假设使用 NetworkManager 管理网络,对于不同系统可能需要不同的网络管理工具和配置文件
    nmcli connection modify eth0 ipv4.addresses $ip_address/24
    nmcli connection up eth0
    echo "主机名和 IP 地址已修改。"
}


# 主菜单
while true; do
    echo "请选择功能: [1. 猜数字, 2. 软件管理, 3. 系统优化, 4. 退出]"
    read choice
    case $choice in
        1)
            guess_number_game
            ;;
        2)
            software_management
            ;;
        3)
            system_optimization
            ;;
        4)
            echo "退出程序。"
            exit 0
            ;;
        *)
            echo "无效的选择,请重新输入。"
            ;;
    esac
done

ubuntu系统优化脚本

#!/bin/bash

# 检查是否以 root 身份运行
if [ "$EUID" -ne 0 ]; then
    echo "请以 root 用户运行该脚本"
    exit 1
fi

echo "=== Ubuntu 系统优化脚本 ==="

# 修改 apt 源为阿里云镜像
echo "正在备份并修改 apt 源为阿里云镜像..."
cp /etc/apt/sources.list /etc/apt/sources.list.bak

cat > /etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
EOF

echo "更新 apt 缓存..."
apt update

# 安装基础软件
BASIC_SOFTWARE=("curl" "vim" "git" "htop" "net-tools" "ufw" "build-essential")
echo "安装基础软件: ${BASIC_SOFTWARE[*]}"
apt install -y "${BASIC_SOFTWARE[@]}"

# 配置 UFW 防火墙
echo "配置 UFW 防火墙..."
ufw allow OpenSSH
ufw --force enable

# 设置定时任务
echo "设置定时任务..."
CRON_FILE="/etc/cron.d/system_maintenance"
cat > $CRON_FILE <<EOF
# 自动更新系统包(每天凌晨 2 点)
0 2 * * * root apt update && apt upgrade -y

# 清理系统日志(每周日凌晨 3 点)
0 3 * * 0 root journalctl --vacuum-time=7d
EOF

chmod 644 $CRON_FILE
systemctl restart cron

# 优化系统参数(内核优化)
echo "优化系统内核参数..."
SYSCTL_FILE="/etc/sysctl.conf"
cat >> $SYSCTL_FILE <<EOF

# 网络性能优化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600

# 文件描述符优化
fs.file-max = 65535
EOF

sysctl -p

echo "系统优化完成!建议重启以应用所有更改。"
Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2025-01-21 22:47:32

results matching ""

    No results matching ""