linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Linux shell监听指定端口

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

作者:学亮编程手记

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

您可能感兴趣的文章:
阅读全文