Linux---常用shell脚本

目录

目录

 一.网络服务

开启network服务

 网口IP配置

 聚合口配置

浮动IP配置

二.ntp服务脚本

三.DNS服务脚本

四.本地YUM源配置

五.防火墙规则配置脚本


 一.网络服务

开启network服务

此脚本用于关闭NetworkManger服务重启network防止服务冲突导致IP配置无法生效

#!/bin/bash

# 获取 NetworkManager 的 Active 状态(去除括号)
status=$(systemctl status NetworkManager | grep 'Active:' | awk '{print $3}' | tr -d '()')

# 检查状态是否不是 dead
if [ "$status" != "dead" ]; then
    echo "NetworkManager is not dead. Stopping NetworkManager and restarting network..."

    # 停止 NetworkManager
    systemctl stop NetworkManager

    # 检查 systemctl stop 的退出状态
    if [ $? -ne 0 ]; then
        echo "Failed to stop NetworkManager."
        exit 1
    fi

    # 重启 network 服务(注意:这个服务名可能因系统而异,例如在某些系统上可能是 'networking')
    systemctl restart network

    # 检查 systemctl restart 的退出状态
    if [ $? -ne 0 ]; then
        echo "Failed to restart network service."
        exit 1
    fi

    echo "NetworkManager stopped and network service restarted successfully."
else
    echo "NetworkManager

 网口IP配置

此脚本用于配置网口IP地址,简化命令行操作

#!/bin/bash
echo -e "\033[32m##此脚本用于配置网卡IP...##\033[0m\n"

# 验证网口名称
validate_interface() {
    ip link show "$1" &>/dev/null || { echo -e "\033[31m错误: 输入的接口 $1 不存在!\033[0m"; exit 1; }
}

# 验证 IP 地址格式
validate_ip() {
    [[ $1 =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo -e "\033[31m错误:输入的IP不正确: $1\033[0m"; exit 1; }
}

# NetworkManager服务配置
NetworkManager_config() {
    local eth=$1
    systemctl restart NetworkManager
    nmcli connection show | grep "$eth" | awk '{print $1}' | xargs -r nmcli connection delete &>/dev/null
    read -p "请选择 1) 静态IP ; 2) DHCP:" num1
    case $num1 in
        1)
            read -p "请输入网口IP:" ip
            read -p "请输入掩码位数(例如:24):" netmask
            validate_ip "$ip"
            nmcli connection add type ethernet con-name $eth ifname $eth ipv4.method manual ipv4.address $ip/$netmask autoconnect yes
            read -p "请输入是否配置网关:1) 是 ; 2) 否:" num3
            [ $num3 -eq 1 ] && read -p "请输入网关:" gateway && nmcli connection modify $eth ipv4.gateway $gateway
            ;;
        2)
            nmcli connection add type ethernet con-name $eth ifname $eth ipv4.method auto autoconnect yes
            ;;
        *)
            echo -e "\033[31m错误:无效的选择,请输入 1 或 2。\033[0m"; exit 1
            ;;
    esac
    nmcli connection up $eth
}

# network 服务配置
network() {
    read -p "请输入网卡名:" eth
    config="/etc/sysconfig/network-scripts/ifcfg-${eth}"
    [ -n "$(ifconfig $eth | grep -w "inet" | awk '{print $2}')" ] && {
        echo -e "\033[31m该网卡已存在IP,是否继续配置!\033[0m"
        read -p "选择(1)是/(2)否:" num
        [ $num -eq 1 ] || exit 1
    }
    [ -z "$(find /etc/sysconfig/network-scripts/ -name "ifcfg-$eth")" ] && {
        echo -e "\033[33m正在创建网卡配置文件...\033[0m"
        cat <<EOF > "$config"
TYPE=Ethernet
BOOTPROTO=none
NAME=$eth
DEVICE=$eth
ONBOOT=yes
EOF
        echo -e "\033[32m创建成功...\033[0m"
    }
    sed -i '/IPADDR\|NETMASK\|GATEWAY\|DNS1/d' "$config"
    read -p "请输入IP:" eth_ip
    read -p "请输入掩码:" eth_mask
    sed -i 's/^ONBOOT=no$/ONBOOT=yes/' "$config"
    sed -i 's/^BOOTPROTO=.*/BOOTPROTO=static/' "$config"
    echo "IPADDR=$eth_ip" >> "$config"
    echo "NETMASK=$eth_mask" >> "$config"
    while true; do
        read -p "配置网关选1,DNS选2,完成/不配置选3:" num
        case $num in
            1)
                read -p "请输入网关IP:" GateWay
                echo "GATEWAY=$GateWay" >> "$config"
                ;;
            2)
                read -p "请输入DNS地址:" DNS
                echo "DNS1=$DNS" >> "$config"
                ;;
            3)
                break
                ;;
            *)
                echo -e "\033[31m无效的选择,请重新输入。\033[0m"
                ;;
        esac
    done
    systemctl disable NetworkManager &>/dev/null && systemctl stop NetworkManager &>/dev/null
    systemctl restart network || { echo "Failed to restart network service."; exit 1; }
    echo "Success to restart network service."
}

# 录入基本信息
read -p "选择网络服务:1)NetworkManager ; 2)network:" num
case $num in
    1)
        read -p "输入网口名称:" eth
        validate_interface "$eth"
        NetworkManager_config "$eth"
        ;;
    2)
        network
        ;;
    *)
        echo -e "\033[31m错误:无效的选择,请输入 1 或 2。\033[0m"
        ;;
esac

 聚合口配置

此脚本用于自动配置聚合口

#!/bin/bash

#删除网卡连接
config(){
    connection1=$(nmcli connection delete $interface1 2>/dev/null)
    connection2=$(nmcli connection delete $interface2 2>/dev/null)
    connection_bond=$(nmcli connection delete bond0 2>/dev/null)
}

# 检查是否存在 bond0 连接
check(){
    if nmcli connection show | grep -q 'bond0'; then
        echo -e "\033[33m警告: 已存在bond0\033[0m"
        read -p "是否删除bond0,请输入(Y/N):" num
        [ "$num" = "Y" ] && config || exit 1
    fi
}

# 验证 IP 地址格式
validate_ip() {
    local ip=$1
    local valid=$(echo "$ip" | grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}$')
    if [ -z "$valid" ]; then
        echo -e "\033[31m错误:输入的IP不正确: $ip\033[0m"
        exit 1
    fi
}

# 验证网口名称
validate_interface() {
    local interface=$1
    if ! ip link show "$interface" &>/dev/null; then
        echo -e "\033[31m错误: 输入的接口 $interface 不存在!\033[0m"
        exit 1
    fi
}

# 通用配置
config1() {
    nmcli connection add type ethernet slave-type bond con-name "$interface1" ifname "$interface1" master bond0 2>/dev/null
    nmcli connection add type ethernet slave-type bond con-name "$interface2" ifname "$interface2" master bond0 2>/dev/null
    nmcli connection modify bond0 ipv4.addresses "$ip_address/24" ipv4.method manual connection.autoconnect yes 2>/dev/null
    nmcli connection modify bond0 connection.autoconnect-slaves 1 2>/dev/null
    nmcli connection up bond0 2>/dev/null
}

# 获取用户输入
config2() {
    read -p "请输入bond口IP:" ip_address
    validate_ip "$ip_address"
    read -p "绑定的网口1:" interface1
    validate_interface "$interface1"
    read -p "绑定的网口2:" interface2
    validate_interface "$interface2"
}

# 配置 bond 口为主备模式
backup_mode() {
    config2
    check
    nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100,primary=$interface1" 2>/dev/null
    config1
    echo -e "\033[32mbond口主备模式配置成功...\033[0m"
    echo -e "\033[33m当前活动网口:\033[0m$interface1"
}

# 配置 bond 口为 bond3 即广播模式
bond3_mode() {
    config2
    check
    nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=broadcast,miimon=100" 2>/dev/null
    config1
    echo -e "\033[32mbond口广播模式配置成功...\033[0m"
}

# 配置 bond 口为bond6 即双向负载均衡
bond6_mode(){
    config2
    check
    nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=balance-alb,miimon=100" 2>/dev/null
    config1
    echo -e "\033[32mbond口负载均衡(双向)模式配置成功...\033[0m"
}

echo -e "\033[32m=== bond口网络模式选择 ===\033[0m"
echo "1. 主备模式:mode=1"
echo "2. 广播模式:mode=3"
echo "3. 负载均衡:mode=6"
echo -e "\033[32m==========================\033[0m"
read -p "请选择网络模式[1-3]:" num

case $num in
    1)
        backup_mode
        ;;
    2)
        bond3_mode
        ;;
    3)
        bond6_mode
        ;;
    *)
        echo -e  "警告:请输入数字[1-3]"
        exit 1
        ;;
esac

# 刷新配置
nmcli connection reload

浮动IP配置

#!/bin/bash
echo -e "\033[32m##此脚本用于配置浮动IP##\033[0m"
echo " "

read -p "输入配置浮动IP的网卡名称:" eth
read -p "输入浮动IP:" floot_ip
read -p "输入浮动IP掩码:" floot_ip_mask
cp /etc/sysconfig/network-scripts/ifcfg-$eth /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "/IPADDR/ d"  /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "/NETMASK/ d" /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "/DNS/ d" /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "/GATEWAY/ d" /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "s/NAME=$eth/NAME=$eth:01/" /etc/sysconfig/network-scripts/ifcfg-$eth:01
sed -i "s/DEVICE=$eth/DEVICE=$eth:01/" /etc/sysconfig/network-scripts/ifcfg-$eth:01
echo "IPADDR=$floot_ip" >> /etc/sysconfig/network-scripts/ifcfg-$eth:01
echo "NETMASK=$floot_ip_mask" >> /etc/sysconfig/network-scripts/ifcfg-$eth:01
systemctl restart network
ifup $eth:01

二.ntp服务脚本

#!/bin/bash

# 检查chrony服务是否安装
function_chrony_check() {
    rpm -q chrony > /dev/null 2>&1 || { echo "对时服务未安装,正在安装..."; function_yum; }
}

# 安装chrony服务
function_yum() {
    yum install -y chrony > /dev/null 2>&1 || { echo "安装失败,请检查yum源..."; exit 1; }
    echo "对时服务安装成功..."
}

# 重启chrony服务
function_chrony_restart() {
    systemctl restart chronyd.service
    [ $? -eq 0 ] && echo "对时服务启动成功..." || { echo -e "\033[31m对时服务启动失败"; exit 1; }
}

# 防火墙配置
function_firewalld() {
    status=$(systemctl status firewalld | grep "Active" | awk '{print $3}' | tr -d "()")
    if [ "$status" == "running" ]; then
        firewall-cmd --add-port=123/udp --permanent 2>&1 | grep -v "ALREADY_ENABLED"
        firewall-cmd --add-port=123/udp --permanent 2>&1 | grep -v "ALREADY_ENABLED"
        firewall-cmd --reload
    fi
}

# 时间同步状态检查
function ntp_status_check() {
    echo -e "\033[33m检查客户端对时状态,过程持续一分钟...\033[0m"
    MAX_WAIT_TIME=60
    START_TIME=$(date +%s)
    hostname=$(grep "$ntp_source_ip" /etc/hosts | awk '{print $2}')
    while true; do
        ELAPSED_TIME=$(( $(date +%s) - START_TIME ))
        if [ $ELAPSED_TIME -gt $MAX_WAIT_TIME ];then
                echo -e "\033[31m对时失败\033[0m";exit 1
        fi
        if chronyc sources | grep -q "^\\s*\\^\\*\\s*$ntp_source_ip";then
                 echo -e "\033[32m对时成功...\033[0m";break;
        fi
        if chronyc sources | grep -q "^\\s*\\^\\*\\s*$hostname";then
                echo -e "\033[32m对时成功...\033[0m";break;
        fi
        sleep 5
    done
}

# 时间源配置
function_ntp_source() {
    read -p "请输入允许对时的网段(如:192.168.1.0):" ntp_client_ip
    read -p "请输入掩码位数(如:24):" mask
    num1=$(grep "iburst" /etc/chrony.conf | head -n 1 | awk '{print $1}')
    num2=$(grep "iburst" /etc/chrony.conf | head -n 1 | awk '{print $2}')
    sed -i "s/^${num1} ${num2} iburst/${num1} 127.127.1.0 iburst/g" /etc/chrony.conf
    sed -i "s/^#allow 192.168.0.0\/16/allow ${ntp_client_ip}\/${mask}/g" /etc/chrony.conf
    sed -i "s/^#local stratum 10/local stratum 10/" /etc/chrony.conf
    hwclock -w
    function_firewalld
    function_chrony_restart
}

# 客户端配置
function_ntp_client() {
    read -p "请输入时间源服务器IP:" ntp_source_ip
    ping -c 3 -W 1 "$ntp_source_ip" > /dev/null 2>&1
    [ $? -eq 0 ] && echo "时间源IP地址正确..." || { echo "客户端无法ping通时间源!!!"; exit 1; }
    num1=$(grep "iburst" /etc/chrony.conf | head -n 1 | awk '{print $1}')
    num2=$(grep "iburst" /etc/chrony.conf | head -n 1 | awk '{print $2}')
    sed -i "s/^${num1} ${num2} iburst/${num1} ${ntp_source_ip} iburst/g" /etc/chrony.conf
    function_firewalld
    function_chrony_restart
    ntp_status_check
}

# 选择配置时间源/客户端
function_choose() {
    echo -e "\033[32m===\033[0m此脚本用于配置对时服务...\033[32m===\033[0m"
    echo -e "===\033[33m请先配置时间源...\033[0m==="
    echo " "
    read -p "请选择配置时间源(1)/客户端(2):" num
    [ $num -eq 1 ] && function_ntp_source || function_ntp_client
}

function_chrony_check
function_choose

三.DNS服务脚本

正向解析:

#!/bin/bash
echo -e "\033[32m此脚本用于配置DNS正向解析...\033[0m"
echo -e "\033[32m使用案例:\033[0m若要解析www.baiduu.com,顶级域名输入:baidu.com,子域名输入:www"
echo " "
#检查是否安装dns服务
dns_yum_check(){
        dns_yum=$(rpm -qa bind)
        if [ -z "$dns_yum" ];then
                echo -e "\033[31mDNS服务未安装,尝试安装DNS服务...\033[0m"
                yum install bind -y
                if [ $? -eq 1 ];then
                        echo -e "\033[31mDNS服务安装失败,请检查YUM源!!!\033[0m"
                fi
        else
                echo -e "\033[32mDNS服务已安装,进入配置环节...\033[0m"
        fi
        echo " "
}

#DNS配置文件初始化函数
initialize_config(){
        read -p "请输入顶级域名(如:baidu.com):" father_dns
        father_dns1=$(grep -w "zone" /etc/named.conf | awk '{print $2}' | tr -d '"')
        named_ca=$(grep -iE '^\s*file\s+"\S*"' /etc/named.conf | awk 'NR==2 {gsub(/[";]/, ""); print $2}')
        sed -i "s/127.0.0.1/any/" /etc/named.conf
        sed -i "s/localhost;/any;/" /etc/named.conf
}

#部署DNS正向解析
forward_resolution(){
        initialize_config
        sed -i "s/zone \"${father_dns1}\" IN/zone \"${father_dns}\" IN/" /etc/named.conf /etc/named.conf
        sed -i "s/type hint/type master/" /etc/named.conf
        sed -i "s/$named_ca/named.${father_dns}/" /etc/named.conf
        son_dns_config
}

#初始化函数2
initialize_config2(){
        read -p "请输入顶级域名的子域名(如:www):" son_dns
        read -p "请输入子域名映射的IP:" son_dns_ip
        echo "${son_dns} IN A ${son_dns_ip}" >> /var/named/named.$father_dns
}

#部署子域名与IP映射关系
son_dns_config(){
        touch /var/named/named.$father_dns
        cp /var/named/named.localhost /var/named/named.$father_dns
        ns_dns=$(hostname)
        eth=$(ip a | grep "^2" | awk -F ":" '{print $2}')
        ns_ip=$(ifconfig $eth | grep -w "inet" |awk '{print $2}')
        sed -i "/NS/ d" /var/named/named.$father_dns
        sed -i "/127.0.0.1/ d" /var/named/named.$father_dns
        sed -i "/AAAA/ d" /var/named/named.$father_dns
        sed -i "s/@/ns.${ns_dns}/2" /var/named/named.$father_dns
        echo " IN  NS     ns.${ns_dns}." >> /var/named/named.$father_dns
        echo "ns IN A ${ns_ip}" >> /var/named/named.$father_dns
        initialize_config2
        other_sondns_config
}

#部署其它子域名
other_sondns_config(){
        read -p "是否继续配置其他子域名-->选择:(1)是/(2)否:" num
        if [ $num -eq 1 ];then
                initialize_config2
        fi
        echo " "
        echo "若要配置额外的正向解析,请执行单独的脚本,详见博客链接:https://blog.youkuaiyun.com/zhoutong2323/article/details/143810052"
}

#重启DNS服务并关闭防火墙
service(){
systemctl restart named.service
if [ $? -eq 0 ];then
        echo -e "\033[32mDNS正向解析配置成功...\033[0m"
else
        echo -e "\033[31mDNS正向解析配置失败!!!\033[0m"
fi
systemctl stop firewalld
setenforce 0
}

dns_yum_check
forward_resolution
service

配置额外的正向解析脚本

#!/bin/bash
echo -e "\033[32m此脚本用于配置额外的DNS正向解析...\033[0m"
echo -e "\033[31m执行此脚本前请先执行DNS正向解析脚本进行初始化配置!!\033[0m"

#部署正向解析
forward_resolution(){
        read -p "请输入顶级域名(如:baidu.com):" father_dns
        echo "zone \"$father_dns\" IN {
                type master;
                file \"named.$father_dns\";
                };" >> /etc/named.conf
        initialize_function
        son_dns_config
}

#初始化函数
initialize_function(){
        touch /var/named/named.$father_dns
        cp /var/named/named.localhost /var/named/named.$father_dns
        ns_dns=$(hostname)
        eth=$(ip a | grep "^2" | awk -F ":" '{print $2}')
        ns_ip=$(ifconfig $eth | grep -w "inet" |awk '{print $2}')
        sed -i "/NS/ d" /var/named/named.$father_dns
        sed -i "/127.0.0.1/ d" /var/named/named.$father_dns
        sed -i "/AAAA/ d" /var/named/named.$father_dns
        sed -i "s/@/ns.${ns_dns}/2" /var/named/named.$father_dns
        echo " IN  NS     ns.${ns_dns}." >> /var/named/named.$father_dns
        echo "ns IN A ${ns_ip}" >> /var/named/named.$father_dns
}

#部署IP与域名的反向解析
son_dns_config(){
        read -p "请输入顶级域名的子域名(如:www)::" son_dns
        read -p "请输入子域名对应的IP:" son_ip
        echo "${son_dns} IN A ${son_ip}." >> /var/named/named.$father_dns
        other_dns_config
}

#部署其他IP反向解析
other_dns_config(){
        read -p "是否继续配置其他IP反向解析-->选择:(1)是/(2)否:" num
        if [ $num -eq 1 ];then
                son_ip_config
        fi
}

#重启DNS服务
dns_restart(){
systemctl restart named
if [ $? -eq 0 ];then
        echo -e "\033[32mDNS反向解析配置成功...\033[0m"
else
        echo -e "\033[31mDNS反向解析配置失败!!!\033[0m"
fi
}

forward_resolution
dns_restart

反向解析:

#!/bin/bash
echo -e "\033[32m此脚本用于配置DNS反向解析,执行前请先执行DNS正向解析脚本...\033[0m"
echo " "
echo -e "\033[31m以IP:192.168.1.200解析为www.baidu.com为例-->\033[0m"
echo -e "\033[32m使用方法:\033[0m\033[31m反向解析的IP网络位输入时需要从右向左输入,如:1.168.192!!!\033[0m"
echo -e " "

#部署反向解析
Reverse_Resolution(){
        read -p "请输入反向解析IP的网络位(按照使用方法输入!):" reserve_ip
        echo "zone \"$reserve_ip.in-addr.arpa\" IN {
                type master;
                file \"named.$reserve_ip\";
                };" >> /etc/named.conf
        initialize_function
        son_ip_config
}

#初始化函数
initialize_function(){
        touch /var/named/named.$reserve_ip
        cp /var/named/named.localhost /var/named/named.$reserve_ip
        ns_dns=$(hostname)
        sed -i "/NS/ d" /var/named/named.$reserve_ip
        sed -i "/127.0.0.1/ d" /var/named/named.$reserve_ip
        sed -i "/AAAA/ d" /var/named/named.$reserve_ip
        sed -i "s/@/ns.${ns_dns}/2" /var/named/named.$reserve_ip
        echo " IN  NS     ns.${ns_dns}." >> /var/named/named.$reserve_ip
}

#部署IP与域名的反向解析
son_ip_config(){
        read -p "请输入反向解析IP的主机位(如:200):" reserve_ip2
        read -p "请输入IP对应的域名(如:www.baidu.com):" dns
        echo "${reserve_ip2} IN PTR ${dns}." >> /var/named/named.$reserve_ip
        other_ip_config
}

#部署其他IP反向解析
other_ip_config(){
        read -p "是否继续配置其他IP反向解析-->选择:(1)是/(2)否:" num
        if [ $num -eq 1 ];then
                son_ip_config
        fi
}

#重启DNS服务
dns_restart(){
systemctl restart named
if [ $? -eq 0 ];then
        echo -e "\033[32mDNS反向解析配置成功...\033[0m"
else
        echo -e "\033[31mDNS反向解析配置失败!!!\033[0m"
fi
}

Reverse_Resolution
dns_restart

四.本地YUM源配置

#!/bin/bash
# 检查是否以 root 权限运行
[ "$(id -u)" -ne 0 ] && { echo -e "\033[31m请使用 root 权限执行此脚本。\033[0m"; exit 1; }

echo -e "\033[32m===\033[0m此脚本用于自动配置本地 YUM 源...\033[32m===\033[0m"

# 查找 ISO 文件
iso_file=$(find /opt -type f -name "*.iso")
[ -z "$iso_file" ] && { echo -e "\033[33m请上传当前系统的 iso 文件至 /opt 目录..\033[0m"; exit 1; }

# 生成唯一的本地 YUM 源配置文件名,避免冲突
local_repo_file="/etc/yum.repos.d/local_$(date +%s).repo"

# 创建本地 YUM 源配置文件
cat << EOF > "$local_repo_file"
[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF

# 添加 ISO 挂载信息到 fstab
grep -q "$iso_file /mnt" /etc/fstab || echo "$iso_file /mnt iso9660 loop,defaults 0 0" >> /etc/fstab

# 执行挂载操作并处理结果
mount_output=$(mount -a 2>&1)
if [ $? -ne 0 ]; then
    echo "$mount_output" | grep -q "write-protected" \
        && echo -e "\033[32m镜像文件 ISO 默认以只读模式挂载,不会影响 YUM 源使用\033[0m" \
        || { echo -e "\033[31m挂载 ISO 文件失败,请检查相关配置。\033[0m"; exit 1; }
else
    echo -e "\033[32m镜像文件挂载成功..\033[0m"
fi

# 清理 YUM 缓存并检查结果
yum clean all > /dev/null 2>&1 || { echo -e "\033[31m清理 YUM 缓存失败,请检查 YUM 源配置。\033[0m"; exit 1; }

# 生成 YUM 缓存并检查结果
yum makecache > /dev/null 2>&1 || { echo -e "\033[31m生成 YUM 缓存失败,请检查 YUM 源配置。\033[0m"; exit 1; }

echo -e "\033[32mYUM 源部署成功!\033[0m"

五.防火墙规则配置脚本

if ! systemctl is-active --quiet firewalld; then
    echo "firewalld 服务未运行,正在启动..."
    systemctl start firewalld
    if [ $? -ne 0 ]; then
        echo "无法启动 firewalld 服务,请检查。"
        exit 1
    fi
    systemctl enable firewalld
fi

function_five(){
    # 提示用户输入五元组信息
    read -p "请输入源 IP 地址: " src_ip
    read -p "请输入目的 IP 地址: " dst_ip
    read -p "请输入源端口: " src_port
    read -p "请输入目的端口: " dst_port
    read -p "请输入协议 (tcp/udp): " protocol

    # 提示用户选择操作(拒绝或放行)
    echo "请选择操作:"
    echo "1. 拒绝"
    echo "2. 放行"
    read -p "输入选项 (1/2): " choice
}

# 询问是否配置区域规则
read -p "是否要配置区域规则?(y/n): " configure_zone

if [ "$configure_zone" = "y" ]; then
    # 获取可用区域列表
    zones=$(firewall-cmd --get-zones)
    echo "可用区域: $zones"
    read -p "请输入要使用的区域: " zone

    # 获取可用接口列表
    interfaces=$(ip link show | awk -F': ' '{print $2}' | grep -v '^lo$')
    echo "可用接口: $interfaces"
    read -p "请输入要加入区域的接口: " interface

    # 将接口加入指定区域
    firewall-cmd --permanent --zone="$zone" --add-interface="$interface"
    if [ $? -eq 0 ]; then
        echo "接口 $interface 已成功加入区域 $zone。"
    else
        echo "将接口 $interface 加入区域 $zone 失败。"
        exit 1
    fi

    function_five

    # 生成规则字符串
    if [ "$choice" = "1" ]; then
        action="reject"
    else
        action="accept"
    fi
    rule='rule family="ipv4" source address="'$src_ip'" destination address="'$dst_ip'" port port="'$dst_port'" protocol="'$protocol'" '$action

    # 检查规则是否已经存在
    existing_rules=$(firewall-cmd --permanent --zone="$zone" --list-rich-rules)
    if echo "$existing_rules" | grep -q "$rule"; then
        echo "规则已经存在,正在删除原有规则..."
        firewall-cmd --permanent --zone="$zone" --remove-rich-rule="$rule"
        if [ $? -eq 0 ]; then
            echo "原有规则删除成功。"
        else
            echo "原有规则删除失败。"
            exit 1
        fi
    fi

    # 重新添加规则
    firewall-cmd --permanent --zone="$zone" --add-rich-rule="$rule"
    if [ $? -eq 0 ]; then
        echo -e  "\033[32m规则已成功添加到规则链表末尾,将被最后执行\033[0m"
        echo "正在重新加载防火墙规则..."
        firewall-cmd --reload
        if [ $? -eq 0 ]; then
            echo "防火墙规则重新加载成功。"
        else
            echo "防火墙规则重新加载失败。"
        fi
    else
        echo "规则添加失败。"
    fi
else
    function_five

    # 生成规则字符串
    if [ "$choice" = "1" ]; then
        action="reject"
    else
        action="accept"
    fi
    rule='rule family="ipv4" source address="'$src_ip'" destination address="'$dst_ip'" port port="'$dst_port'" protocol="'$protocol'" '$action

    # 检查规则是否已经存在
    existing_rules=$(firewall-cmd --permanent --list-rich-rules)
    if echo "$existing_rules" | grep -q "$rule"; then
        echo "规则已经存在,正在删除原有规则..."
        firewall-cmd --permanent --remove-rich-rule="$rule"
        if [ $? -eq 0 ]; then
            echo "原有规则删除成功。"
        else
            echo "原有规则删除失败。"
            exit 1
        fi
    fi

    # 重新添加规则
    firewall-cmd --permanent --add-rich-rule="$rule"
    if [ $? -eq 0 ]; then
        echo -e "\033[32m规则已成功添加到规则链表末尾,将被最后执行\033[0m"
        echo "正在重新加载防火墙规则..."
        firewall-cmd --reload
        if [ $? -eq 0 ]; then
            echo "防火墙规则重新加载成功。"
        else
            echo "防火墙规则重新加载失败。"
        fi
    else
        echo "规则添加失败。"
    fi
fi


 


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北 染 星 辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值