在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脚本从文件中逐行读取内容的几种方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Linux常用命令之性能命令

    Linux常用命令之性能命令

    这篇文章主要介绍了Linux常用命令之性能命令,文章讲解的很清楚,有对于这方面不了解的同学可以研究下
    2021-02-02
  • Shell脚本实现随机数多种方法介绍(date、random、uuid)

    Shell脚本实现随机数多种方法介绍(date、random、uuid)

    这篇文章主要介绍了Shell脚本实现随机数多种方法介绍,本文讲解了通过时间获得随机数、通过内部系统变量、通过系统内部唯一数据生成随机数等方法,需要的朋友可以参考下
    2014-11-11
  • linux中常用脚本和函数分享

    linux中常用脚本和函数分享

    这linux中经常需要用到的一些脚本与函数,这里简单的分享下,方便需要的朋友
    2013-02-02
  • Linux中 sed 和 awk的用法详解

    Linux中 sed 和 awk的用法详解

    sed是一个很好的文件处理工具,本身是一个管道命令,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大 ,本文重点给大家介绍Linux中 sed 和 awk的用法,一起看看吧
    2017-07-07
  • readelf命令读取elf文件的详细信息(推荐)

    readelf命令读取elf文件的详细信息(推荐)

    这篇文章主要介绍了readelf命令读取elf文件的详细信息,在这里使用一个elfDemo.rel作为示例,elfDemo.rel是elfDemo.c使用如下指令生成的,需要的朋友可以参考下
    2023-02-02
  • Linux 中的export与alias命令详解

    Linux 中的export与alias命令详解

    export和alias都是用来简化命令行输入的工具。export用于设置环境变量,环境变量是一些系统级别的变量,用于指定一些系统的默认值或者搜索路径等,这篇文章主要介绍了Linux 中的export与alias命令,需要的朋友可以参考下
    2023-04-04
  • Shell在循环中使用i++

    Shell在循环中使用i++

    在 Shell 脚本中,可以使用 (( i++ )) 或者 let "i++" 来增加变量 i 的值,这用于在循环中自增变量 i,本文介绍Shell在循环中使用i++的示例,感兴趣的朋友一起看看吧
    2023-12-12
  • Linux 删除和替换文件中某一行的方法【推荐】

    Linux 删除和替换文件中某一行的方法【推荐】

    这篇文章给大家介绍了Linux 删除和替换文件中某一行的方法,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05

最新评论