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" 的消息。