scan_ports() { local host=${1:-localhost} local ports=("80""443""8080""3306""6379""9000") echo"扫描 $host 的常用端口..." echo"================================" for port in"${ports[@]}"; do iftimeout 1 bash -c "cat < /dev/null > /dev/tcp/$host/$port" 2>/dev/null; then echo"✓ 端口 $port 开放" # 显示占用信息 check_process "$port" else echo"✗ 端口 $port 关闭或不可达" fi done }
check_process() { local port=$1 local process=$(ss -lntp sport = :$port 2>/dev/null | tail -1 | awk '{print $NF}') if [ -n "$process" ]; then echo" 进程: $process" fi }
monitor_ports() { local changed=0 for port in"${MONITOR_PORTS[@]}"; do local status=$(check_port_status "$port") local last_status=$(get_last_status "$port") if [ "$status" != "$last_status" ]; then log_port_change "$port""$last_status""$status" changed=1 fi save_status "$port""$status" done return$changed }
check_port_status() { local port=$1 if ss -lnt sport = :$port &>/dev/null; then echo"open" else echo"closed" fi }
log_port_change() { local port=$1 local old=$2 local new=$3 echo"[$(date)] 端口 $port 状态变化: $old -> $new" # 发送告警 send_alert "端口状态变化""端口 $port: $old -> $new" }
main() { whiletrue; do if monitor_ports; then echo"检测到端口变化" fi sleep 60 done }
check_conflict() { local port=$1 local service=$2 # 检查端口是否被占用 if ss -lnt sport = :$port &>/dev/null; then local process=$(ss -lntp sport = :$port | grep -oP 'pid=\K\d+') if [ -n "$process" ]; then local cmd=$(ps -p $process -o cmd=) echo"警告: 端口 $port 已被占用" echo" 进程: $cmd" echo" PID: $process" # 询问是否终止 read -p "是否终止该进程? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then kill -9 $process echo"进程已终止" fi fi fi }
free_port() { local port=$1 if [ -z "$port" ]; then echo"用法: $0 <端口号>" exit 1 fi echo"检查端口 $port 占用情况..." # 查找占用进程 local pids=$(lsof -ti :$port 2>/dev/null) if [ -z "$pids" ]; then echo"端口 $port 未被占用" exit 0 fi echo"发现以下进程占用端口 $port:" for pid in$pids; do local cmd=$(ps -p $pid -o cmd=) echo" PID: $pid, 命令: $cmd" done read -p "是否终止这些进程? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then kill -9 $pids echo"端口已释放" else echo"操作已取消" fi }
free_port "$@"
5.2 批量释放端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/bin/bash # free_multiple_ports.sh - 批量释放端口
PORTS=(3000 8080 9000)
for port in"${PORTS[@]}"; do echo"检查端口 $port..." local pids=$(lsof -ti :$port 2>/dev/null) if [ -n "$pids" ]; then echo"释放端口 $port..." kill -9 $pids echo"端口 $port 已释放" else echo"端口 $port 未被占用" fi done
check_critical_ports() { for port in"${CRITICAL_PORTS[@]}"; do # 检查端口是否监听 if ! ss -lnt sport = :$port &>/dev/null; then send_alert "关键端口关闭""端口 $port 未监听" continue fi # 检查连接数 local conn_count=$(ss -tn state established dport = :$port 2>/dev/null | wc -l) if [ "$conn_count" -gt "$ALERT_THRESHOLD" ]; then send_alert "端口连接数异常""端口 $port 连接数: $conn_count" fi done }
send_alert() { local subject=$1 local message=$2 echo"$message" | mail -s "$subject" admin@example.com curl -X POST "$WEBHOOK_URL" \ -H 'Content-Type: application/json' \ -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$subject: $message\"}}" }
if [ -z "$PORT" ]; then echo"用法: $0 <端口号>" exit 1 fi
echo"=== 端口 $PORT 故障排查 ===" echo""
# 1. 检查端口占用 echo"1. 检查端口占用:" if lsof -i :$PORT &>/dev/null; then echo"✓ 端口被占用" lsof -i :$PORT else echo"✗ 端口未被占用" fi echo""
# 2. 检查防火墙 echo"2. 检查防火墙:" ifcommand -v firewall-cmd &> /dev/null; then if firewall-cmd --query-port=$PORT/tcp &>/dev/null; then echo"✓ 端口在防火墙中" else echo"✗ 端口未在防火墙中" fi elifcommand -v iptables &> /dev/null; then if iptables -L -n | grep ":$PORT" &>/dev/null; then echo"✓ 端口在iptables中" else echo"✗ 端口未在iptables中" fi fi echo""
if [ -z "$PORT" ]; then echo"用法: $0 <端口号>" exit 1 fi
echo"解决端口 $PORT 冲突..."
# 查找占用进程 PIDS=$(lsof -ti :$PORT 2>/dev/null)
if [ -z "$PIDS" ]; then echo"端口 $PORT 未被占用" exit 0 fi
echo"找到占用进程:" for pid in$PIDS; do ps -p $pid -o pid=,user=,cmd= done
echo"" read -p "是否终止这些进程? (y/n) " -n 1 -r echo
if [[ $REPLY =~ ^[Yy]$ ]]; then echo"终止进程..." kill -9 $PIDS sleep 2 if ss -lnt sport = :$PORT &>/dev/null; then echo"✗ 端口仍被占用" else echo"✓ 端口已释放" fi else echo"操作已取消" fi