Bash 脚本:使用 firewalld 打开 TCP 端口

function open_tcp_port(){
#$1=port
#$2=zone if have, default is public

if [ -z $2  ]; then
    zone="public"
else
    zone=$2
fi
   open_firewall
   if [ $? -eq 0 ]; then
       echo "firewall-cmd --zone=$zone --query-port=$1/tcp" >> "${logfile}"
      firewall-cmd --zone=$zone --query-port=$1/tcp >> "${logfile}"
      if [ $? -eq 0 ]; then
         echo_message "port $1 has opened"
         return 0
      elif [ $? -eq 254 ]; then
         echo_fail "Invalid port:$1"
         return 1
      else
            echo "firewall-cmd --zone=$zone --add-port=$1/tcp --permanent" >> "${logfile}"
         firewall-cmd --zone=$zone --add-port=$1/tcp --permanent >> "${logfile}"

         echo "firewall-cmd --reload" >> "${logfile}"
            firewall-cmd --reload >> "${logfile}"

            echo "firewall-cmd --zone=$zone --query-port=$1/tcp" >> "${logfile}"
         firewall-cmd --zone=$zone --query-port=$1/tcp >> "${logfile}"

         if [ $? -eq 0 ]; then
                echo "open tcp port $1 success" >> "${logfile}"
            return 0
         else
            echo_fail "open tcp port $1 failed"
            return 1
         fi
      fi
   else
       echo_fail "open tcp port $1 failed as firewalld start failed."
      return 1
   fi
}
这段代码是一个 Bash 脚本函数,用于在 Linux 系统中使用 `firewalld` 服务打开 TCP 端口。`firewalld` 是一个动态防火墙管理工具,用于管理防火墙规则。下面是对这段代码的详细解释:

### 函数定义
function open_tcp_port(){
定义了一个名为 `open_tcp_port` 的函数。

### 参数
#$1=port
#$2=zone if have, default is public
函数接受两个参数:
- `$1`:要打开的 TCP 端口号。
- `$2`:防火墙区域(zone),如果没有提供,默认为 `public`。

### 区域设置
if [ -z $2  ]; then
    zone="public"
else
    zone=$2
fi
这段代码检查是否提供了第二个参数(区域)。如果没有提供,则设置区域为 `public`;如果提供了,则使用提供的区域。

### 调用另一个函数
open_firewall
调用 `open_firewall` 函数(这个函数在代码中没有给出),可能用于启动或检查 `firewalld` 服务的状态。

### 检查 `firewalld` 服务状态
if [ $? -eq 0 ]; then
使用 `$?` 变量检查 `open_firewall` 函数的退出状态。如果状态为 0(表示成功),则继续执行。

### 查询端口状态
echo "firewall-cmd --zone=$zone --query-port=$1/tcp" >> "${logfile}"
firewall-cmd --zone=$zone --query-port=$1/tcp >> "${logfile}"
if [ $? -eq 0 ]; then
    echo_message "port $1 has opened"
    return 0
elif [ $? -eq 254 ]; then
    echo_fail "Invalid port:$1"
    return 1
else
这段代码尝试查询指定区域下的指定端口是否已经打开。如果查询成功(返回状态为 0),则输出端口已打开的消息并返回 0。如果返回状态为 254,表示端口号无效,输出错误消息并返回 1。

### 添加端口规则
echo "firewall-cmd --zone=$zone --add-port=$1/tcp --permanent" >> "${logfile}"
firewall-cmd --zone=$zone --add-port=$1/tcp --permanent >> "${logfile}"
如果端口尚未打开,这段代码将尝试添加一条永久规则以允许该端口的流量。

### 重新加载防火墙规则
echo "firewall-cmd --reload" >> "${logfile}"
firewall-cmd --reload >> "${logfile}"
添加规则后,需要重新加载 `firewalld` 以使规则生效。

### 再次查询端口状态
echo "firewall-cmd --zone=$zone --query-port=$1/tcp" >> "${logfile}"
firewall-cmd --zone=$zone --query-port=$1/tcp >> "${logfile}"
if [ $? -eq 0 ]; then
    echo "open tcp port $1 success" >> "${logfile}"
    return 0
else
    echo_fail "open tcp port $1 failed"
    return 1
fi
重新加载后,再次查询端口状态。如果成功,则记录成功消息并返回 0;如果失败,则记录失败消息并返回 1。

### 处理 `firewalld` 服务启动失败的情况
else
    echo_fail "open tcp port $1 failed as firewalld start failed."
    return 1
fi
}
如果 `firewalld` 服务启动失败(`open_firewall` 函数返回非 0 状态),则输出错误消息并返回 1。

### 举例说明
假设你想要在默认区域 `public` 下打开 TCP 端口 8080,你可以这样调用这个函数:
open_tcp_port 8080
如果 `firewalld` 服务正常运行,并且端口 8080 之前没有被打开,这个函数将添加规则以允许端口 8080 的流量,并重新加载防火墙规则。如果操作成功,你会在日志文件中看到 "open tcp port 8080 success" 的消息。如果失败,你会看到 "open tcp port 8080 failed" 的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值