在Linux中编写shell脚本监听指定端口的实现方式

作者:

文章目录
  • #!/bin/bash # 文件名:port_listener.sh # 检查参数 if [ $# -ne 1 ]; then echo “使用方法: $0 <端口号>” echo “示例: $0 8080” exit 1 fi PORT=$1 echo “正在监听端口 $PORT …” echo “按 Ctrl+C 停止监听” # 使用netcat监听端口 nc -l -p $PORT # 如果上面的命令失败,尝试不带-p参数的格式 if [ $? -ne 0 ]; then echo “尝试另一种nc语法…” nc -l $PORT fi
  • #!/bin/bash # 文件名:port_listener_socat.sh if [ $# -ne 1 ]; then echo “使用方法: $0 <端口号>” exit 1 fi PORT=$1 echo “使用socat监听端口 $PORT” echo “输入将会显示在终端,输出将会发送回客户端” socat TCP-LISTEN:$PORT,fork EXEC:’/bin/cat’
  • #!/bin/bash # 文件名:port_listener_advanced.sh # 颜色定义 RED=’33[0;31m’ GREEN=’33[0;32m’ YELLOW=’33[1;33m’ NC=’33[0m’ # No Color # 检查参数 if [ $# -lt 1 ] || [ $# -gt 2 ]; then echo -e “${GREEN}使用方法:${NC}” echo ” $0 <端口号> [协议]” echo ” <端口号>: 要监听的端口” echo ” [协议]: 可选,tcp 或 udp,默认为 tcp” echo “” echo -e “${YELLOW}示例:${NC}” echo ” $0 8080 # 监听TCP端口8080″ echo ” $0 8080 tcp # 监听TCP端口8080″ echo ” $0 53 udp # 监听UDP端口53″ exit 1 fi PORT=$1 PROTOCOL=${2:-tcp} # 默认为TCP # 检查端口是否有效 if ! [[ “$PORT” =~ ^[0-9]+$ ]] || [ “$PORT” -lt 1 ] || [ “$PORT” -gt 65535 ]; then echo -e “${RED}错误: 端口号必须在1-65535之间${NC}” exit 1 fi # 检查协议是否有效 if [[ “$PROTOCOL” != “tcp” && “$PROTOCOL” != “udp” ]]; then echo -e “${RED}错误: 协议必须是 ‘tcp’ 或 ‘udp’${NC}” exit 1 fi # 检查端口是否已被占用 echo -e “${YELLOW}检查端口 $PORT 是否可用…${NC}” if ss -tuln | grep -q “:$PORT “; then echo -e “${RED}错误: 端口 $PORT 已被占用${NC}” ss -tuln | grep “:$PORT ” exit 1 fi echo -e “${GREEN}========================================${NC}” echo -e “${GREEN}开始监听${NC}” echo -e “端口: ${YELLOW}$PORT${NC}” echo -e “协议: ${YELLOW}$PROTOCOL${NC}” echo -e “时间: $(date)” echo -e “主机: $(hostname)” echo -e “IP地址: $(hostname -I 2>/dev/null || ip addr show | grep ‘inet ‘ | grep -v ‘127.0.0.1’ | head -1 | awk ‘{print $2}’)” echo -e “${GREEN}========================================${NC}” echo -e “${YELLOW}按 Ctrl+C 停止监听${NC}” echo “” # 根据协议选择监听方式 if [[ “$PROTOCOL” == “tcp” ]]; then # TCP监听 echo “等待TCP连接…” nc -l -p $PORT -v else # UDP监听 echo “等待UDP数据包…” echo “注意: UDP是无连接的,可能需要使用特定工具发送数据” nc -u -l $PORT -v fi # 监听结束时显示信息 echo “” echo -e “${GREEN}监听已停止${NC}” echo -e “结束时间: $(date)”
  • #!/bin/bash # 文件名:port_listener_universal.sh PORT=$1 # 检查工具是否可用 check_command() { command -v $1 >/dev/null 2>&1 } echo “尝试监听端口 $PORT” # 按优先级尝试不同的工具 if check_command nc; then echo “使用 netcat (nc) 监听…” nc -l $PORT elif check_command socat; then echo “使用 socat 监听…” socat TCP-LISTEN:$PORT,fork EXEC:’/bin/cat’ elif check_command python3; then echo “使用 Python3 监听…” python3 -c ” import socket import sys port = $PORT sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((”, port)) sock.listen(1) print(f’Python监听端口 {port}…’) print(‘等待连接…’) while True: conn, addr = sock.accept() print(f’连接来自: {addr}’) try: while True: data = conn.recv(1024) if not data: break print(f’收到: {data.decode()}’) conn.sendall(data) # 回声 except KeyboardInterrupt: print(‘\n停止监听’) break finally: conn.close() sock.close() ” else echo “错误: 没有找到可用的监听工具” echo “请安装以下任一工具:” echo ” 1. netcat (nc)” echo ” 2. socat” echo ” 3. python3″ exit 1 fi
  • 保存脚本 nano port_listener.sh # 复制粘贴上面的脚本内容 添加执行权限 chmod +x port_listener.sh 运行脚本 # 简单监听 ./port_listener.sh 8080 # 高级版(支持TCP/UDP) ./port_listener_advanced.sh 8080 ./port_listener_advanced.sh 53 udp # 通用版(自动选择可用工具) ./port_listener_universal.sh 8080
  • 在另一个终端测试连接: # 使用telnet测试TCP telnet localhost 8080 # 使用nc测试TCP echo “Hello” | nc localhost 8080 # 使用nc测试UDP echo “Hello UDP” | nc -u localhost 53
  • # Ubuntu/Debian sudo apt update sudo apt install netcat socat python3 # CentOS/RHEL/Fedora sudo yum install nc socat python3 # 或 sudo dnf install nc socat python3 到此这篇关于在Linux中编写shell脚本监听指定端口的实现方式的文章就介绍到这了,更多相关Linux shell监听指定端口内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Linux系统下Oracle数据库监听启动关闭命令详解 linux下如何将无线网卡工作模式切换为监听模式 golang 监听服务的信号,实现平滑启动,linux信号说明详解 Linux inotify监听文件状态的操作方法 Linux下修改Oracle监听地址的方法
  • 目录
    • 方法1:使用nc(netcat)的简单监听脚本
    • 方法2:使用socat(功能更强大)
    • 方法3:使用Python的增强版脚本(推荐)
    • 方法4:使用多个工具备选的脚本
    • 使用方法:
    • 测试连接:
    • 安装必要工具(如果缺失):

    在Linux中,你可以编写一个shell脚本来监听指定端口。以下是几种实现方式:

    #!/bin/bash
    # 文件名:port_listener.sh
    
    # 检查参数
    if [ $# -ne 1 ]; then
        echo "使用方法: $0 <端口号>"
        echo "示例: $0 8080"
        exit 1
    fi
    
    PORT=$1
    
    echo "正在监听端口 $PORT ..."
    echo "按 Ctrl+C 停止监听"
    
    # 使用netcat监听端口
    nc -l -p $PORT
    
    # 如果上面的命令失败,尝试不带-p参数的格式
    if [ $? -ne 0 ]; then
        echo "尝试另一种nc语法..."
        nc -l $PORT
    fi
    

    #!/bin/bash
    # 文件名:port_listener_socat.sh
    
    if [ $# -ne 1 ]; then
        echo "使用方法: $0 <端口号>"
        exit 1
    fi
    
    PORT=$1
    
    echo "使用socat监听端口 $PORT"
    echo "输入将会显示在终端,输出将会发送回客户端"
    
    socat TCP-LISTEN:$PORT,fork EXEC:'/bin/cat'
    

    #!/bin/bash
    # 文件名:port_listener_advanced.sh
    
    # 颜色定义
    RED='33[0;31m'
    GREEN='33[0;32m'
    YELLOW='33[1;33m'
    NC='33[0m' # No Color
    
    # 检查参数
    if [ $# -lt 1 ] || [ $# -gt 2 ]; then
        echo -e "${GREEN}使用方法:${NC}"
        echo "  $0 <端口号> [协议]"
        echo "  <端口号>: 要监听的端口"
        echo "  [协议]: 可选,tcp 或 udp,默认为 tcp"
        echo ""
        echo -e "${YELLOW}示例:${NC}"
        echo "  $0 8080          # 监听TCP端口8080"
        echo "  $0 8080 tcp      # 监听TCP端口8080"
        echo "  $0 53 udp        # 监听UDP端口53"
        exit 1
    fi
    
    PORT=$1
    PROTOCOL=${2:-tcp}  # 默认为TCP
    
    # 检查端口是否有效
    if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
        echo -e "${RED}错误: 端口号必须在1-65535之间${NC}"
        exit 1
    fi
    
    # 检查协议是否有效
    if [[ "$PROTOCOL" != "tcp" && "$PROTOCOL" != "udp" ]]; then
        echo -e "${RED}错误: 协议必须是 'tcp' 或 'udp'${NC}"
        exit 1
    fi
    
    # 检查端口是否已被占用
    echo -e "${YELLOW}检查端口 $PORT 是否可用...${NC}"
    if ss -tuln | grep -q ":$PORT "; then
        echo -e "${RED}错误: 端口 $PORT 已被占用${NC}"
        ss -tuln | grep ":$PORT "
        exit 1
    fi
    
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}开始监听${NC}"
    echo -e "端口: ${YELLOW}$PORT${NC}"
    echo -e "协议: ${YELLOW}$PROTOCOL${NC}"
    echo -e "时间: $(date)"
    echo -e "主机: $(hostname)"
    echo -e "IP地址: $(hostname -I 2>/dev/null || ip addr show | grep 'inet ' | grep -v '127.0.0.1' | head -1 | awk '{print $2}')"
    echo -e "${GREEN}========================================${NC}"
    echo -e "${YELLOW}按 Ctrl+C 停止监听${NC}"
    echo ""
    
    # 根据协议选择监听方式
    if [[ "$PROTOCOL" == "tcp" ]]; then
        # TCP监听
        echo "等待TCP连接..."
        nc -l -p $PORT -v
    else
        # UDP监听
        echo "等待UDP数据包..."
        echo "注意: UDP是无连接的,可能需要使用特定工具发送数据"
        nc -u -l $PORT -v
    fi
    
    # 监听结束时显示信息
    echo ""
    echo -e "${GREEN}监听已停止${NC}"
    echo -e "结束时间: $(date)"
    

    #!/bin/bash
    # 文件名:port_listener_universal.sh
    
    PORT=$1
    
    # 检查工具是否可用
    check_command() {
        command -v $1 >/dev/null 2>&1
    }
    
    echo "尝试监听端口 $PORT"
    
    # 按优先级尝试不同的工具
    if check_command nc; then
        echo "使用 netcat (nc) 监听..."
        nc -l $PORT
    elif check_command socat; then
        echo "使用 socat 监听..."
        socat TCP-LISTEN:$PORT,fork EXEC:'/bin/cat'
    elif check_command python3; then
        echo "使用 Python3 监听..."
        python3 -c "
    import socket
    import sys
    
    port = $PORT
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('', port))
    sock.listen(1)
    print(f'Python监听端口 {port}...')
    print('等待连接...')
    
    while True:
        conn, addr = sock.accept()
        print(f'连接来自: {addr}')
        try:
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                print(f'收到: {data.decode()}')
                conn.sendall(data)  # 回声
        except KeyboardInterrupt:
            print('\n停止监听')
            break
        finally:
            conn.close()
    sock.close()
    "
    else
        echo "错误: 没有找到可用的监听工具"
        echo "请安装以下任一工具:"
        echo "  1. netcat (nc)"
        echo "  2. socat"
        echo "  3. python3"
        exit 1
    fi
    

    保存脚本

    nano port_listener.sh
    # 复制粘贴上面的脚本内容
    

    添加执行权限

    chmod +x port_listener.sh
    

    运行脚本

    # 简单监听
    ./port_listener.sh 8080
    
    # 高级版(支持TCP/UDP)
    ./port_listener_advanced.sh 8080
    ./port_listener_advanced.sh 53 udp
    
    # 通用版(自动选择可用工具)
    ./port_listener_universal.sh 8080
    

    在另一个终端测试连接:

    # 使用telnet测试TCP
    telnet localhost 8080
    
    # 使用nc测试TCP
    echo "Hello" | nc localhost 8080
    
    # 使用nc测试UDP
    echo "Hello UDP" | nc -u localhost 53
    

    # Ubuntu/Debian
    sudo apt update
    sudo apt install netcat socat python3
    
    # CentOS/RHEL/Fedora
    sudo yum install nc socat python3
    # 或
    sudo dnf install nc socat python3
    

    到此这篇关于在Linux中编写shell脚本监听指定端口的实现方式的文章就介绍到这了,更多相关Linux shell监听指定端口内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Linux系统下Oracle数据库监听启动关闭命令详解
    • linux下如何将无线网卡工作模式切换为监听模式
    • golang 监听服务的信号,实现平滑启动,linux信号说明详解
    • Linux inotify监听文件状态的操作方法
    • Linux下修改Oracle监听地址的方法

    站内搜索