commit aff41079f69cb7a507110d8f19167b5915530add Author: chunzhi Date: Sat Feb 21 08:44:18 2026 -0500 添加 port.sh diff --git a/port.sh b/port.sh new file mode 100644 index 0000000..fe46a8f --- /dev/null +++ b/port.sh @@ -0,0 +1,249 @@ +cat > /root/port-forward.sh << 'EOF' +#!/bin/bash + +# 端口转发管理脚本 +# 使用 socat 实现端口转发 + +SCRIPT_NAME="Port Forward Manager" +SERVICE_PREFIX="port-forward" + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 检查是否安装 socat +check_socat() { + if ! command -v socat &> /dev/null; then + echo -e "${YELLOW}socat 未安装,正在安装...${NC}" + apt update && apt install socat -y + if [ $? -eq 0 ]; then + echo -e "${GREEN}socat 安装成功!${NC}" + else + echo -e "${RED}socat 安装失败,请手动安装${NC}" + exit 1 + fi + fi +} + +# 添加单个端口转发 +add_single_forward() { + echo -e "${GREEN}=== 添加单个端口转发 ===${NC}" + read -p "请输入本机监听端口: " local_port + read -p "请输入目标IP地址: " target_ip + read -p "请输入目标端口: " target_port + + # 验证输入 + if [[ -z "$local_port" ]] || [[ -z "$target_ip" ]] || [[ -z "$target_port" ]]; then + echo -e "${RED}错误: 输入不能为空${NC}" + return 1 + fi + + # 创建 systemd 服务 + cat > /etc/systemd/system/${SERVICE_PREFIX}-${local_port}.service << SERVICEEOF +[Unit] +Description=Port Forward ${local_port} to ${target_ip}:${target_port} +After=network.target + +[Service] +Type=simple +ExecStart=/usr/bin/socat TCP4-LISTEN:${local_port},reuseaddr,fork TCP4:${target_ip}:${target_port} +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +SERVICEEOF + + # 启动服务 + systemctl daemon-reload + systemctl enable ${SERVICE_PREFIX}-${local_port} + systemctl start ${SERVICE_PREFIX}-${local_port} + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 端口转发添加成功!${NC}" + echo -e "本机端口: ${local_port} -> 目标: ${target_ip}:${target_port}" + else + echo -e "${RED}✗ 端口转发添加失败${NC}" + fi +} + +# 批量添加端口转发 +add_batch_forward() { + echo -e "${GREEN}=== 批量添加端口转发 ===${NC}" + read -p "请输入本机起始端口: " start_port + read -p "请输入本机结束端口: " end_port + read -p "请输入目标IP地址: " target_ip + read -p "请输入目标端口: " target_port + + # 验证输入 + if [[ -z "$start_port" ]] || [[ -z "$end_port" ]] || [[ -z "$target_ip" ]] || [[ -z "$target_port" ]]; then + echo -e "${RED}错误: 输入不能为空${NC}" + return 1 + fi + + echo -e "${YELLOW}即将创建 $((end_port - start_port + 1)) 个端口转发...${NC}" + read -p "确认继续? (y/n): " confirm + + if [[ "$confirm" != "y" ]]; then + echo "操作已取消" + return + fi + + for port in $(seq $start_port $end_port); do + cat > /etc/systemd/system/${SERVICE_PREFIX}-${port}.service << SERVICEEOF +[Unit] +Description=Port Forward ${port} to ${target_ip}:${target_port} +After=network.target + +[Service] +Type=simple +ExecStart=/usr/bin/socat TCP4-LISTEN:${port},reuseaddr,fork TCP4:${target_ip}:${target_port} +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +SERVICEEOF + + systemctl enable ${SERVICE_PREFIX}-${port} > /dev/null 2>&1 + systemctl start ${SERVICE_PREFIX}-${port} + echo -e "${GREEN}✓${NC} 端口 ${port} 转发已创建" + done + + systemctl daemon-reload + echo -e "${GREEN}批量端口转发添加完成!${NC}" +} + +# 查看所有转发 +list_forwards() { + echo -e "${GREEN}=== 当前端口转发列表 ===${NC}" + echo "" + + services=$(systemctl list-units --all --type=service --no-pager | grep ${SERVICE_PREFIX} | awk '{print $1}') + + if [[ -z "$services" ]]; then + echo -e "${YELLOW}暂无端口转发${NC}" + return + fi + + printf "%-15s %-10s %-30s\n" "本机端口" "状态" "转发目标" + echo "--------------------------------------------------------" + + for service in $services; do + port=$(echo $service | sed "s/${SERVICE_PREFIX}-//g" | sed 's/.service//g') + status=$(systemctl is-active $service) + + if [[ "$status" == "active" ]]; then + status_color="${GREEN}运行中${NC}" + else + status_color="${RED}已停止${NC}" + fi + + # 从服务文件中提取目标信息 + target=$(grep ExecStart /etc/systemd/system/$service | grep -oP 'TCP4:\K[^ ]+') + + printf "%-15s %-20b %-30s\n" "$port" "$status_color" "$target" + done +} + +# 删除端口转发 +delete_forward() { + echo -e "${GREEN}=== 删除端口转发 ===${NC}" + read -p "请输入要删除的本机端口: " port + + if [[ -z "$port" ]]; then + echo -e "${RED}错误: 端口不能为空${NC}" + return 1 + fi + + service_name="${SERVICE_PREFIX}-${port}.service" + + if [[ ! -f "/etc/systemd/system/$service_name" ]]; then + echo -e "${RED}错误: 端口 ${port} 的转发不存在${NC}" + return 1 + fi + + systemctl stop $service_name + systemctl disable $service_name + rm -f /etc/systemd/system/$service_name + systemctl daemon-reload + + echo -e "${GREEN}✓ 端口 ${port} 的转发已删除${NC}" +} + +# 批量删除端口转发 +delete_batch_forward() { + echo -e "${GREEN}=== 批量删除端口转发 ===${NC}" + read -p "请输入起始端口: " start_port + read -p "请输入结束端口: " end_port + + echo -e "${YELLOW}即将删除端口 ${start_port}-${end_port} 的转发...${NC}" + read -p "确认继续? (y/n): " confirm + + if [[ "$confirm" != "y" ]]; then + echo "操作已取消" + return + fi + + for port in $(seq $start_port $end_port); do + service_name="${SERVICE_PREFIX}-${port}.service" + if [[ -f "/etc/systemd/system/$service_name" ]]; then + systemctl stop $service_name + systemctl disable $service_name > /dev/null 2>&1 + rm -f /etc/systemd/system/$service_name + echo -e "${GREEN}✓${NC} 端口 ${port} 的转发已删除" + fi + done + + systemctl daemon-reload + echo -e "${GREEN}批量删除完成!${NC}" +} + +# 主菜单 +main_menu() { + while true; do + echo "" + echo -e "${GREEN}================================${NC}" + echo -e "${GREEN} 端口转发管理脚本${NC}" + echo -e "${GREEN}================================${NC}" + echo "1. 添加单个端口转发" + echo "2. 批量添加端口转发" + echo "3. 查看所有转发" + echo "4. 删除单个端口转发" + echo "5. 批量删除端口转发" + echo "6. 退出" + echo -e "${GREEN}================================${NC}" + read -p "请选择操作 [1-6]: " choice + + case $choice in + 1) add_single_forward ;; + 2) add_batch_forward ;; + 3) list_forwards ;; + 4) delete_forward ;; + 5) delete_batch_forward ;; + 6) echo "退出脚本"; exit 0 ;; + *) echo -e "${RED}无效选择,请重新输入${NC}" ;; + esac + done +} + +# 检查是否为 root +if [[ $EUID -ne 0 ]]; then + echo -e "${RED}此脚本必须以 root 权限运行${NC}" + exit 1 +fi + +# 检查并安装 socat +check_socat + +# 启动主菜单 +main_menu +EOF + +# 设置执行权限 +chmod +x /root/port-forward.sh + +echo -e "\033[0;32m脚本已创建成功!\033[0m" +echo "运行命令: bash /root/port-forward.sh" \ No newline at end of file