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

开源网络入侵检测与防御系统:Snort

一、Snort介绍

Snort 是一款开源的网络入侵检测与防御系统 (IDS/IPS)。自 1998 年由 Martin Roesch 创建以来,Snort 已经发展成为全球最广泛部署的 IDS/IPS 之一,拥有数百万次的下载量和庞大的用户社区。目前,Snort 由思科公司开发和维护。

可以将 Snort 理解为一个网络安全领域的瑞士军刀,它能够执行多种任务,主要有以下三种模式:

  • 嗅探器模式 (Sniffer Mode): 类似于 tcpdump 工具,Snort 可以捕获网络数据包并在控制台上显示它们的信息。这对于网络流量的实时监控和初步分析非常有用。你可以使用 -v 选项来启动 Snort 的嗅探器模式,例如:./snort -v。更详细的信息可以使用 -vd-vde 等选项。
  • 数据包记录器模式 (Packet Logger Mode): 在此模式下,Snort 将捕获的网络数据包保存到磁盘上的日志文件中。这对于后续的网络流量分析、故障排除和安全事件调查至关重要。你可以使用 -l 选项指定日志文件的存储路径,例如:./snort -l /var/log/snort
  • 网络入侵检测系统模式 (Network Intrusion Detection System Mode - NIDS): 这是 Snort 最核心的功能。在此模式下,Snort 会实时分析网络流量,并将其与预先定义的规则集进行比对。当检测到与规则匹配的可疑或恶意活动时,Snort 会生成警报。你可以使用 -c 选项指定 Snort 的配置文件,例如:./snort -dev -l /var/log/snort -h 192.168.1.0/24 -c /etc/snort/snort.conf

Snort 的主要特点和功能包括:

  • 基于规则的检测: Snort 使用一套灵活且强大的规则语言来描述需要检测的恶意网络活动、漏洞利用尝试、端口扫描和其他可疑行为。这些规则可以基于协议、端口、IP 地址、数据包内容等进行定义。
  • 实时流量分析: Snort 能够实时捕获和分析网络数据包,从而及时发现和响应潜在的安全威胁。
  • 协议分析: Snort 不仅检查数据包的内容,还能分析各种网络协议(如 TCP、UDP、ICMP、HTTP 等)的头部信息和行为,以识别协议异常或攻击。
  • 特征匹配 (Signature-Based Detection): Snort 通过将网络流量中的模式与已知的恶意活动特征(签名)进行比对来检测威胁。这对于识别已知的攻击和恶意软件非常有效。
  • 异常检测 (Anomaly-Based Detection): 虽然 Snort 主要依赖于特征匹配,但它也具备一定的异常检测能力,通过分析网络流量中不寻常的行为模式来发现潜在的未知威胁。
  • 自定义规则: 用户可以根据自己的网络环境和安全需求编写自定义的 Snort 规则,以检测特定的威胁或策略违规行为。
  • 灵活的输出选项: Snort 可以将警报和日志信息输出到多种目标,包括控制台、Syslog、数据库等,方便用户进行监控和分析。
  • 多种操作模式: 如前所述,Snort 可以作为数据包嗅探器、数据包记录器和全功能的网络入侵检测系统运行。
  • 插件化架构 (Snort 3.x): Snort 的新版本(Snort 3)采用了更加模块化和可扩展的插件化架构,拥有超过 200 个插件,提供了更丰富的功能和更高的性能。
  • 多平台兼容性: Snort 可以在多种操作系统上运行,包括 Linux、Windows 和 macOS。
  • 庞大的社区支持: Snort 拥有一个活跃的开源社区,不断贡献新的检测规则和提供支持。思科 Talos 团队也维护着一套高质量的付费规则集(Snort Subscriber Ruleset),可以实时更新最新的威胁情报。

Snort 的一些常见应用场景包括:

  • 实时监控网络流量,检测恶意活动和攻击。
  • 记录网络数据包,用于安全事件分析和取证。
  • 识别和阻止已知的网络威胁(在 IPS 模式下)。
  • 检测潜在的漏洞利用尝试和端口扫描。
  • 监控特定协议或应用程序的异常行为。
  • 为其他安全工具提供网络流量分析数据。

要开始使用 Snort,你需要进行以下基本步骤:

  1. 下载 Snort: 访问 Snort 的官方网站 (Snort - Network Intrusion Detection & Prevention System) 下载适合你操作系统的版本。目前主要有两个主要版本:Snort 2 (Legacy) 和 Snort 3。建议新用户尝试 Snort 3。
  2. 安装 Snort: 按照官方文档提供的安装指南进行安装。在 Windows 系统上,通常需要先安装 WinPcap 或 Npcap 数据包捕获库以及 Visual C++ Redistributable。在 Linux 系统上,可以使用包管理器进行安装,或者从源代码编译安装。
  3. 配置 Snort: 主要的配置文件是 snort.conf,你需要编辑此文件来定义网络接口、IP 地址、规则路径、输出方式等。
  4. 获取规则集: 你可以使用 Snort 社区规则集(免费)或购买 Snort Subscriber Ruleset(付费)。你需要将这些规则文件配置到 snort.conf 中。
  5. 运行 Snort: 根据你的需求选择合适的运行模式(嗅探器、记录器或 NIDS)。
  6. 分析警报和日志: 当 Snort 检测到可疑活动时,它会生成警报。你需要配置适当的输出方式,并定期分析这些警报和日志,以便及时响应安全事件。

Snort 是一款功能强大且灵活的网络安全工具,对于网络安全专业人员和系统管理员来说,理解和掌握 Snort 的使用是非常重要的。它可以帮助你深入了解网络流量,及时发现和应对潜在的安全威胁,从而提升整体的网络安全防护水平。

二、安装及运行

1、下载

git clone https://github.com/snort3/snort3.git

2、安装

请按照以下步骤操作:

1.设置源目录:

  • 如果您使用的是 GitHub 克隆:

    cd snort3/
  • 否则,请执行以下操作:

    tar zxf snort-tarball
    cd snort-3.0.0*

2.设置安装路径:

export my_path=/path/to/snorty

3.编译安装:

  • 要使用 cmake 和 make 进行构建,请运行 configure_cmake.sh。它将自动创建并填充一个名为“build”的新子目录。

    ./configure_cmake.sh --prefix=$my_path
    cd build
    make -j $(nproc) install

4.笔记

  • 如果您可以执行 src/snort -V,则表示您构建成功。
  • 如果您熟悉 cmake,您可以运行 cmake/ccmake 而不是 configure_cmake.sh。
  • cmake --help 会列出所有可用的生成器,例如 Xcode。您可以随意使用,但具体帮助信息将另行提供。

2、运行

以下是一些示例。如果您使用的是 Talos 规则和/或配置,则应首先在 snort.lua 和 snort_defaults.lua 的顶部设置所需的变量。

  • Snort++从命令行提供了许多帮助,包括:

    $my_path/bin/snort --help
    $my_path/bin/snort --help-module suppress
    $my_path/bin/snort --help-config | grep thread
  • 检查并转储 pcap 文件。将以下内容中的 a.pcap 替换为您喜欢的文件:

    $my_path/bin/snort -r a.pcap
    $my_path/bin/snort -L dump -d -e -q -r a.pcap
  • 验证配置(有或无规则):

    $my_path/bin/snort -c $my_path/etc/snort/snort.lua
    $my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules
  • 运行 IDS 模式。将以下内容中的 pcaps/ 替换为包含一个或多个 *.pcap 文件的目录路径:

    $my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \-r a.pcap -A alert_test -n 100000
  • 让我们抑制 1:2123。我们可以编辑配置文件,或者这样做:

    $my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \-r a.pcap -A alert_test -n 100000 --lua "suppress = { { gid = 1, sid = 2123 } }"
  • 对具有多个数据包线程的目录进行全面检查:

    $my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \--pcap-filter \*.pcap --pcap-dir pcaps/ -A alert_fast --max-packet-threads 8

三、安装Docker版本

1、前提条件:

  • 你已经安装了 Docker Engine。

2、基本使用步骤:

1.拉取 Snort Docker 镜像 (如果尚未拉取):

通常,你会从 Docker Hub 上拉取一个预构建的 Snort 镜像。有许多不同的维护者提供了 Snort 镜像,你可以根据自己的需求选择。一些常见的镜像包括官方 Snort 镜像(如果有的话,请查阅 Docker Hub)或者社区维护的镜像。

例如,假设你选择了一个名为 your_snort_image 的镜像,你可以使用以下命令拉取:

docker pull your_snort_image

示例:

#下载容器
docker pull ciscotalos/snort3
#启动容器
docker run --name snort3 -h snort3 -u snorty -w /home/snorty -d -it ciscotalos/snort3 bash
#进入 Snort 容器
docker exec -it snort3 bash
#停止 Snort 容器
docker kill snort3

2.运行 Snort Docker 容器:

使用 docker run 命令来启动 Snort 容器。你需要根据你的需求挂载配置文件、指定网络模式、传递 Snort 的命令行参数等。

以下是一些常见的 docker run 选项和 Snort 的使用场景:

  • 基本运行 (嗅探模式):

    如果你只是想简单地在容器中运行 Snort 并查看网络流量(嗅探模式),你需要将宿主机的网络接口传递给容器。可以使用 --network host 选项(注意:这可能会带来一些安全风险,因为它允许容器直接访问宿主机的网络堆栈)。

    docker run --rm --name snort-sniffer --network host your_snort_image -v -i eth0
    
    • --rm: 容器退出后自动删除。
    • --name snort-sniffer: 为容器指定一个名称。
    • --network host: 使容器共享宿主机的网络命名空间。你需要将 eth0 替换为你实际的网络接口名称。
    • your_snort_image: 你拉取的 Snort 镜像名称。
    • -v -i eth0: 传递给 Snort 的命令行参数,这里是详细模式 (-v) 并监听 eth0 接口 (-i eth0).
  • 使用自定义配置文件:

    通常,你需要使用自定义的 Snort 配置文件、规则集等。你需要将这些文件挂载到容器中。

    docker run --rm --name snort-ids --network host \
    -v /path/to/your/snort.conf:/etc/snort/snort.conf \
    -v /path/to/your/rules:/etc/snort/rules \
    -v /var/log/snort:/var/log/snort \
    your_snort_image -dev -i eth0 -c /etc/snort/snort.conf -l /var/log/snort -S HOME_NET=192.168.1.0/24
    
    • -v /path/to/your/snort.conf:/etc/snort/snort.conf: 将宿主机上的 snort.conf 文件挂载到容器内的 /etc/snort/snort.conf
    • -v /path/to/your/rules:/etc/snort/rules: 将宿主机上的规则目录挂载到容器内的 /etc/snort/rules。你可能需要在 snort.conf 中配置这些规则的路径。
    • -v /var/log/snort:/var/log/snort: 将宿主机上的日志目录挂载到容器内的 /var/log/snort,以便在宿主机上查看日志。
    • -dev -i eth0 -c /etc/snort/snort.conf -l /var/log/snort -S HOME_NET=192.168.1.0/24: 传递给 Snort 的命令行参数,包括指定接口、配置文件、日志目录和定义 $HOME_NET 变量。
  • 使用 Docker 网络 (更安全的方式):

    使用 --network host 会让容器共享宿主机的网络堆栈,这在某些情况下可能不安全。更安全的方式是创建 Docker 网络并将 Snort 容器连接到该网络,并捕获流经该网络的数据包。这通常需要更复杂的设置,例如将 Snort 容器连接到 Docker 网桥,并可能需要使用 tcpdump 或其他工具在宿主机上捕获流经网桥的流量,然后将捕获的文件挂载到 Snort 容器进行分析。

    或者,一些更高级的 Docker 网络方案(例如使用 Macvlan)可以允许容器拥有自己的 MAC 地址和直接连接到物理网络。

  • 结合其他工具 (例如 Snorby/BASE):

    如果你想使用 GUI 工具来分析 Snort 的警报,你需要配置 Snort 将警报输出到 Docker 容器内,然后将容器内的警报日志或 Unified2 文件挂载到运行 Snorby 或 BASE 的另一个容器中,或者配置 Snort 将警报发送到宿主机,再由宿主机上的 GUI 工具进行处理。

3.常用操作:

  • 查看正在运行的 Snort 容器:

    docker ps
    
  • 查看 Snort 容器的日志 (如果警报输出到容器的标准输出):

    docker logs <容器名称或ID>
    
  • 停止 Snort 容器:

    docker stop <容器名称或ID>
    
  • 删除 Snort 容器:

    docker rm <容器名称或ID>
    

4.注意事项:

  • 网络接口权限: 确保 Docker 进程有权限访问你的网络接口。你可能需要使用 sudo 来运行 Docker 命令。
  • 配置文件和规则路径: 仔细检查你在 docker run 命令中挂载的配置文件和规则路径是否正确。
  • 网络模式选择: 根据你的安全需求和使用场景选择合适的 Docker 网络模式。--network host 虽然简单,但需要谨慎使用。
  • 日志管理: 配置正确的日志挂载,以便在宿主机上方便地查看和管理 Snort 的日志。
  • Snort 版本和镜像维护者: 不同 Docker 镜像可能包含不同版本的 Snort 和预配置。选择一个你信任并了解的镜像。
  • 资源限制: 你可以使用 Docker 的资源限制选项(例如 -m for memory, --cpus for CPU)来控制 Snort 容器使用的资源。

5.总结:

使用 Docker 运行 Snort 可以简化部署和管理。需要通过 docker run 命令启动容器,并使用 -v 选项挂载配置文件和日志目录,使用 -i-c 等 Snort 命令行参数来配置 Snort 的行为。根据你的需求选择合适的网络模式,并考虑如何管理和分析 Snort 生成的警报和日志。熟悉 Docker 的基本操作和 Snort 的命令行选项是成功使用 Docker 版 Snort 的关键。

四、Docker版本注意事项

Docker 版本的 Snort 本质上就是在 Docker 容器这个隔离的环境中运行各种 Snort 的命令行程序。

Docker 提供了一个轻量级的、可移植的容器化平台。当你使用 Docker 镜像来运行 Snort 时,实际上是启动了一个包含了 Snort 及其依赖项的独立环境。

以下是需要理解的关键点:

  • 镜像 (Image): Docker 镜像就像一个包含了运行 Snort 所需的所有文件、库、环境变量和配置的模板。它是一个静态的文件系统。
  • 容器 (Container): 当你使用 docker run 命令基于一个镜像启动时,就创建了一个容器。容器是镜像的一个运行实例。它是一个隔离的进程,拥有自己的文件系统、网络空间等,但与宿主机共享内核。
  • 命令行参数传递: 你在使用 docker run 命令时,可以将 Snort 的各种命令行选项(例如 -c 指定配置文件,-i 指定网络接口,-l 指定日志目录等)作为参数传递给在容器内部运行的 Snort 可执行文件。
  • 资源隔离: Docker 提供了资源隔离机制,可以限制 Snort 容器可以使用的 CPU、内存等资源。
  • 环境一致性: 使用 Docker 可以确保在不同的宿主机上运行的 Snort 环境是一致的,避免了因环境差异导致的问题。
  • 便捷部署: Docker 简化了 Snort 的部署过程,你不需要手动安装 Snort 及其依赖项。

举个例子:

当运行类似这样的 Docker 命令:

docker run --rm --name snort-ids --network host \
-v /path/to/your/snort.conf:/etc/snort/snort.conf \
your_snort_image -dev -i eth0 -c /etc/snort/snort.conf

实际上发生的是:

  1. Docker 基于 your_snort_image 创建并启动了一个新的容器。
  2. -v /path/to/your/snort.conf:/etc/snort/snort.conf 这个选项将你宿主机上的 snort.conf 文件挂载到容器内部的 /etc/snort/snort.conf 路径。
  3. -dev -i eth0 -c /etc/snort/snort.conf 这部分被传递给了容器内部的 Snort 可执行文件,就好像你在直接在命令行运行 snort -dev -i eth0 -c /etc/snort/snort.conf 一样。

因此,Docker 版本的 Snort 并没有改变 Snort 本身的使用方式,你仍然需要熟悉 Snort 的各种命令行选项和配置文件。Docker 只是提供了一个更方便、更隔离的方式来运行这个命令行工具及其相关的环境。

五、Snort命令使用介绍

1、基本语法:

snort <选项>

2、核心选项:

  • -A <mode>: 设置警报输出模式。常用的模式有:

    • full: 输出完整的警报信息(默认)。
    • fast: 只输出时间戳、警报消息和优先级。
    • none: 不输出警报到控制台。
    • unsock: 使用 UNIX 套接字发送警报到其他程序。
    • console: 将警报输出到控制台。
    • syslog: 将警报发送到系统日志。
    • unified2: 以二进制格式输出警报,通常与 Barnyard2 等后处理工具配合使用。
    • alert_unixsock: 使用 UNIX 套接字发送警报,包含更多信息。
    # 使用 fast 模式输出警报
    sudo snort -A fast -dev -i eth0 -c /etc/snort/snort.conf
    
  • -b: 以二进制格式记录数据包(BPF 格式)。通常与 -l 选项一起使用。

    # 以二进制格式记录数据包到 /var/log/snort 目录
    sudo snort -b -l /var/log/snort -i eth0
    
  • -c <config_file>: 指定 Snort 的配置文件路径。这是最常用的选项之一,用于加载规则、预处理器、输出插件等配置。

    # 使用指定的配置文件启动 Snort
    sudo snort -c /etc/snort/my_snort.conf -dev -i eth0
    
  • -d: 转储应用程序层的数据包数据。在嗅探器模式或记录器模式下查看数据包内容非常有用。

    # 嗅探数据包并显示应用层数据
    sudo snort -vde -i eth0
    
  • -D: 以守护进程模式运行 Snort,使其在后台运行。通常与 -l 选项一起使用,将日志记录到指定目录。

    # 以守护进程模式运行 Snort 并记录日志
    sudo snort -D -l /var/log/snort -i eth0 -c /etc/snort/snort.conf
    
  • -e: 在数据包转储中显示数据链路层头部信息(例如 MAC 地址)。

    # 嗅探数据包并显示链路层头部
    sudo snort -ve -i eth0
    
  • -f: 让 Snort 在读取完所有指定的数据包文件后退出(通常与 -r 选项一起使用)。

    # 读取指定的 pcap 文件并退出
    sudo snort -r captured.pcap -f
    
  • -F <bpf_file>: 从指定的文件加载 BPF 过滤器。BPF (Berkeley Packet Filter) 是一种强大的数据包过滤语言,可以精确地捕获感兴趣的网络流量。

    # 使用指定的 BPF 过滤器文件
    sudo snort -F /etc/snort/my_filter.bpf -dev -i eth0 -c /etc/snort/snort.conf
    
  • -h <home_network>: 定义受保护的内部网络地址和掩码。这个变量可以在 Snort 规则中使用,用 $HOME_NET 指代。可以使用 CIDR 表示法(例如 192.168.1.0/24)或以逗号分隔的 IP 地址列表。

    # 定义内部网络
    sudo snort -h 192.168.1.0/24 -dev -i eth0 -c /etc/snort/snort.conf
    
  • -i <interface>: 指定 Snort 监听的网络接口。可以使用接口名称(例如 eth0, wlan0)或 any 监听所有接口。

    # 监听特定的网络接口
    sudo snort -i wlan0 -dev -c /etc/snort/snort.conf
    
  • -I: 启用内联模式(仅在 Snort 作为入侵防御系统 IPS 运行时有效,需要特定的内核模块或配置)。

  • -k <table>,<policy>: 配置流会话策略。

  • -K <format>: 设置数据包日志文件的格式 (pcapdump).

  • -l <log_dir>: 指定 Snort 日志文件的存储目录。

    # 将日志记录到指定的目录
    sudo snort -l /var/log/snort -dev -i eth0 -c /etc/snort/snort.conf
    
  • -L <binary_log_file>: 指定要读取的二进制日志文件(通常与 -r 结合使用)。

  • -m <message>: 在启动时打印自定义消息。

  • -M: 启用多进程模式(在 Snort 3.x 中更常见)。

  • -n <count>: 只捕获指定数量的数据包后退出。

    # 只捕获 100 个数据包后退出
    sudo snort -n 100 -v -i eth0
    
  • -N: 禁止网络名称解析,以避免 DNS 查询。

  • -o: 设置输出文件名前缀。

  • -O: 禁止优化。

  • -p: 不将网络接口设置为混杂模式(promiscuous mode)。在混杂模式下,网卡会接收所有经过的网络流量,而不仅仅是发往自身的数据包。通常 Snort 需要混杂模式才能捕获所有相关的流量。

  • -P <performance_profile>: 加载性能配置文件。

  • -q: 安静模式,不显示启动信息和统计数据。

  • -Q <queue_type>: 指定数据包捕获队列类型。

  • -r <pcap_file>: 从指定的 pcap 文件读取数据包进行分析,而不是从网络接口捕获。这对于离线分析非常有用。

    # 从 pcap 文件分析数据包
    sudo snort -r captured_traffic.pcap -c /etc/snort/snort.conf
    
  • -R <ruleset>: 指定要加载的额外规则文件或目录。

  • -s <snaplen>: 设置数据包捕获的快照长度(以字节为单位)。Snort 只会捕获每个数据包的前 snaplen 个字节。较小的 snaplen 可以提高性能,但可能会丢失一些数据包的详细信息。

    # 设置快照长度为 1500 字节
    sudo snort -s 1500 -dev -i eth0 -c /etc/snort/snort.conf
    
  • -S <signature_sid>=<filename>: 覆盖特定 SID 的签名。

  • -T: 测试配置文件是否正确,但不实际运行 Snort。

    # 测试配置文件
    sudo snort -T -c /etc/snort/snort.conf
    
  • -u <user>: 以指定用户身份运行 Snort。

  • -U: 启用 UTC 时间戳。

  • -v: 详细模式,显示捕获的数据包头部信息。

    # 以详细模式嗅探数据包
    sudo snort -v -i eth0
    
  • -V: 显示 Snort 版本信息并退出。

    # 显示 Snort 版本
    snort -V
    
  • -w <wait_time>: 设置等待接口启动的时间(以秒为单位)。

  • -W: 显示可用接口列表并退出。

    # 显示可用网络接口
    snort -W
    
  • -x <rule_var>: 设置规则变量的值。

  • -X: 转储原始十六进制数据包数据。

  • -y: 包括链路层在原始十六进制转储中。

  • -z <pid_file>: 指定 Snort 进程 ID (PID) 文件的路径(通常在守护进程模式下使用)。

3、Snort 3.x 特有的选项 (部分):

Snort 3.x 引入了更多的模块化和插件化架构,因此也有一些新的或修改的命令行选项。以下是一些例子:

  • --daq <daq_type>: 指定要使用的数据采集 (DAQ) 模块。DAQ 负责从网络接口捕获数据包。常见的类型包括 pcapafpacket 等。
  • --daq-var <daq_option>=<value>: 设置 DAQ 模块的特定选项。
  • --lua-rule <lua_script>: 加载 Lua 规则文件。Snort 3.x 支持使用 Lua 脚本编写更复杂的规则。
  • --plugin-path <path>: 指定插件的搜索路径。
  • --module <module_name>: 加载特定的 Snort 模块。
  • --dump-config: 转储已解析的 Snort 配置。

4、常用命令示例:

  1. 简单嗅探指定接口的流量:

    sudo snort -v -i eth0
    
  2. 使用配置文件运行 Snort 作为入侵检测系统,并将警报输出到控制台:

    sudo snort -dev -i eth0 -c /etc/snort/snort.conf
    
  3. 以守护进程模式运行 Snort,将日志记录到 /var/log/snort 目录:

    sudo snort -D -l /var/log/snort -i eth0 -c /etc/snort/snort.conf
    
  4. 从 pcap 文件读取数据包并使用指定的配置文件进行分析:

    sudo snort -r captured.pcap -c /etc/snort/snort.conf
    
  5. 使用 fast 模式输出警报,并将日志记录到 /var/log/snort 目录:

    sudo snort -A fast -l /var/log/snort -dev -i eth0 -c /etc/snort/snort.conf
    
  6. 测试 Snort 配置文件是否有效:

    sudo snort -T -c /etc/snort/snort.conf
    

5、总结:

Snort 的命令行选项非常强大且灵活,可以满足各种网络监控和入侵检测的需求。熟练掌握这些选项对于有效地使用 Snort 至关重要。建议经常查阅 Snort 的官方文档以获取最全面和最新的命令选项说明。在实际使用中,通常需要根据具体的网络环境和安全目标组合使用多个选项。

相关文章:

  • Spark SQL开发实战:从IDEA环境搭建到UDF/UDAF自定义函数实现
  • Maven下载aspose依赖失败的解决方法
  • BeeWorks Meet更适合企业内部使用的原因
  • Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
  • streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发
  • 前端浏览器窗口交互完全指南:从基础操作到高级控制
  • 论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断
  • [计算机科学#3]:布尔逻辑 (计算机数学基础)
  • 【中级软件设计师】编译和解释程序的翻译阶段、符号表 (附软考真题)
  • Lua 第10部分 模式匹配
  • 【嵌入式八股22】排序算法与哈希算法
  • 辞九门回忆
  • windows安装docker,发现没有hyper
  • WSL2里手动安装Docker 遇坑
  • 14【模块学习】74HC595:使用学习
  • SpringMVC 前后端数据交互 中文乱码
  • 微服务基础-Ribbon
  • 同样开源的自动化工作流工具n8n和Dify对比
  • 从零搭建云原生后端系统 —— 一次真实项目实践分享
  • 迷你世界UGC3.0脚本Wiki触发器脚本交互
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 加拿大今日大选:房价、印度移民和特朗普,年轻人在焦虑什么?
  • 四川落马厅官周海琦受审,1000多人接受警示教育
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • 俄联邦安全局:俄军高级官员汽车爆炸案嫌疑人已被捕