脚本模块化

脚本模块化巡检

例子1,

创建三个小脚本,然后在主脚本里调用这三个

vim cpu.sh

复制代码
#!/bin/bash
cpu1(){
        echo "====CPU信息===="
        lscpu | grep -E "型号名称:|架构:|CPU:"
}

vim mem.sh

复制代码
#!/bin/bash
mem1(){
        echo "====内存信息===="
        echo "$(free -h)"

}

vim disk.sh

复制代码
#!/bin/bash

disk1(){
        echo "====磁盘信息===="
        df -h --output=source,pcent,target | column -t
}

vim xunjian.sh

复制代码
#!/bin/bash
echo "====正在巡检===="
source /root/cpu.sh
source /root/mem.sh
source /root/disk.sh

#调用
cpu1
sleep 1
mem1
sleep 1
disk1

例子2,

本脚本旨在通过模块化的方式对 Linux 系统进行初始化配置。通过选择不同的选项,用户可以实现一键系统优化、SSH配置、MySQL安装、Nginx安装、静态IP配置等操作。脚本适用于 CentOS Stream 8/9、RHEL、Rocky Linux、AlmaLinux 等 Linux 系统。(10个小脚本一个主脚本)

主文件配置

main.sh

复制代码
mkdir server_init && cd server_init
vim main.sh

#!/bin/bash
# 引入所有模块(仅加载函数,不执行)
source ./optimize_system.sh
source ./configuration_tencent_repo.sh
source ./configure_ssh.sh
source ./configure_time_sync.sh
source ./configure_dns.sh
source ./configure_firewall.sh
source ./install_basic_tools.sh
source ./install_mysql.sh
source ./install_nginx.sh
source ./configure_static_ip.sh
# 选项菜单(按照图片中的顺序)
echo "请选择操作"
echo "0. 执行所有操作"
echo "1. 优化Linux系统"
echo "2. 配置腾讯云源"
echo "3. 配置SSH"
echo "4. 配置时间同步"
echo "5. 配置DNS"
echo "6. 配置防火墙"
echo "7. 安装常用工具"
echo "8. 安装MySQL"
echo "9. 安装Nginx"
echo "10. 配置静态IP"
#获取用户输入
read -p "请输入选项(1-10):"choice
#根据选项执行相应操作
case $choice in
        0)
                echo "正在执行所有操作..."
                optimize_system
                configuration_tencent_repo
                cofigure_ssh
                configure_time_sync
                configure_dns
                configure_firewall
                install_basic_tools
                install_mysql
                install_nginx
                configure_static_ip
                ;;
        1)
                echo "正在优化linux系统..."
                optimize_system
                ;;
        2)
                echo "正在配置腾讯云源"
                configuration_tencent_repo
                ;;
        3)
                echo "正在配置SSH..."
                configure_ssh
                ;;
        4)
                echo "正在配置同步时间..."
                configure_time_sync
                ;;
        5)
                echo "正在配置DNS..."
                configure_dns
                ;;
        6)
                echo "正在配置防火墙..."
                configure_firewall
                ;;
        7)
                echo "正在安装常用工具..."
                install_basic_tools
                ;;
        8)
                echo "正在安装MySQL..."
                install_mysql
                ;;
        9)
                echo "正在安装nginx..."
                install_nginx
                ;;
        10)
                echo "正在配置静态ip..."
                configure_static_ip
                ;;
        *)
                echo "选择无效,请输入0-10之间的数字"
                ;;
esac

为什么创建一个叫 server_init 的文件夹?

把所有初始化脚本「打包管理」,避免文件散落

如果不创建文件夹,这些文件会直接散落在当前目录里,和系统文件混在一起,很难区分哪些是你的初始化脚本。创建 server_init 文件夹后,所有脚本都放在里面,结构非常清晰

source ./xxx.sh 是 Bash 里的导入脚本 命令,它的核心作用是:

  • xxx.sh 里定义的所有函数(比如 optimize_system()、configure_ssh()),直接加载到当前的 main.sh 脚本环境里。
  • 这样你在 main.sh 后面的菜单选项里,才能直接调用这些函数(比如 optimize_system),否则会报错 command not found

read -p "请输入选项(1-10):" choice

读取用户输入的选项,存到 $choice 变量里

case 语句处理用户选择

  • case 语句会根据 $choice 的值,执行对应的函数
    1. 选项会一次性执行所有模块的初始化操作
  • *) 是默认分支,处理用户输入无效数字的情况

系统优化(基础优化脚本)

  • 关闭 SELinux:临时 + 永久关闭,避免 SELinux 阻止服务运行。
  • 加载桥接模块:为虚拟化 / 容器网络做准备。
  • 开启 IP 转发:让系统具备路由转发能力,支持 NAT、容器网络等场景。
  • 配置内核参数:让修改永久生效,同时设置 ping 响应规则。

optimize_system.sh

复制代码
#!/bin/bash
#优化linux系统
optimize_system(){
echo "优化Linux系统..."
setenforce 0
sed -i -r 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
#
modprobe bridge
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf
sysctl -p >/dev/null 2>&1
echo "Linux系统优化完成"

setenforce 0 临时关闭 SELinux 的强制模式,改成宽容模式(Permissive)

sed -i -r 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

修改配置文件,让系统重启后 SELinux 也保持关闭状态,和上面的 setenforce 0 配合,实现 "临时 + 永久" 双重关闭

  1. sed:流编辑器,用来修改文本文件。
  2. -i:直接修改文件本身(in-place),而不是输出到终端。
  3. -r:使用扩展正则表达式,不用写太多转义符。
  4. 's/^SELINUX=.*/SELINUX=disabled/g':
    1. s/原内容/新内容/g:替换命令,g 表示全局替换。
    2. ^SELINUX=.:匹配以 SELINUX= 开头的任意行(. 表示任意字符)。
    3. 把匹配到的行,替换成 SELINUX=disabled。
  5. /etc/selinux/config:目标文件,SELInux 的配置文件。

modprobe bridge 加载 Linux 内核里的 bridge(桥接)模块

echo 1 > /proc/sys/net/ipv4/ip_forward 临时开启 Linux 的 IP 转发功能

  1. IP 转发,简单说就是让 Linux 系统可以把收到的 IP 包,转发到其他网络接口上。
  2. 常用于路由器、NAT 网关、VPN 服务器、Docker/K8s 网络等场景,让系统具备 "路由转发" 能力
  3. echo 1 表示开启,echo 0 表示关闭。
  4. 这个修改是临时生效 的,重启后会恢复默认(默认是 0,关闭状态)

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf上一条是临时生效,这条是写入配置文件永久生效,配合使用就不会因为重启失效了。

  1. :追加写入文件,不会覆盖原有内容。

  2. /etc/sysctl.conf:系统内核参数的配置文件,系统启动时会读取这里的配置。
  3. net.ipv4.ip_forward=1:告诉内核,把 IP 转发的参数设为 1(开启)。

echo "net.ipv4.icmp_echo_ignore_all=0" >> /etc/sysctl.conf:

  1. 控制系统是否响应 ICMP echo 请求(也就是 ping 包)。
  2. 0 表示响应 ping ,1 表示忽略所有 ping(别人 ping 不通你)。
  3. 这里设为 0,就是让系统正常响应 ping,方便网络测试。

sysctl -p >/dev/null 2>&1:

  1. sysctl -p:重新加载 /etc/sysctl.conf 的配置,让刚才修改的内核参数立刻生效,不用重启系统。
  2. /dev/null 2>&1:把命令的输出(标准输出和错误输出)都丢到 /dev/null(黑洞)里,终端不会显示任何内容,让脚本运行更干净。

>/dev/null 2>&1 stdout + stderr 都丢黑洞 所有 Shell 通用跨 Shell 兼容脚本、老系统&>/dev/null 同上仅 Bash 支持只在 Bash 环境运行的脚本,代码更简洁

配置腾讯云源

  1. 创建备份目录,把原来的 .repo 文件全部移走备份。
  2. 用 Here Document 语法,写入腾讯云的 repo 配置文件。
  3. 清理旧缓存,生成新的腾讯云源缓存。

执行完这个脚本后,你的 CentOS Stream 9 系统,就会从默认的官方源,切换到腾讯云的国内镜像源,下载软件的速度会快很多。

configure_tencent_repo.sh

复制代码
#!/bin/bash
#配置腾讯源
configuration_tencent_repo(){
        echo "配置腾讯源..."
        mkdir -p /etc/yum.repos.d/backup
        mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null
        cat > /etc/yum.repos.d/tencent.repo <<EOF
[baseos]
name=CentOS Stream 9 - BaseOS
baseurl=https://mirrors.tencent.com/centos-stream/9-stream/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.tencent.com/centos-stream/RPM-GPG-KEY-CentOS-Stream-9
enabled=1

[appstream]
name=CentOS Stream 9 - AppStream
baseurl=https://mirrors.tencent.com/centos-stream/9-stream/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.tencent.com/centos-stream/RPM-GPG-KEY-CentOS-Stream-9
enabled=1
EOF
dnf clean all >/dev/null 2>&1
dnf makecache >/dev/null 2>&1
echo "腾讯云源配置完成"
}

mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null

把 /etc/yum.repos.d/ 目录下所有以 .repo 结尾的文件,移动到 backup 目录里备份起来。

  • mv:移动文件命令,这里相当于 "剪切 + 粘贴",原文件会被移走。
  • *.repo:通配符,表示所有 .repo 后缀的文件。
  • 2>/dev/null:把 mv 命令的错误输出丢到黑洞里。比如如果 /etc/yum.repos.d/ 里没有 .repo 文件,mv 会报错 "没有匹配的文件",加上这句就不会在终端显示这个错误了。

cat > /etc/yum.repos.d/tencent.repo <<EOF ... EOF

这是整个脚本的核心部分,用来创建腾讯云的 repo 配置文件

  • cat > /etc/yum.repos.d/tencent.repo

用 cat 命令,把后面的文本内容写入 /etc/yum.repos.d/tencent.repo 文件里(> 表示覆盖写入,文件不存在则创建)

什么是 <<EOF ... EOF

这叫「Here Document」,是 Shell 里用来批量写入多行文本的语法。

<<EOFEOF:中间的所有内容,都会被当成文本,写入到目标文件里。EOF 只是一个自定义的结束标记,也可以换成别的词,比如 <<END ... END

dnf clean all >/dev/null 2>&1 清理旧的软件源缓存。

  • dnf clean all:删除系统里缓存的旧 repo 索引、软件包元数据等内容。

dnf makecache >/dev/null 2>&1 生成新的软件源缓存。

  • nf makecache:根据新的 tencent.repo 配置,从腾讯云镜像源下载最新的软件包索引,缓存到本地。
  • 有了缓存,后面用 dnf install 装软件时,系统能更快找到软件包的信息,提升速度。

配置SSH

修改 SSH 端口号(默认 22)

允许 root 用户登录 SSH

允许使用密码登录 SSH核心操作都是修改 /etc/ssh/sshd_config 配置文件。

.sh

复制代码
#!/bin/bash
configure_ssh(){
        #配置ssh端口号
        read -p "请选择端口号(默认为22)"ssh_port
        ssh_port=${ssh_port: -22}
        sed -i "s/^#Port.*/Port $ssh_port/" /etc/ssh/sshd_config
        sed -i "s/^Port.*/Port $ssh_port/" /etc/ssh/sshd_config

        #允许rooot用户登录
        sed -i "s/^#PermitRootLogin.*/PermitRootLogin yes" /etc/ssh/sshd_config
        sed -i "s/^PermitRootLogin no/PermitRootLogin yes" /etc/ssh/sshd_config

        #是否可以用密码登录
        sed -i "s/^#PasswordAuthentication.*$/PasswordAuthentication yes/g" /etc/ssh/sshd_config
        sed -i "s/^PasswordAuthentication.*$/PasswordAuthentication yes/g" /etc/ssh/s
        shd_config


} 

配置端口号

  • read -p "请选择端口号(默认为22)" ssh_port
    • 提示用户输入 SSH 端口号,用户输入的内容会存到变量 ssh_port 里。
  • ssh_port=${ssh_port:-22}
    • 这是 Shell 的变量默认值语法:如果用户没输入(直接回车),ssh_port 就会用默认值 22。
  • sed -i "s/^#Port.*/Port $ssh_port/" /etc/ssh/sshd_config
    • 匹配以 #Port 开头的行(注释掉的端口配置),替换为 Port $ssh_port,把注释解开并设置端口。
  • sed -i "s/^Port.*/Port $ssh_port/" /etc/ssh/sshd_config
    • 匹配以 Port 开头的行(未注释的端口配置),替换为 Port $ssh_port,确保所有端口配置都被改成用户指定的端口。

允许root用户登录

sed -i "s/^#PermitRootLogin.*/PermitRootLogin yes" /etc/ssh/sshd_config

  • 把配置文件里被注释掉的 PermitRootLogin 行,改成 PermitRootLogin yes

sed -i "s/^PermitRootLogin no/PermitRootLogin yes" /etc/ssh/sshd_config

把配置文件里未被注释 的、且值为 no 的 PermitRootLogin 行,改成 yes

  • 有些系统的配置文件里,PermitRootLogin 没有被注释,直接写了 PermitRootLogin no(禁止 root 登录)。
  • 这行命令就是专门处理这种情况,把禁止改成允许

这两行配合起来,能确保不管配置文件里是「注释状态」还是「明确禁止」,最终都会变成「允许 root 登录」。

配置时间同步

chrony 工具给 CentOS/RHEL 系统配置时间同步,确保系统时间和标准时间一致。

configure_time_sync.sh

复制代码
#!/bin/bash
configure_time_sync(){
        yum -y install chrony
        systemctl start chronyd
        systemctl enable chronyd
        chronyc sources
        
echo "时间配置已经完成"

}

chronyc sources

查看 chronyd 当前正在使用的 NTP 时间源,以及同步状态

配置DNS

  • 让用户输入主 / 备用 DNS 服务器地址,默认是 114.114.114.1148.8.8.8
  • 把用户输入的 DNS 写入 /etc/resolv.conf,让系统生效
  • 记录配置结果并提示用户

configure_dns.sh

复制代码
#!/bin/bash
#配置DNS
configure_dns(){
echo "配置DNS中..."
echo "默认主dns: 114.114.114.114"
echo "默认备用dns: 8.8.8.8"

read -p "请输入主dns(回车使用默认):" dns1
dns1=${dns1:-114.114.114.114}
read -p "请输入备用dns(回车使用默认):" dns2
dns2=${dns2:-8.8.8.8}

cat > /etc/resolv.conf <<EOF
nameserver $dns1
nameserver $dns2
EOF

echo "$dns1,$dns2" > /tmp/dns_list.txt
echo "DNS配置完成,主DNS:$dns1,备用DNS:$dns2"

}

:-是一个整体

作用是:如果变量 dns2 为空或未设置,就使用后面的默认值 8.8.8.8;如果变量有值,就用变量本身的值

  • nameserver dns1 这行,是告诉系统:"以后所有的域名解析请求,都先发给 dns1 这个服务器处理"。
  • 没有写域名,是因为系统会在每次解析域名时 ,自动用你配置的 DNS 服务器去查询,而不是把某个域名的 IP 写死在脚本里。

配置防火墙

关闭系统默认的 firewalld 防火墙,并清空 iptables 规则,属于服务器初始化时常见的 "放行所有流量" 的操作,方便后续部署服务。

configure_firewall.sh

复制代码
#!/bin/bash
#配置防火墙
configure_firewall(){
        echo "配置防火墙中..."
        systemctl stop firewalld 2>/dev/null
        systemctl disable firewalld 2>/dev/null
        systemctl status firewalld --no -pager
        
        #清空防火墙规则
        iptables -F
        echo "防火墙配置已完成"
        
}  

加上 --no-pager 后,会一次性输出所有内容,不会进入交互模式,适合在脚本里使用。

iptables -F

  • iptables 是 Linux 系统里传统的防火墙工具,firewalld 是后来推出的前端工具,底层还是用 iptables。
  • -F 参数表示 flush,清空所有链里的规则,让 iptables 回到默认状态(默认是允许所有流量)。
  • 注意:iptables -F 只会清空规则,不会修改默认策略。如果默认策略是 DROP,清空规则后所有流量都会被拒绝;如果默认策略是 ACCEPT,清空后就会放行所有流量。

安装常用工具

在 CentOS/RHEL 系统上,安装一系列服务器运维常用的工具包,方便后续的管理和操作。

install_basic_tools.sh

复制代码
#!/bin/bash
#安装常用工具
install_basic_tools(){
        echo "安装常用工具中..."
        yum install -y epel-release
        yum install -y yum-utils
        dnf -y install vim wget curl net-tools git htop lrzsz tree expect
        echo "常用工具安装完成"
}

epel-release

epel-release 是 CentOS/RHEL 的额外软件源,很多常用工具(比如 htopiftop)在默认源里没有,需要靠 EPEL 源提供。

安装MySQL

vim install_mysql.sh

复制代码
#!/bin/bash
#安装MySQL
install_mysql(){
        echo "开始安装MySQL"
        dnf install mysql-server -y
        
        systemctl enable mysqld
        systemctl status mysqld --no-pager
        echo "MySQL安装完成"
}

安装nginx

install_nginx.sh

复制代码
#!/bin/bash
#安装nginx
install_nginx(){
        echo "安装nginx..."
        dnf install nginx -y
        
        systemctl enable nginx
        systemctl restart nginx
        systemctl status nginx --no-pager
        echo "nginx安装完成"
}

配置静态IP模卡

给 CentOS/RHEL 系统配置静态 IP 地址 的自动化工具,核心是通过修改 NetworkManager 的连接配置文件,把动态获取 IP 改成静态指定

configure_static_ip.sh

复制代码
#!/bin/bash
#配置静态IP 1,获取物理网卡名称,如ens33,ens160 2,根据网卡 + 。nmconnection文件修改静态IP等信
息

#获取主网卡函数
get_active_interface(){
        iface=$(ip route|awk 'NR==1{print $5}')
        [ -z "$iface" ] && iface=$(ip a|grep 'state UP'|awk '{print $2}'|sed 's/://')
        echo "$iface"
}
echo "网卡名称:$iface"

#配置静态ip
configure_static_ip(){
        iface=$(get_active_interface)
        echo "检测到主网卡:$iface"
        read -p "请输入静态IP地址:" static_ip
        while ! [[ "$static_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; do
                echo "输入的IP地址格式有误,请重新输入:"
                read -p "请输入静态IP地址:" static_ip
        done

        read -p "请输入子网掩码(如24):" netmask
        read -p "请输入子网关(如192.168.88.2):" gateway
        if [ -f /tmp/dns_list.txt ]; then
                IFS=',' read -r dns1 dns2 < /tmp/dns_list.txt
        else
                dns1="114.114.114.114"
                dns2="8.8.8.8"
        fi

        config_file="/etc/NetworkManager/system-connections/$iface.nmconnection"
        cat > "$config_file" <<EOF
[connection]
id=$iface
uuid=$(uuidgen)
type=ethernet
autoconnect-priority=-999
interface-name=$iface
timestamp=1728671365

[ethernet]

[ipv4]
method=manual
addresses=$static_ip/$netmask
gateway=$gateway
dns=$dns1;$dns2
[ipv6]

method=ignore

[proxy]
EOF

chmod 600 "$config_file"
nmcli connection reload
nmcli connection up "$iface"

echo "静态IP配置完成"

}

获取主网卡函数

找到当前正在使用的活跃网卡(比如 ens33eth0

ip route|awk 'NR==1{print $5}' 找路由表的第一行第5列

-z "$iface" && ...

  • 如果上一步没找到网卡,就通过 ip a 命令找状态为 UP 的网卡,作为备选。
  • 最后把网卡名存到 $iface 变量里,供后续使用

awk '{print $2}'

  • 作用:取上一步输出的第 2 列内容
  • 上一步输出的行,默认以空格为分隔符,第 2 列就是ens33:(注意后面带一个冒号:)
  • 输出结果:ens33:

sed 's/:/ /'

  • 全称:stream editor,是 Linux 里用来做文本替换、删除、编辑的工具
  • 语法格式:sed 's/要替换的内容/替换成什么/[选项]'
    • s:表示 "替换(substitute)" 操作
    • /:是sed的分隔符 ,用来把 "要替换的内容" 和 "替换后的内容" 分开
  • 这里的作用:把字符串里的冒号:,替换成空格(或直接删除)
    • 输入:ens33:
    • 执行sed 's/:/ /'后:变成ens33 (冒号被换成了空格)

配置静态 IP 的输入与校验

让用户输入 IP、子网掩码、网关,并校验 IP 格式是否合法。

while ! [[ "static_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ ]]:用正则表达式校验 IP 格式,用户输入错误会一直循环,直到输入合法格式的 IP。

  • 子网掩码输入的是前缀长度(比如 24 对应 255.255.255.0),后续配置里会直接用 $netmask 拼接
  • while ! [条件]; do 等价于:"当条件不成立时,继续循环" 。也就是说,只要 IP 格式校验不通过(条件为假),就一直循环。

[[ ... ]] 双中括号

  • 里面的变量、符号处理更安全,不会因为空格、特殊字符出错。

=~ 正则匹配运算符

  • 含义:双中括号[[ ]]里的专用运算符 ,用来判断左边的字符串是否匹配右边的正则表达式。
  • 语法:[[ 字符串 =~ 正则表达式 ]]
    • 匹配成功 → 条件为真
    • 匹配失败 → 条件为假
  • 在这里的作用:判断用户输入的$static_ip是否符合 IP 格式的正则规则。

^[0-9]+.[0-9]+.[0-9]+.[0-9]+$ IP 地址的正则表达式

  • 字符串从头到尾,必须是数字.数字.数字.数字的格式,比如192.168.1.1、10.0.0.5。
  • 它能匹配的 IP:✅ 192.168.88.100
  • ✅ 8.8.8.8
  • 它不能匹配的 IP:❌ 192.168.88(少一段)
  • ❌ 192.168.88.(末尾多了点)
  • ❌ 192.168.88.a(有字母)
  • ❌ 192.168.88.1(前面有空格)

if -f /tmp/dns_list.txt ; then

  • 如果 /tmp/dns_list.txt 这个文件存在,就执行下面的读取 DNS 的代码
  • 让脚本更灵活 ------ 用户可以提前在这个文件里写好 DNS,脚本会自动读取;如果没准备这个文件,就用else里的默认 DNS(114.114.114.114 和 8.8.8.8)

IFS=',' read -r dns1 dns2 < /tmp/dns_list.txt

  • IFS=',' 临时修改分隔符,默认值是空格、制表符、换行符,临时把分隔符改成逗号**,** ,让后面的read命令按逗号来拆分内容
  • 为什么要加IFS=','?因为dns_list.txt里的内容,大概率是114.114.114.114,8.8.8.8
  • 用逗号分隔两个 DNS 地址,所以要让read按逗号拆分
  • read -r 用来从标准输入读取一行内容,并赋值给变量,-r read的安全选项,不把反斜杠\当成转义字符
  • dns1 dns2 要赋值的两个变量,read会把拆分后的内容,依次赋值给这两个变量
  • < /tmp/dns_list.txt 输入重定向 相当于把文件里的一行内容,"喂" 给前面的read命令处理

config_file="/etc/NetworkManager/system-connections/$iface.nmconnection"

定义配置文件路径:

  • /etc/NetworkManager/system-connections/:NetworkManager 存放连接配置文件的目录
  • $iface.nmconnection:文件名是网卡名 + .nmconnection 后缀,比如 ens33.nmconnection

[connection] 段(连接基础信息)

  • id=$iface:连接的名称,这里和网卡名保持一致(比如 ens33)
  • uuid=$(uuidgen):连接的唯一标识,uuidgen 命令会生成一个随机的唯一 ID,用来区分不同的连接
  • type=ethernet:连接类型,这里是以太网(有线网卡)
  • autoconnect-priority=-999:自动连接优先级,数字越小优先级越低,这里设置成极低优先级,避免和其他连接冲突
  • interface-name=$iface:绑定的网卡设备名,和 id 一样指向你的主网卡
  • timestamp=1728671365:配置文件的创建时间戳,date +%s 命令可以生成当前时间的时间戳(你这里写的是固定值,建议改成动态生成)

[ethernet] 段

这里是空的,因为不需要额外配置以太网的物理参数(比如速度、双工模式),保持默认即可。

[ipv4] 段(IPv4 核心配置)

  • method=manual:IPv4 地址获取方式,manual 表示手动配置(也就是静态 IP),如果是 auto 就是 DHCP 自动获取
  • addresses=static_ip/netmask:静态 IP 地址和子网掩码,格式是 IP地址/前缀长度,比如 192.168.1.100/24(对应子网掩码 255.255.255.0)
  • gateway=$gateway:默认网关地址,比如 192.168.1.1
  • dns=dns1;dns2:DNS 服务器地址,多个用分号分隔,比如 114.114.114.114;8.8.8.8

[ipv6] 段

method=ignore:表示忽略 IPv6 配置,不启用 IPv6 地址,只使用 IPv4

[proxy] 段

这里是空的,代表不配置代理服务器,保持默认即可

chmod 600 "$config_file"

修改配置文件的权限为 600

  • 只有文件所有者(root)能读写,其他用户完全不能访问(600 权限)。
  • 如果权限大于 600(比如 644),NetworkManager 会认为文件不安全,直接拒绝加载配置,导致 IP 设置失败

nmcli connection reload

让 NetworkManager 重新读取所有连接配置文件。

nmcli connection up "$iface"

激活你配置的网卡连接,让新的静态 IP 立刻生效。

  • $iface 就是你之前脚本里获取的网卡名(比如 ens33)。
  • 这条命令会让网卡断开再重新连接一次,加载你刚写的静态 IP 配置。
  • 如果配置正确,执行后网卡就会切换到你设置的静态 IP 了。
相关推荐
daad7771 小时前
纪录无人机PID参数配置
linux
数智化精益手记局1 小时前
拆解项目管理平台核心功能:看项目管理平台如何解决跨部门协作难题与多项目并行场景
大数据·运维·数据库·人工智能·产品运营
noipp1 小时前
推荐题目:洛谷 P1737 [NOI2016] 旷野大计算
linux·数据结构·算法
MAXrxc1 小时前
BGP策略
运维·网络
枕星而眠1 小时前
Linux守护进程完全指南:从原理到实战
linux·运维·服务器·c++·后端
网络系统管理1 小时前
第八届江苏技能状元大赛选拔赛信息通信网络运行管理项目模块D网络服务与系统运维-Linux样题解析
linux·运维·网络
不会C语言的男孩2 小时前
Linux 系统编程 · 第 2 章:系统调用与库函数
linux·c语言
坤昱2 小时前
cfs调度类深入解刨——psi科普篇
linux·cfs·psi·cfs调度·eevdf·psi详细分析·linux系统资源监控
骑上单车去旅行2 小时前
openEuler 22.03 离线源码编译 Zabbix 7.0.27 完整最终整合手册
linux·运维·服务器·zabbix