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

 更新时间:2025年12月29日 09:30:55   作者:学亮编程手记  
这篇文章主要介绍了在Linux中监听指定端口的几种方法,包括使用netcat、socat、Python脚本等,并提供了每种方法的详细步骤和示例脚本,需要的朋友可以参考下

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

方法1:使用nc(netcat)的简单监听脚本

#!/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

方法2:使用socat(功能更强大)

#!/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'

方法3:使用Python的增强版脚本(推荐)

#!/bin/bash
# 文件名:port_listener_advanced.sh

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[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)"

方法4:使用多个工具备选的脚本

#!/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监听指定端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell 参数传递的使用方法

    Shell 参数传递的使用方法

    本文主要介绍了Shell 参数传递的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • shell中exit 0和exit 1的区别有哪些

    shell中exit 0和exit 1的区别有哪些

    exit1和exit是shell中的两个命令,用于退出当前的shell进程,本文就来介绍一下shell中exit 0和exit 1有哪些区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 使用Linux命令行创建文件的方法

    使用Linux命令行创建文件的方法

    使用命令行创建文件时,可以选择touch或echo命令,touch创建空文件,echo则可直接写入内容,编辑文件可用nano、vim等编辑器,验证文件可用ls命令检查,这些方法简单易用,适合各种编程需求,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Linux Shell 变量的定义与使用方法详解

    Linux Shell 变量的定义与使用方法详解

    本文将深入浅出地讲解Shell变量的方方面面,并通过与Java语言的对比,帮助你更直观地理解其设计哲学与使用技巧,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • Linux自定义防误删脚本的思路与测试

    Linux自定义防误删脚本的思路与测试

    相信很多朋友都遇到过在linux下误删除文件的时候,此刻的心中仿佛有无数的羊驼在奔腾,下面这篇文章主要给大家介绍了关于Linux自定义防误删脚本的思路与测试的相关资料,需要的朋友可以参考下
    2021-09-09
  • Linux Shell中三种引号的用法及区别

    Linux Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)。那么这三种引号有什么区别呢?下面脚本之家小编给大家介绍下用法及区别,需要的的朋友参考下
    2017-03-03
  • 一键配置CentOS iptables防火墙的Shell脚本分享

    一键配置CentOS iptables防火墙的Shell脚本分享

    这篇文章主要介绍了一键配置CentOS iptables防火墙Shell脚本分享,可保存到一个脚本文件中,在新安装的CentOS系统时一条命令搞定iptables配置,需要的朋友可以参考下
    2014-07-07
  • shell处理用户输入传递参数的实现

    shell处理用户输入传递参数的实现

    本文主要介绍了shell处理用户输入传递参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 局域网远程开机软件制作代码分享

    局域网远程开机软件制作代码分享

    局域网远程开机软件制作代码分享,大家可以参考使用,要网卡支持,需要gtk+2.0 的库支持UI
    2013-12-12
  • shell脚本学习之调用脚本将文件打包zip的方法示例

    shell脚本学习之调用脚本将文件打包zip的方法示例

    这篇文章主要给大家介绍了关于shell脚本学习之调用脚本将文件打包zip的方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07

最新评论