diff --git a/bin/update_port.sh b/bin/update_port.sh index 51950d2..f17d6d8 100644 --- a/bin/update_port.sh +++ b/bin/update_port.sh @@ -1,30 +1,57 @@ #!/bin/bash -script_dir=$(cd "$(dirname "$0")"; pwd) # 脚本文件绝对路径 -config_dir="$script_dir/../conf" -source $script_dir/utils/jq_util.sh +# 查找空闲端口 +find_free_port() { + local start="${1:-10001}" + local max="${2:-65535}" -old_port=$(jq -r '.inbounds[0].port' "$config_dir/config.json") -read -p "请输入新的端口[当前端口: $old_port]: " port + # 收集当前监听端口(TCP + UDP) + local used_ports raw + if command -v ss >/dev/null 2>&1; then + raw=$(ss -lntu 2>/dev/null || true) + used_ports=$(printf "%s\n" "$raw" | awk '{print $5}' | sed -n '2,$p' | sed -E 's/.*[:]//g' | sed '/^$/d') + elif command -v netstat >/dev/null 2>&1; then + raw=$(netstat -lntu 2>/dev/null || true) + used_ports=$(printf "%s\n" "$raw" | awk '{print $4}' | sed -n '2,$p' | sed -E 's/.*[:]//g' | sed '/^$/d') + elif command -v lsof >/dev/null 2>&1; then + raw=$(lsof -i -P -n 2>/dev/null || true) + used_ports=$(printf "%s\n" "$raw" | awk '/LISTEN/ {print $9}' | sed -E 's/.*[:]//g' | sed '/^$/d') + else + echo "Error: neither ss, netstat nor lsof is available to check listening ports." >&2 + return 2 + fi -# 如果输入为空,退出脚本 -if [[ -z "$port" ]]; then - echo "输入端口为空, 退出脚本" - exit 0 -fi + # 用关联数组记录已占用端口(需要 bash 4+) + declare -A used_map + local p + for p in $used_ports; do + # 过滤掉非数字 + if [[ $p =~ ^[0-9]+$ ]]; then + used_map["$p"]=1 + fi + done -# 修改端口 -modify_json_file "$config_dir/config.json" ".inbounds[0].port" "$port" + # 从 start 到 max 逐个检查 + for ((port = start; port <= max; port++)); do + if [[ -z "${used_map[$port]}" ]]; then + echo "$port" + return 0 + fi + done -echo "端口修改成功!新端口为: $port" + # 没找到可用端口 + echo "Error: No available port found in range $start-$max" >&2 + return 1 +} +change_port(){ + local script_dir=$(cd "$(dirname "$0")"; pwd) + local config_dir="$script_dir/../conf" + source "$script_dir/utils/jq_util.sh" + + local port=$(find_free_port) + modify_json_file "$config_dir/config.json" ".listen" ":$port" + echo "设置端口成功" +} -read -p "是否要重启容器? (y/N): " restart_choice -if [[ "$restart_choice" =~ ^[Yy]$ ]]; then - echo "正在重启容器..." - docker-compose -f $script_dir/../docker-compose.yml down - docker-compose -f $script_dir/../docker-compose.yml up -d -else - echo "已跳过重启,请手动重启容器使配置生效" -fi - +change_port \ No newline at end of file