当前位置: 首页 > news >正文

dsocat - 基于 socat 的端口转发工具

vi /usr/local/bin/dsocat

复制下面代码粘入

chmod +x /usr/local/bin/dsocat

dsocat -h 执行显示帮助文档

#!/bin/bash# ============================================
# Socat 端口转发管理脚本
# 支持 TCP/UDP 协议,后台运行,端口占用自动处理
# ============================================# 默认配置
PROTOCOL=""          # 转发协议
LOCAL_PORT=""        # 本地监听端口
DESTINATION=""       # 转发目标地址
SILENT_MODE=false    # 静默模式(自动处理端口占用)
CHECK_DESTINATION=false  # 是否检测目标地址连通性
_NOHUP=false          # 是否以后台运行# 颜色定义(用于终端输出)
RED='\033[0;31m'     # 红色 - 错误
GREEN='\033[0;32m'   # 绿色 - 成功
YELLOW='\033[1;33m'  # 黄色 - 警告
NC='\033[0m'         # 恢复默认颜色# 显示帮助信息
show_help() {cat << EOF
==============================================Socat 端口转发管理脚本 - 使用说明
==============================================【功能描述】使用 socat 建立 TCP/UDP 端口转发,支持后台运行 (nohup)可自动处理端口占用,支持目标地址预检测【依赖软件】必需依赖:- socat    : 端口转发工具 (安装: yum install socat / apt-get install socat)- lsof     : 端口占用检测 (安装: yum install lsof / apt-get install lsof)可选依赖:- nc       : 网络连接测试 (安装: yum install nc / apt-get install netcat)用于 -c 参数检测目标地址,若无此工具会使用备用方案【参数说明】-p    【必需】转发协议,可选: tcp 或 udp-l    【必需】本地监听端口 (范围: 1-65535),如: 9010, 9011-d    【必需】转发目标地址,格式: 主机:端口,如: localhost:22, 192.168.1.1:53-s    【可选】静默模式,端口被占用时自动结束占用进程未指定此参数时,若端口被占用会提示是否结束进程-c    【可选】检测目标,启动前检查目标地址是否可达,默认不检查若指定且目标不可达,脚本会报错退出--nohup 【可选】不以后台方式运行,直接在终端中运行 socat-h    【可选】显示此帮助文档【使用示例】1. TCP 转发本地 9010 到远程 22 端口(交互式):$0 -p tcp -l 9010 -d localhost:222. UDP 转发并自动处理端口占用(静默模式):$0 -p udp -l 53 -d 8.8.8.8:53 -s3. TCP 转发并预检目标地址是否可达:$0 -p tcp -l 9022 -d 192.168.100.1:22 -c4. 完整示例(UDP + 静默 + 预检):$0 -p udp -l 1234 -d 10.0.0.5:53 -s -c5. 前台运行(不后台):$0 -p tcp -l 9010 -d localhost:22 --nohup【注意事项】- 需要 root 权限或 sudo 才能结束其他用户的进程- 使用 -c 参数检测 UDP 目标时,由于 UDP 无连接特性,只能检测主机是否存活- 脚本启动后会显示进程 PID,可使用 "kill PID" 停止转发EOFexit 0
}# 错误退出函数
error_exit() {echo -e "${RED}[错误]${NC} $1" >&2exit 1
}# 信息提示函数
info_msg() {echo -e "${GREEN}[信息]${NC} $1"
}warning_msg() {echo -e "${YELLOW}[警告]${NC} $1"
}# 检查系统依赖
check_dependencies() {local missing_deps=()# 检查必需依赖:socatif ! command -v socat &> /dev/null; thenmissing_deps+=("socat")fi# 检查必需依赖:lsofif ! command -v lsof &> /dev/null; thenmissing_deps+=("lsof")fi# 如果缺少必需依赖,报错并退出if [ ${#missing_deps[@]} -gt 0 ]; thenecho -e "${RED}[错误]${NC} 缺少必需的依赖软件: ${missing_deps[*]}"echo "请使用以下命令安装:"echo "  CentOS/RHEL: yum install ${missing_deps[*]}"echo "  Ubuntu/Debian: apt-get install ${missing_deps[*]}"exit 1fi# 检查可选依赖:nc(网络工具)if ! command -v nc &> /dev/null; thenwarning_msg "未检测到 nc (netcat) 工具,-c 参数的目标检测功能将使用备用方案"warning_msg "建议安装: yum install nc 或 apt-get install netcat"fi
}# 验证端口号是否合法(1-65535 的数字)
validate_port() {local port=$1if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; thenerror_exit "端口号必须是 1-65535 之间的数字"fi
}# 检测目标地址是否可达
check_destination_reachable() {local dest=$1local proto=$2local host=$(echo "$dest" | cut -d':' -f1)local port=$(echo "$dest" | cut -d':' -f2)info_msg "正在检测目标地址 $dest 的连通性..."if [ "$proto" == "tcp" ]; then# TCP 检测方式:使用 nc 或 /dev/tcp/host/port 内置功能if command -v nc &> /dev/null; thentimeout 3 nc -z -w 2 "$host" "$port" 2>/dev/nullelse# 备用方案:使用 Bash 内置的 /dev/tcp 功能timeout 3 bash -c "cat < /dev/null > /dev/tcp/$host/$port" 2>/dev/nullfiif [ $? -ne 0 ]; thenerror_exit "无法连接到目标地址 $dest (TCP 连接失败),请检查目标是否运行或网络是否通畅"fielse# UDP 检测:UDP 是无连接协议,无法像 TCP 那样准确检测端口是否开放# 只能尝试解析主机名和 ping 检测主机是否存活if ! nslookup "$host" &>/dev/null && ! ping -c 1 -W 2 "$host" &>/dev/null; thenwarning_msg "无法解析或 ping 通主机 $host,但将继续启动(UDP 协议无法准确检测端口状态)"fi# 如果安装了 nc,尝试 UDP 端口检测(部分系统支持)if command -v nc &> /dev/null; thentimeout 3 nc -u -z -w 2 "$host" "$port" 2>/dev/nullif [ $? -eq 0 ]; theninfo_msg "UDP 目标地址检测正常"elsewarning_msg "无法确认 UDP 端口状态(UDP 为无连接协议,属正常现象)"fififiinfo_msg "目标地址检测完成"
}# 检查并处理端口占用情况
handle_port_occupation() {local port=$1local proto=$2local silent=$3# 根据协议类型查找占用端口的进程local pid=""if [ "$proto" == "tcp" ]; thenpid=$(lsof -t -i:${proto}:${port} 2>/dev/null)elsepid=$(lsof -t -i:${proto}:${port} 2>/dev/null)fi# 如果特定协议未找到,尝试通用查找(兼容某些系统版本)if [ -z "$pid" ]; thenpid=$(lsof -t -i:${port} 2>/dev/null | head -1)fi# 如果检测到端口被占用if [ -n "$pid" ]; thenlocal proc_name=$(ps -p "$pid" -o comm= 2>/dev/null || echo "未知进程")if [ "$silent" = true ]; then# 静默模式:自动结束占用进程warning_msg "端口 ${port}/${proto} 已被 ${proc_name}(进程号: ${pid}) 占用,正在自动结束..."kill -9 "$pid" 2>/dev/nullsleep 1# 验证进程是否成功结束if kill -0 "$pid" 2>/dev/null; thenerror_exit "无法结束进程 ${pid},请尝试使用 sudo 或 root 权限运行脚本"fiinfo_msg "已结束占用端口的进程"else# 非静默模式:询问用户是否结束进程warning_msg "端口 ${port}/${proto} 已被 ${proc_name}(进程号: ${pid}) 占用"read -p "是否结束该进程并继续启动转发?[y/N]: " answercase $answer in[Yy]* )kill -9 "$pid" 2>/dev/nullsleep 1info_msg "已结束占用进程";;* )error_exit "操作已取消:端口 ${port} 被占用";;esacfifi
}# 启动端口转发服务
start_forwarding() {local proto=$1local local_port=$2local dest=$3local _nohup=$4# 构建 socat 命令local socat_cmd=""if [ "$proto" == "tcp" ]; then# TCP 模式:fork 表示多连接并发处理socat_cmd="socat TCP-LISTEN:${local_port},fork TCP:${dest}"else# UDP 模式:增加 reuseaddr 选项以便更快重启,fork 支持多客户端socat_cmd="socat UDP-LISTEN:${local_port},fork,reuseaddr UDP:${dest}"fiinfo_msg "正在启动 ${proto^^} 端口转发: ${local_port} -> ${dest}"if [ "$_nohup" = true ]; then# 后台运行nohup $socat_cmd > /dev/null 2>&1 &# 等待 1 秒让进程完全启动sleep 1# 获取 socat 进程号local new_pid="$(lsof -t -i:${local_port} 2>/dev/null)"# 验证启动是否成功if [ -n "$new_pid" ]; theninfo_msg "端口转发启动成功!进程号: ${new_pid}"echo "----------------------------------------"echo "  协议类型: ${proto^^}"echo "  监听端口: ${local_port}"echo "  目标地址: ${dest}"echo "  运行模式: nohup 后台运行"echo "  进程 PID: ${new_pid}"echo "----------------------------------------"echo "管理命令:"echo "  查看状态: ps -p ${new_pid} -o pid,comm,etime,cmd"echo "  停止转发: kill ${new_pid}"elseerror_exit "端口转发启动失败,请检查 socat 是否正确安装或参数是否正确"fielse# 前台运行echo "----------------------------------------"echo "  协议类型: ${proto^^}"echo "  监听端口: ${local_port}"echo "  目标地址: ${dest}"echo "  运行模式: 前台运行 (按 Ctrl+C 停止)"echo "----------------------------------------"info_msg "正在前台运行 socat..."eval "$socat_cmd"fi
}# 主程序入口
main() {# 解析命令行参数while [[ $# -gt 0 ]]; docase $1 in-p) PROTOCOL=$(echo "$2" | tr '[:upper:]' '[:lower:]'); shift 2 ;;  # 转换为小写-l) LOCAL_PORT="$2"; shift 2 ;;-d) DESTINATION="$2"; shift 2 ;;-s) SILENT_MODE=true; shift ;;-c) CHECK_DESTINATION=true; shift ;;--nohup) _NOHUP=true; shift ;;-h) show_help ;;*) show_help ;;esacdone# 验证必需参数是否提供[ -z "$PROTOCOL" ] && error_exit "缺少必需参数: -p (协议类型),请使用 -h 查看帮助"[ -z "$LOCAL_PORT" ] && error_exit "缺少必需参数: -l (本地端口),请使用 -h 查看帮助"[ -z "$DESTINATION" ] && error_exit "缺少必需参数: -d (目标地址),请使用 -h 查看帮助"# 验证协议类型必须是 tcp 或 udpif [ "$PROTOCOL" != "tcp" ] && [ "$PROTOCOL" != "udp" ]; thenerror_exit "协议类型必须是 tcp 或 udp,当前输入: ${PROTOCOL}"fi# 验证本地端口号合法性validate_port "$LOCAL_PORT"# 验证目标地址格式(必须包含 : 且端口部分为数字)if ! [[ "$DESTINATION" =~ ^[^:]+:[0-9]+$ ]]; thenerror_exit "目标地址格式错误,正确格式: 主机地址:端口号 (例如: localhost:22, 192.168.1.1:53)"filocal dest_port=$(echo "$DESTINATION" | cut -d':' -f2)validate_port "$dest_port"# 检查系统依赖(必需和可选)check_dependencies# 如果启用目标检测,先检测目标是否可达if [ "$CHECK_DESTINATION" = true ]; thencheck_destination_reachable "$DESTINATION" "$PROTOCOL"fi# 处理可能的端口占用情况handle_port_occupation "$LOCAL_PORT" "$PROTOCOL" "$SILENT_MODE"# 启动端口转发start_forwarding "$PROTOCOL" "$LOCAL_PORT" "$DESTINATION" "$_NOHUP"
}# 执行主程序
main "$@"

 

http://www.jsqmd.com/news/326559/

相关文章:

  • Flutter 线性组件详解 - 指南
  • 基于OpenCL的矩阵运算算法设计与实现
  • COMSOL二氧化碳混相驱替与多孔介质驱替模型:考虑浓度、速度、压力变化及混合流体物理性质变化
  • AlmaLinux 10 部署LNMP环境 - wanghongwei
  • IEEE Membership购买流程
  • Linux内核深度解析之copy_to_user调用流程与实战(一百零二)
  • 永州英语雅思培训机构推荐。2026权威测评出国雅思辅导机构口碑榜
  • 宿州本地生活运营领航者:三十六行网络科技宿州分公司,您的全域增长伙伴
  • C# ASP.NET路由系统全解析:传统路由 vs 属性路由,避坑 + 实战一网打尽
  • 全网热议!2026年八大实木环保板材品牌排行推荐,让生活更健康
  • winrar_x64_5.31.0.0安装步骤详解(附压缩与解压教程)
  • 参考文献崩了?继续教育写作神器 —— 千笔·专业学术智能体
  • 永州英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜
  • 2026年行业内诚信的气动吊车厂商推荐榜,单轨吊气动葫芦/100吨气动葫芦/2吨气动葫芦,气动吊车实力厂家口碑推荐
  • 学霸同款9个降AIGC平台,千笔帮你降AI率
  • 2026年AI论文生成工具终极测评:6款免费神器,一键搞定开题报告、论文大纲与全文初稿!
  • Claude Code配置Qwen3-Coder
  • 永州英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜
  • 郴州英语雅思培训机构推荐.2026权威测评出国雅思辅导机构口碑榜
  • 永州英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜
  • 郴州英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜
  • 开源链动2+1模式商城小程序的营销技术与私域运营策略研究
  • 双镜鉴:基于D-O-S模型解析新自由主义批判的两种范式——兼论AI元人文构想作为“元批判”框架的整合潜力
  • 为了驯服 PostgreSQL GUC 的 extra 数据,我在 C 内存管理里踩了四次坑
  • 郴州英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜
  • 万张最新完整图库,楼控、工控组态图库最新完整版2,空调自控图形,楼宇自控图形。 文件总共1万多...
  • 优化利用深度特征以提升复杂建筑与拆除废弃物场景中可回收物的分割性能
  • LearnGitBranching - 副本 - LI,Yi
  • 基于matlab的信道编码仿真
  • 基于MATLAB的异步电机调速系统仿真设计