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

利用Fail2Ban增强Jupyter Notebook安全性以防范目录遍历攻击

利用Fail2Ban增强Jupyter Notebook安全性以防范目录遍历攻击

      • 书接上回[^参见]
      • 一、目录遍历攻击(Directory Traversal Attack)
      • 二、日志记录的网络攻击示例分析
      • 三、配置 Fail2ban
      • 四、fail2ban-regex测试和验证正则表达式
      • 五、重启 Fail2Ban
      • 六、验证配置生效
      • 七、一些建议
      • 参见:

作者:高玉涵
时间:2024.10.9 15:31
博客:blog.csdn.net/cg_i
环境:CentOS8、fail2ban 0.11.2

无论选择哪条路,都请保持一颗热爱学习、永不停止的心。
因为,只有不断学习,我们才能在这个日新月异的世界中立足。

书接上回1

Fail2ban的filter.d2里存放着大量针对市面上大多数服务程序的防护配置脚本。这些脚本通过正则表达式匹配系统日志中的特定模式,从而识别出潜在的恶意行为,如多次失败的登录尝试、异常访问模式等。当这些模式被触发时,Fail2ban可以采取相应的行动,如通过防火墙规则封禁IP地址、发送通知邮件等。

当然,值得称道的是,尽管Fail2ban已经为大多数主流服务提供了预配置的防护脚本,但当你像我一样,使用了一些较为小众却极为实用的服务,例如便于随时进行代码调试与灵感记录的Jupyter Notebook时,你可能会发现在filter.d目录中难以找到直接适用的专用防护配置。幸运的是,Fail2ban的设计充分考虑到了用户的这种需求,它提供了一套高度灵活的规则定制机制。这意味着,你可以针对Jupyter Notebook或任何其他特定服务,轻松创建个性化的防护策略,从而实现系统的全面安全防护,确保你的工作环境既便捷又安全。

本文旨在结合Fail2Ban的日志监控与封禁功能,为Jupyter Notebook量身定制一套专属的防护策略,让您的代码调试与灵感记录之旅更加无忧无虑。

一、目录遍历攻击(Directory Traversal Attack)

目录遍历攻击是指攻击者利用应用程序对文件路径处理的不当验证或过滤漏洞,通过构造特定的文件路径字符串,试图访问存储在Web服务器根目录之外的文件和目录。这种攻击通常发生在Web应用程序或其他需要文件系统访问的软件中,攻击者通过修改URL或输入字段中的文件路径来实现对受限资源的访问。

一、攻击方式

  1. 直接路径遍历:攻击者直接在URL或输入字段中构造包含“…/”等特殊字符的路径字符串,试图向上导航到更高层次的目录,从而访问到受限的文件或目录。
  2. 编码绕过:攻击者可能使用URL编码、Unicode编码等方式对特殊字符进行编码,以绕过应用程序的安全检查。例如,使用“%2e%2e%2f”代替“…/”来尝试访问上级目录。
  3. 利用应用程序漏洞:攻击者还可能利用应用程序的其他漏洞(如文件包含漏洞、文件上传漏洞等)来实现路径遍历攻击。

二、危害与影响

目录遍历攻击可能导致多种严重后果,包括但不限于:

  1. 数据泄露:攻击者可以访问包含敏感信息的文件,如配置文件、用户数据文件等。
  2. 代码泄露:攻击者可以访问应用程序的源代码,从而发现更多的漏洞。
  3. 系统破坏:通过访问和修改系统文件,攻击者可以对系统进行破坏性操作,影响服务的正常运行。
  4. 权限提升:攻击者可能通过读取和利用系统文件来提升自己的权限,执行更高级别的攻击。

二、日志记录的网络攻击示例分析

(省略...)
[W 01:24:43.095 NotebookApp] 403 POST /web/addons/ftp_download.php (107.172.20.215) 2.230000ms referer=None
[W 01:24:43.146 NotebookApp] 403 POST /tplus/ajaxpro/Ufida.T.SM.Login.UIP.LoginManager,Ufida.T.SM.Login.UIP.ashx?method=CheckPassword (107.172.20.215): '_xsrf' argument missing from POST
[W 01:24:43.147 NotebookApp] 403 POST OPTION=LOADFILE&FILENAME=../mysql_config.ini (107.172.20.215) 1.740000ms referer=None
[W 01:24:43.325 NotebookApp] 404 GET /Catalog/BlobHandler.ashx?Url=YQB3AGUAdgAyADoAawB2ADAAOgB4AGwAawBiAEoAbwB5AGMAVwB0AFEAMwB6ADMAbABLADoARQBKAGYAYgBHAE4ATgBDADUARQBBAG0AZQBZAE4AUwBiAFoAVgBZAHYAZwBEAHYAdQBKAFgATQArAFUATQBkAGcAZAByAGMAMgByAEUAQwByAGIAcgBmAFQAVgB3AD0A 
[W 01:24:43.549 NotebookApp] 404 GET /AirWatch/BlobHandler.ashx?Url=YQB3AGUAdgAyADoAawB2ADAAOgB4AGwAawBiAEoAbwB5AGMAVwB0AFEAMwB6ADMAbABLADoARQBKAGYAYgBHAE4ATgBDADUARQBBAG0AZQBZAE4AUwBiAFoAVgBZAHYAZwBEAHYAdQBKAFgATQArAFUATQBkAGcAZAByAGMAMgByAEUAQwByAGIAcgBmAFQAVgB3AD0A (107.172.20.215) 1.450000ms referer=None
[W 01:24:43.594 NotebookApp] 404 GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../../../windows/win.ini (107.172.20.215) 1.450000ms referer=None
[W 01:24:43.640 NotebookApp] 403 POST /ispirit/interface/gateway.php (107.172.20.215): '_xsrf' argument missing from POST
[W 01:24:43.922 NotebookApp] 403 POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 (107.172.20.215): '_xsrf' argument missing from POST
(省略...)
[I 01:24:45.555 NotebookApp] 302 GET /?rest_route=/wc/store/products/collection-data&calculate_attribute_counts[0][query_type]=or&calculate_attribute_counts[0][taxonomy]=%252522%252529%252520union%252520all%252520select%2525201%25252Cconcat%252528id%25252C0x3a%25252cmd5%252528142712%252529%252529from%252520wp_users%252520where%252520%252549%252544%252520%252549%25254E%252520%2525281%252529%25253B%252500 (107.172.20.215) 0.650000ms
(省略...)

这些日志条目来自Jupyter Notebook,记录了特定时间段内的HTTP请求。分析这些日志,我们可以看出以下几点:

  1. 访问尝试的IP地址:

    • 所有记录的请求都来自同一个IP地址:107.172.20.215。这可能表明是一个单一的用户或系统在进行这些操作。
  2. 请求类型与结果:

    • 多数请求是POST和GET请求。
    • 许多请求返回了403(禁止访问)和404(未找到)状态码,这表明请求的资源不存在或者请求被拒绝。
  3. 潜在的攻击尝试:

    • 请求中尝试访问一些常见的敏感文件或执行SQL注入,例如:
      • /web/addons/ftp_download.php:尝试下载FTP文件。
      • OPTION=LOADFILE&FILENAME=../mysql_config.ini:尝试加载MySQL配置文件。
      • /Catalog/BlobHandler.ashx/AirWatch/BlobHandler.ashx:带有可疑的URL编码参数,可能是尝试访问或执行未授权的资源。
      • /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../../../windows/win.ini:尝试访问系统文件。
      • /wc/store/products/collection-data 带有SQL注入特征的查询参数。
  4. 缺少安全令牌:

    • 一些POST请求因为缺少_xsrf参数而失败。这可能是因为这些请求没有包含必要的安全令牌,该令牌通常用于防止跨站请求伪造(CSRF)攻击。
  5. 请求的时间戳:

    • 所有这些请求都发生在相同的时间段内(01:24:43到01:24:45),表明这是一系列连续的尝试。
  6. 可能的目标:

    • 目标系统可能运行着多种应用或服务(如FTP服务、数据库服务、Web服务等),攻击者尝试利用这些服务中的漏洞。

这些日志条目揭示了来自特定IP地址的一系列可疑且潜在恶意的请求,包括尝试访问敏感文件、执行SQL注入以及绕过安全机制等。尽管攻击者并未获得实质性成果,且系统防护措施已相当完善,但此类攻击事件仍频繁发生,对服务器造成了不小的压力和资源损耗。

三、配置 Fail2ban

编辑 /etc/fail2ban/jail.local(或相应的配置文件),添加以下内容:

[jupyter]
enabled  = true  
filter   = jupyter-notebook
logpath  = /path/to/your/jupyter.log # 你所在日志路径
maxretry = 3
bantime  = 6000 # 禁止时间,单位为秒

然后,创建一个新的过滤器文件 /etc/fail2ban/filter.d/jupyter-notebook.conf,并添加以下内容:

[Definition]
failregex = ^.*\[(W|E|I|D) .*\] 4\d{2} (GET|POST) .* \(<HOST>\).*$ # 日志匹配的正则表达式
ignoreregex =

解释:

  • ^ 表示行的开始。
  • .* 表示任意数量的任意字符(除了换行符)。
  • \[(W|E|I|D) .*\] 匹配一个方括号内的内容,其中以W、E、I或D开头,后面跟着任意字符。这通常表示日志级别或某种标记。
  • 4\d{2} ,其中 4 表示匹配数字4,\d{2} 表示匹配两位数字。这样,正则表达式就能匹配所有从400到499的HTTP状态码了。
  • (GET|POST) 匹配请求方法GET或POST。
  • .* 再次匹配任意数量的任意字符。
  • \(<HOST>\) 是一个特殊的Fail2Ban占位符,用于匹配日志中的主机名或IP地址。在实际使用中,这通常会被替换为具体的值。
  • .*$ 表示行的结束,前面再次匹配任意数量的任意字符。

四、fail2ban-regex测试和验证正则表达式

fail2ban-regex是fail2ban提供的一个小工具,用于测试正则表达式是否能够匹配到日志文件中的要禁止的IP行。fail2ban-regex在默认情况下会自动匹配到日志文件中的日期和时间部分,因此在编写正则表达式时,通常无需显式包含日期和时间模式。

# fail2ban-regex /path/to/your/jupyter.log /etc/fail2ban/filter.d/jupyter-notebook.confRunning tests
=============
Use      filter file : jupyter-notebook, basedir: /etc/fail2ban
Use         log file : /path/to/your/jupyter.log
Use         encoding : UTF-8Results
=======Failregex: 71851 total
|-  #) [# of hits] regular expression
|   1) [71851] ^.*\[(W|E|I|D) .*] 4\d{2} (GET|POST) .* \(<HOST>\).*$
`-Ignoreregex: 0 totalDate template hits:Lines: 107606 lines, 0 ignored, 71851 matched, 35755 missed
[processed in 52.87 sec]Missed line(s): too many to print.  Use --print-all-missed to print all 35755 lines

fail2ban-regex 测试结果来看:

  1. 正则表达式匹配情况:
    • 正则表达式 ^.*\[(W|E|I|D) .*] 4\d{2} (GET|POST) .* \(<HOST>\).*$ 在日志文件中找到了 71851 次匹配。
    • 这意味着该正则表达式成功地匹配到了日志中很多行,这些行可能表示了Jupyter Notebook的访问尝试(可能是失败的登录尝试或其他相关事件)。
  2. 忽略规则匹配情况:
    • 没有设置忽略规则(Ignoreregex),因此没有日志行被忽略。
  3. 日期模板匹配情况:
    • 测试结果没有直接提到日期模板的匹配情况,但通常这不是主要关注点,因为 fail2ban-regex 主要用于测试正则表达式是否能正确匹配到IP地址和其他关键信息。
  4. 未匹配的行:
    • 有 35755 行日志没有被正则表达式匹配到。这可能是因为这些行的格式与您的正则表达式不匹配,或者它们不包含您想要捕获的信息(如IP地址)。
    • 如果您想要查看所有未匹配的行,可以使用 --print-all-missed 选项来运行 fail2ban-regex 命令。
  5. 性能:
    • 处理 107606 行日志花费了 52.87 秒。这对于一次性测试来说可能是可以接受的,但如果这是在生产环境中实时运行的,您可能需要考虑优化正则表达式或日志处理流程。

总的来说,我们的正则表达式已经成功匹配到了大量日志行,达到了预期。

五、重启 Fail2Ban

最后,重启 fail2ban 以应用新的配置:

systemctl restart fail2ban

六、验证配置生效

通过 fail2ban-client status命令检查:

# fail2ban-client status 
Status
|- Number of jail:	3
`- Jail list:	jupyter-notebook, mysqld-auth, sshd

可以看到此时有三条 Jail 生效,其中 jupyter-notebook是我们自定义的配置。要想进一步了解通过 fail2ban-client status <jail>命令获得详细信息。

fail2ban-client status jupyter-notebook
Status for the jail: jupyter-notebook
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	2
|  `- File list:	/path/to/your/jupyter.log
`- Actions|- Currently banned:	0|- Total banned:	0`- Banned IP list:	

通过命令输出结果来看:

  • 当前失败次数:1。这意味着在最近的日志检查中,有1次尝试(可能是登录尝试)被判定为失败,并触发了fail2ban的机制。
  • 总失败次数:2。自jupyter-notebook监狱启动以来,总共有2次尝试被判定为失败。

因为失败次数maxretry尚未达到触发禁止条件3次,所以暂时没有IP地址被禁止。可见我们的配置已然生效了。

七、一些建议

在互联网环境中,每分钟都有成千上万的类似攻击在不断上演。这些攻击不仅威胁着系统的安全,还可能导致服务中断、数据泄露等严重后果。因此,必须采取有效措施来约束和防范此类攻击。为了应对这一挑战,建议采取以下措施:

  1. 加强日志监控与分析:通过实时监控和分析服务器日志,及时发现并响应可疑请求和攻击尝试。这有助于快速定位问题并采取相应的防御措施。
  2. 更新与加固系统:定期更新系统和应用程序,以修复已知的安全漏洞。同时,加固系统配置,提高系统的安全性。
  3. 部署安全工具:利用fail2ban等安全工具,根据日志中的攻击模式自动阻止恶意IP地址的访问。这有助于减少攻击对服务器的影响。
  4. 限制访问权限:严格控制对敏感文件和资源的访问权限,确保只有授权用户才能访问。
  5. 加强用户教育与培训:提高用户对网络安全的认识和意识,教育用户如何识别和防范网络攻击。

通过综合运用这些措施,可以有效地约束和防范来自互联网的攻击,保护服务器的安全和稳定运行。同时,也有助于减轻服务器的压力和资源损耗,提高系统的整体性能。

参见:


  1. 利用 fail2ban 保护 SSH 服务器_fail2ban ssh-CSDN博客 ↩︎

  2. /etc/fail2ban/filter.d(Centos8位置) ↩︎

相关文章:

利用Fail2Ban增强Jupyter Notebook安全性以防范目录遍历攻击

利用Fail2Ban增强Jupyter Notebook安全性以防范目录遍历攻击 书接上回[^参见]一、目录遍历攻击&#xff08;Directory Traversal Attack&#xff09;二、日志记录的网络攻击示例分析三、配置 Fail2ban四、fail2ban-regex测试和验证正则表达式五、重启 Fail2Ban六、验证配置生效…...

智能贴身监测,健康生活建议,圆道妙医智能手表体验

如今热衷于运动和健康生活的爱好者越来越多&#xff0c;相关的赛事等活动也是逐年增多&#xff0c;很多朋友为了能够直观的了解自己的健康状况&#xff0c;都会配备一款智能手表&#xff0c;这样戴在身上就可以随时了解自己的心率、血氧等数据。最近我尝试了一款圆道妙医推出的…...

C++——AVL树

文章目录 一、AVL树的概念二、AVL树的实现1. AVL树的结构2. AVL树的插⼊2.1 AVL树插⼊⼀个值的⼤概过程2.2 平衡因⼦更新更新原则更新停止条件 2.3 插⼊结点及更新平衡因⼦的代码实现 3. 旋转旋转的原则右单旋左单旋左右双旋右左双旋 4.高度5.结点个数6.判断是否是AVL树7. 中序…...

极市平台 | 无人机相关开源数据集资源汇总

本文来源公众号“极市平台”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;无人机相关开源数据集资源汇总 本文介绍几个无人机有关的开源数据集&#xff0c;内附下载链接。 UAV Delievery 无人机轨迹数据集 下载链接&#xff…...

React和Vue区别,以及注意事项

目录 一、语法和框架特性的差异 二、开发习惯和注意事项 三、特别注意事项 一、语法和框架特性的差异 模板语法&#xff1a; Vue使用了类似于传统HTML的模板语法&#xff0c;通过双大括号{{ }}进行插值&#xff0c;而React则使用了JSX语法。在Vue中&#xff0c;你可以直接在…...

光伏项目难管理的问题如何解决?

1.数字化管理平台的应用 数字化是当前解决光伏项目管理难题的关键手段之一。通过建立统一的数字化管理平台&#xff0c;可以实现对光伏电站的远程监控、数据分析、故障预警及运维调度等功能。这类平台通常集成有智能算法&#xff0c;能够实时分析电站运行数据&#xff0c;及时…...

图片美化SDK解决方案,赋能H5与小程序极致体验

无论是社交媒体分享、电商产品展示&#xff0c;还是个人日常生活的记录&#xff0c;一张经过精心美化的图片总能瞬间吸引眼球&#xff0c;传递出更加丰富和动人的信息。如何在不增加应用体积、不牺牲用户体验的前提下&#xff0c;为H5页面和小程序提供媲美原生APP的图片美化功能…...

Kron Reduction消去法如何操作,矩阵推导过程

三阶矩阵消去单节点 在电力系统中,母线上的电流注入始终为0,这样的节点可以通过一定的方法消除。以三节点为例,假设注入节点3的电流为0,则: [ I 1 I 2 I 3 ] = [ I 1 I 2 0 ] = [ Y 11 Y 12 Y 13 Y 21 Y 22 Y 23 Y 31 Y 32 Y 33 ] [ V 1 V 2 V 3 ] \left[\begin{array}{…...

实时开放词汇目标检测(论文复现)

实时开放词汇目标检测&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 实时开放词汇目标检测&#xff08;论文复现&#xff09;概述模型框架使用方式配置环境训练和评估训练评估 演示效果Gradio Demo 概述 YOLO-World是由腾讯人工智能实验…...

陪诊小程序搭建:打造便利的陪诊环境

陪诊行业作为一个新兴行业&#xff0c;随着老龄化的严重&#xff0c;在近几年中需求量日益旺盛。陪诊师为大众的就医提供了极大的便利性&#xff0c;在看病难、医疗资源紧张方面发挥了积极作用。 在陪诊行业的快速发展下&#xff0c;陪诊小程序为行业带来了便捷的模式&#xf…...

Qt5.15.2静态编译 MinGW with static OpenSSL

如果想用VS2017编译,可参考:Qt5.15.2静态编译 VS2017 with static OpenSSL 一.环境 系统:Windows 10 专业版 64位 编译器:MinGW 8.1.0 第三方工具:perl,ruby和python PS:经验证,用MinGW 12.1.0来编译Qt5.15.2会报错 我用Phthon 2.7.18虽然可以编过,但是强烈建议Pyth…...

Linux Ubuntu dbus CAPI ---- #include<dbus.h>出现“无法打开源文件dbus/xxx.h“的问题

一、确保已安装dbus库和CAPI sudo apt-get install libdbus-1-dev 二、在c_cpp_properties.json的includePath中是否配置了dbus库依赖文件所在的路径 三、编译一个简单的dbus代码&#xff0c;在编译过程中只要出现.h文件找不到的情况&#xff0c;就使用下列命令找到.h文件路径…...

React01 开发环境搭建

React 开发环境搭建 一、创建 React 项目二、项目精简 一、创建 React 项目 执行下述命令创建 react 项目 blu-react-basis npx create-react-app blu-react-basis项目目录结构如下&#xff1a; 执行下述命令启动项目 npm run start启动效果如下&#xff1a; 二、项目精简 …...

数据结构之旅(顺序表)

前言: Hello,各位小伙伴们我们在过去的60天里学完了C语言基本语法,由于小编在准备数学竞赛,最近没有给大家更新,并且没有及时回复大家的私信,小编在这里和大家说一声对不起!,小编这几天会及时给大家更新初阶数据结构的内容,然后我们来学习今天的内容吧! 一. 顺序表的概念和结…...

掌握 C# 内存管理与垃圾回收机制

内存管理是每个开发者需要了解的关键部分&#xff0c;特别是在构建高性能应用时。在 C# 中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09; 机制自动管理内存分配和释放&#xff0c;大大简化了内存管理的复杂性。然而&#xff0c;理解值类型与引用类型的区…...

【JavaEE】——初始网络原理

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;局域网 1&#xff1a;概念 二&#xff1a;局域网的连接方式 1&#xff1a;网线直连 …...

Nginx和Lua配合使用

在NGINX中使用Lua进行开发时&#xff0c;可以通过不同的配置块来指定Lua脚本的执行位置。这些配置块被称为“phase hooks”&#xff0c;即阶段挂钩。每个阶段挂钩都有其特定的作用时间和目的。以下是NGINX Lua模块中常见的配置指令及其用途&#xff1a; 常见的Phase Hooks 1.a…...

程序化交易是什么,它有哪些优势,需要注意什么?

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

水库抽样算法(大数据算法作业)

时隔一个多月&#xff0c;终于想起来写大数据算法基础的实验报告&#xff0c;主要是快截止了&#xff0c;hh 这两天加急把这个报告写完了~ 接下来&#xff0c;写一写证明过程&#xff08;参考书籍&#xff1a;高等教育出版社《数据科学与工程算法基础》&#xff09;主要代码以…...

SHCTF-2024-week1-wp

文章目录 SHCTF 2024 week1 wpMisc[Week1]真真假假?遮遮掩掩![Week1]拜师之旅①[Week1]Rasterizing Traffic[Week1]有WiFi干嘛不用呢&#xff1f; web[Week1] 单身十八年的手速[Week1] MD5 Master[Week1] ez_gittt[Week1] jvav[Week1] poppopop[Week1] 蛐蛐?蛐蛐! SHCTF 2024…...

docker-comapose安装部署mysql

docker-comapose安装部署mysql version: "3.4" services:mysql:image: docker.das-security.cn/middleware/mysql:8.4.1container_name: mysqlenvironment:- MYSQL_ROOT_PASSWORD密码volumes:- /etc/localtime:/etc/localtime- ./configs/mysql/initdb:/docker-entr…...

C语言初阶-数据类型和变量【下】

紧接上期------------------------->>>C语言初阶-数据类型和变量【上】 全局变量和局部变量在内存中存储在哪⾥呢&#xff1f; ⼀般我们在学习C/C语⾔的时候&#xff0c;我们会关注内存中的三个区域&#xff1a; 栈区 、 堆区 、 静态区 。 内存的分配情况 局部变量是…...

C++:命名空间(namespace)详细介绍与案例

命名空间&#xff08;namespace&#xff09;是C中的一个重要概念&#xff0c;用于组织代码和避免名称冲突。它们允许程序员将标识符&#xff08;如变量、函数、类等&#xff09;组织在一起&#xff0c;以便在较大的程序中防止命名冲突。 1. 基本概念 命名空间的基本定义方式如…...

专题十一_递归_回溯_剪枝_综合练习_算法专题详细总结

目录 1. 找出所有⼦集的异或总和再求和&#xff08;easy&#xff09; 解析&#xff1a; 方法一&#xff1a; 解法二&#xff1a; 总结&#xff1a; 2. 全排列 Ⅱ&#xff08;medium&#xff09; 解析&#xff1a; 解法一&#xff1a;只关心“不合法”的分支 解法二&…...

java中Runnable接口是什么?基本概念、工作原理、优点、`Runnable`与`Thread`的对比、与`Callable`接口的对比、实际场景

Runnable接口是Java提供的一种用于实现多线程的接口&#xff0c;通常用来定义任务的具体逻辑。与Thread类不同&#xff0c;Runnable接口只提供一种抽象方法run()&#xff0c;没有任何与线程的生命周期、管理相关的功能。它的主要作用是与Thread类或线程池&#xff08;如Executo…...

Mybatis Plus连接使用ClickHouse也如此简单

通过阅读列式数据库ClickHouse官网&#xff0c;不难看出它有支持JDBC规范的驱动jar包&#xff0c;可以直接集成到Object Relational Mapping框架等&#xff0c;下面我用SpringBootMybatisPlus环境连接ClickHouse来演示一下 集成步骤 1.Maven引入ClickHouse提供的JDBC依赖 <…...

什么社交平台可以找到搭子?分享多款找搭子必备的人气软件

在这个丰富多彩的世界里&#xff0c;我们常常渴望有一个志同道合的搭子&#xff0c;一起分享生活的点滴&#xff0c;共同探索未知的领域。无论是追寻美食的舌尖之旅&#xff0c;还是踏上充满惊喜的旅途&#xff1b;无论是在健身房挥洒汗水…… 找到一个合适的搭子&#xff0c;都…...

STM32 RTC实时时钟 F407 寄存器

RTC介绍 STM32F1: RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。 即在F1系列&#xff0c;RTC的日历部分只有一个32位的寄存器 该寄存器直接存放 时间戳 的值&#xff0c;即&#xff1…...

矩阵等价、向量组等价、线性方程组同解与公共解的关系

矩阵等价 矩阵 A 、 B 等价 ⇔ 两矩阵秩相等 R ( A ) R ( B ) ⇔ 每个矩阵的行秩等于列秩&#xff0c;两个矩阵的行秩与列秩分别相等 ⇔ 若行满秩则列向量组等价 ⇔ 若列满秩则行向量组等价 \begin{align} 矩阵A、B等价\\ &\Leftrightarrow 两矩阵秩相等R(A)R(B)\\ &\…...

[Linux] Linux 进程程序替换

标题&#xff1a;[Linux] Linux 进程程序替换 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 O、前言 一、进程程序替换的直观现象&#xff08;什么是进程程序替换&#xff1f;&#xff09; 二、进程程序替换的原理 三、进程程序替换的函数&#xff08…...