泷羽sec专题课笔记-- Linux作业--开机自启动方法以及破解
本笔记为 泷羽sec 《红队全栈课程》学习笔记,课程请可自行前往B站学习,课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等,请使用该课程、本笔记以及课程和笔记中提及工具的读者,遵守网络安全相关法律法规,切勿进行违法违规违纪的操作。
写在最前面的话,我们为什么要学习网络安全这门技术:
- 维护国家安全
防范网络攻击:网络安全威胁已成为国家安全的重要挑战。学习网络安全有助于识别和防范来自国内外的网络攻击,防止敌对势力通过网络手段窃取敏感信息、破坏关键基础设施或干扰社会正常运作。
保护关键基础设施:现代社会高度依赖网络技术,金融系统、交通网络、电力供应等关键基础设施都依赖于稳定的网络环境。掌握网络安全知识有助于保护这些基础设施免受网络攻击,确保国家的正常运转。
- 促进经济发展
保障数字经济安全:数字经济已成为国家经济增长的重要引擎。通过学习网络安全,可以保障数字经济的健康发展,防止数据泄露和网络犯罪对经济活动的干扰。
增强国际竞争力:在全球化的背景下,网络安全技术水平直接影响国家的国际竞争力。掌握先进的网络安全技术和策略,有助于提升国家在全球数字经济中的地位。
- 提升社会稳定
防范社会风险:网络犯罪和网络恐怖主义对社会稳定构成严重威胁。学习网络安全有助于及时发现和应对这些风险,维护社会的和谐与稳定。
保护公民权益:网络安全直接关系到公民的隐私权和信息安全。通过学习网络安全,可以更好地保护公民的合法权益,增强公众对政府和企业的信任。
- 推动科技进步
创新安全技术:网络安全领域的技术创新不断推动信息技术的进步。学习网络安全有助于推动新技术的研发和应用,提升国家在科技领域的整体实力。
促进国际合作:网络安全是全球性问题,需要各国共同努力应对。通过学习网络安全,可以参与国际网络安全合作,共同制定国际标准和规范,提升全球网络安全水平。
- 强化法治建设
完善法律法规:学习网络安全有助于推动和完善相关法律法规的制定和实施,确保网络安全工作有法可依、有章可循。
提升执法能力:掌握网络安全知识可以提升执法部门的网络侦查和取证能力,有效打击网络犯罪,维护法律权威。
- 培养专业人才
构建人才梯队:网络安全领域需要大量高素质的专业人才。通过系统学习和培训,可以培养出一批具备专业知识和实战经验的网络安全专家,为国家的网络安全事业提供坚实的人才保障。
总之,学习网络安全不仅是个人职业发展的需要,更是维护国家安全、促进经济发展、保障社会稳定和推动科技进步的重要手段。通过不断提升网络安全意识和能力,我们可以更好地应对日益复杂的网络安全挑战,为实现国家的长期稳定和发展贡献力量。
重要的事情说三遍!!!重要的事情说三遍!!!重要的事情说三遍!!!
本节课程相关内容具有一定破坏性,请勿在物理机上操作,也请勿用于实战,请仅在实验环境 / 靶场环境中进行操作,建议只在自己已经做好镜像备份,并且里面没有任何重要资料的虚拟机中操作,虚拟机做好快照克隆镜像操作,玩坏了可以恢复。
一、作业要求和要点
做⼀个像Windows中的⼀样⽆限重启脚本(了解LINUX中的⾃启动)
( 注意: 先拍个快照--别玩脱了)
1、实验环境配置
物理机:win10
虚拟机:vmware + Kali Linux
2、关于系统重启 和 系统无限重启 的实现
linux中是 reboot ,我们可以直接在命令行中输入 reboot 以实现重启的效果,我们可以利用该条命令,组合 bash 脚本功能,利用 Linux 系统的一些自启动特性,比如 crontab / rc.local / init.d / systemd 等方式或者方法,让系统做到开机就重启,达到无限重启的目的。
3、实验的意义
核心目的在于探索并实践 Linux 系统的无限重启现象及其解决方案,通过编写特定的脚本,以及对 Linux 系统自启动各种方式的利用,我们成功触发无限重启这个实验目的。
同时通过这次实验,我们也熟悉并掌握 恢复模式 或者 编辑引导程序 将异常机器从故障中进行脱离排除,一定程度上提升了我们应对系统突发状况的能力。
二、使用 crontab 实现开机 reboot
1、crontab 基本用法
我们使用 cron 任务计划实现开机自启动,首先看下 crontab 的用法:
crontab 是 Unix 和 Linux 的一个命令,用于设置周期性被执行的任务。这些任务被称为“cron 作业”,并且由 cron 守护进程在后台自动运行。crontab 文件包含了这些作业的列表以及它们应该被执行的时间,其常用的命令如下:
crontab -e # 编辑当前用户任务计划
crontab -l # 查看当前用户任务计划
crontab -r # 删除当前用户任务计划
crontab filename # 指定的文件内容替换当前用户的 crontab
首次使用会提示使用哪种文本编辑器,1.是nano,2 和 3 都是vim,2是完整版,3是精简版。
crontab 文件中的每一行都代表一个定时任务,格式如下:
* * * * * command_to_be_executed
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (Sunday=0 or 7)
| | | +------- 月份 (1 - 12)
| | +--------- 日期 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
* * * * * 表示每分钟
0 * * * * 表示
- 分钟:指定任务应该在哪一分钟执行(0-59)。
- 小时:指定任务应该在哪个小时执行(0-23)。
- 日期:指定任务应该在月份的哪一天执行(1-31)。
- 月份:指定任务应该在哪个月份执行(1-12)。
- 星期几:指定任务应该在星期几执行(0-7,其中 0 和 7 都代表星期日)。
2、kali 中创建一个开机重启的任务计划
接下来我们使用 cron 任务计划实现开机自启动,我们需要编写一个脚本。注意,kali 用户使用下面2条命令,分别是创建两个任务计划:
crontab -e # 这条是创建 kali 用户的任务计划
sudo crontab -e # 这条是创建 root 用户的任务计划
因为最终创建完任务计划,在系统中是有个文件的,这个文件的目录是在 /var/spool/cron/crontabs 目录中。
虽然 kali 用户可以用 reboot 来直接重启系统,但是貌似写在任务计划的bash脚本中的 reboot是无法直接启动或执行的的。另外,虽然 root 用户也可以直接 reboot 命令重启系统,但是写在任务计划的bash脚本中的 reboot 必须前面加上 sudo 再能实现重启,另外这个脚本必须 chmod +x 才能被计划任务启动。
所以,这个脚本被 cron 执行并且实时重启,必须有三个条件:1) sudo reboot ;2)用 sudo crontab -e 添加到 root 的用户任务计划中去;3)必须有 x 权限。最终脚本和任务计划应该是下面这样:
# 虽然编辑下面这个文件也可以达到同样的效果
# 但最好还是直接用 sudo crontab -e 进行编辑
┌──(kali㉿kali)-[~]
└─$ sudo tail -1 /var/spool/cron/crontabs/root
* * * * * /home/kali/rootscript.bash┌──(kali㉿kali)-[~]
└─$ cat ~/rootscript.bash
#!/bin/bashsudo reboot┌──(kali㉿kali)-[~]
└─$ ls -l rootscript.bash
-rwxrwxr-x 1 kali kali 27 Nov 30 00:57 rootscript.bash
上面这个任务计划每一分钟会执行一次,所以最长一分钟内就会重新启动,重启后只要赶在第二次执行计划之前,快速把脚本改掉,或者把任务计划删除掉即可恢复正常。
3、crontab 的特殊时间符
crontab 另有如下几个特殊时间符,我们关注到 @reboot 是启动时运行,使用这个特殊时间符可以缩短启动的间隔,即开机就会立即启动。
@reboot
:系统启动时运行。@yearly
或@annually
:每年运行一次,相当于0 0 1 1 *
。@monthly
:每月运行一次,相当于0 0 1 * *
。@weekly
:每周运行一次,相当于0 0 * * 0
。@daily
或@midnight
:每天运行一次,相当于0 0 * * *
。@hourly
:每小时运行一次,相当于0 * * * *
。
接下来,我们模拟自己的操作系统被写入恶意脚本开机就重启,通过 恢复模式 进行恢复,因为 kali linux 的 VMware预装版并没有设置 root 的密码,root 尚在锁定状态,请先使用下面的命令给root账号设置个简单的密码。
sudo passwd root
另外再次重申如下:
重要的事情说三遍!!!重要的事情说三遍!!!重要的事情说三遍!!!
本节课程相关内容具有一定破坏性,请勿在物理机上操作,也请勿用于实战,请仅在实验环境 / 靶场环境中进行操作,建议只在自己已经做好镜像备份,并且里面没有任何重要资料的虚拟机中操作,虚拟机做好快照克隆镜像操作,玩坏了可以恢复。
三、有 root 账户情况下的恢复
假设我们已经给 root 账户创建好了一个简单的密码(太复杂怕你们忘记),然后我们使用下面的命令,给 root 的 crontab 添加一条任务计划。
@reboot /home/kali/rootscript.bash
┌──(kali㉿kali)-[~]
└─$ cat ~/rootscript.bash
#!/bin/bashsudo reboot
重启后,发现会陷入到循环重启过程中,现在我们开始恢复:
1、开机界面选择 Advanced Options
2、选择Recovery Mode
3、输入 root 密码登录系统
有 root 密码的情况下,这里输入密码即可进入 shell 环境。
4、删掉 / 注释掉任务计划 或者 删除掉 恶意bash 脚本
5、保存退出后,重启 reboot 即可恢复正常
kali linux 已经恢复正常。
6、视频演示
模拟系统被植入恶意代码导致无限重启的恢复(有root密码情况下)
四、无 root 账户情况下的恢复(或者即便有 root 但无效的情况下)
1、按 e 进入引导界面
2、添加 linux 这行,末尾添加 init=/bin/bash 直接进入 shell 环境
3、ctrl +x 或者 F10 重启,进入 shell,重新挂载
命令执行过程中发现 Read-only 的话重新挂载
mount -o remount,rw /
4、排查恶意脚本后,如无法正常关机或重新启动
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
5、 视频演示
模拟系统被植入恶意代码导致无限重启的恢复(无root密码情况下,或者即便有root密码也无效的情况下)
五、使用 rc.local 实现开机 reboot
rc.local 目前许多linux 的发行版已经很少使用这个文件了,但是它可以做到无限循环开机。我们先要在 /etc 目录下创建这个文件:
sudo touch /etc/rc.local
然后再在该文件内写入bash 脚本内容,并给它 +x 权限:
┌──(kali㉿kali)-[~]
└─$ sudo cat /etc/rc.local
#!/bin/bashsudo reboot
exit 0┌──(kali㉿kali)-[~]
└─$ sudo chmod +x /etc/rc.local
最后我们重启 rc-local 服务:
sudo systemctl restart rc-local
重启服务后 Linux 系统马上开始无限循环重启了。使用上面的有 root 账户方式进行恢复即可。
六、使用 init.d 实现开机 reboot
在 /etc/init.d/ 文件夹中写入自启动脚本,并 sudo ln -s 至运行级别相应的 /etc/rc?.d/ 文件夹中,改名成S+数字+脚本名.sh 也可以实现开机就循环自启动的效果。/rc?.d/ 中的?是个通配符,它的编号就是相应的运行级别(runlevel),runlevel 和rc?.d中的级别一致,我们 ls -d 查看下:
┌──(kali㉿kali)-[~]
└─$ ls -d /etc/rc?.d/
/etc/rc0.d/ /etc/rc1.d/ /etc/rc2.d/ /etc/rc3.d/ /etc/rc4.d/ /etc/rc5.d/ /etc/rc6.d/ /etc/rcS.d/┌──(kali㉿kali)-[~]
└─$ ls -dl /etc/rc?.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc0.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc1.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc2.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc3.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc4.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc5.d/
drwxr-xr-x 2 root root 4096 Nov 3 11:53 /etc/rc6.d/
drwxr-xr-x 2 root root 4096 Aug 18 18:30 /etc/rcS.d/
我们可以用 runlevel 命令当前运行级别是哪个,普通 kali 用户登录的运行级别一般是 5 ,同时查看下 /etc/rc5.d/ 文件夹下的文件,发现里面所有的文件都是从 /etc/init.d/ 中 ls -s 过来的,另外我们发现有 K 开头的文件也有 S 开头的文件,其中 S 是开机需要启动的脚本,K 是开机需要停止的服务,而数字是启动或者停止的顺序,具体如下:
┌──(kali㉿kali)-[~]
└─$ runlevel
N 5┌──(kali㉿kali)-[~]
└─$ cd /etc/rc5.d ┌──(kali㉿kali)-[/etc/rc5.d]
└─$ ls -n
total 0
lrwxrwxrwx 1 0 0 17 Aug 18 15:55 K01apache2 -> ../init.d/apache2
lrwxrwxrwx 1 0 0 29 Aug 18 15:55 K01apache-htcacheclean -> ../init.d/apache-htcacheclean
lrwxrwxrwx 1 0 0 16 Aug 18 15:52 K01atftpd -> ../init.d/atftpd
lrwxrwxrwx 1 0 0 19 Aug 18 15:42 K01bluetooth -> ../init.d/bluetooth
# 信息较多未全部展示
lrwxrwxrwx 1 0 0 14 Aug 18 15:37 S01cron -> ../init.d/cron
lrwxrwxrwx 1 0 0 14 Aug 18 15:38 S01dbus -> ../init.d/dbus
lrwxrwxrwx 1 0 0 16 Nov 3 11:53 S01docker -> ../init.d/docker
lrwxrwxrwx 1 0 0 17 Aug 18 15:42 S01haveged -> ../init.d/haveged
# 信息较多未全部展示
知道这个模式后,我们把循环启动脚本软连接到目前运行级别对应的 /etc/rc5.d/ 文件夹中,使用的命令如下:
┌──(kali㉿kali)-[/etc/init.d]
└─$ cat script.sh
#!/bin/bashsudo reboot
exit 0┌──(kali㉿kali)-[/etc/init.d]
└─$ sudo ln -s /etc/init.d/script.sh /etc/rc5.d/S99script.sh┌──(kali㉿kali)-[/etc/init.d]
└─$ ll /etc/rc5.d/S99script.sh
lrwxrwxrwx 1 root root 21 Nov 30 20:24 /etc/rc5.d/S99script.sh -> /etc/init.d/script.sh
我们尝试开机,会发现系统自动开始无限循环启动,此时使用上述有 root 密码的方式即可恢复。我们在 恢复模式 下恢复的过程中发现, 恢复模式 的 runlevel 是 1,是不是如果把上面 /etc/init.d/ 的无限启动脚本 ln -s 到 /etc/rc1.d/ 中去的话,是不是 恢复模式 也会出问题呢?
我们处理下软连接,进行如下操作:
此时 reboot 系统即便进入 恢复模式 ,也无法正常进入 root 的 shell ,也就是说 rc1.d 的脚本会先执行。如果需要恢复需要采用上面无 root 账户恢复的方法,请参考上文重新挂载,具体演示略。
七、使用 systemd 实现开机 reboot
我们创建一个叫 reboot.service 的服务,enable 的时候会无限重启,disable 的时候不会无限重启,具体操作如下,首先在 /etc/systemd/system/ 目录下创建一个 reboot.service 的文件:
[Unit]
Description=Reboot Loop Service (Experimental and Dangerous)[Service]
ExecStart=/bin/bash -c 'sudo reboot'
User=root[Install]
WantedBy=multi-user.target
然后按如下操作,当我们对服务进行 start 或者 restart 服务时,系统就会无限重启:
sudo systemctl daemon-reload
systemctl enable reboot.service
sudo systemctl restart reboot.service # 或者 start 也行
后续可以使用 恢复模式 进行恢复,恢复模式 输入 root 账户密码,并在 恢复模式 中,使用下条命令关闭服务,系统就会恢复正常:
systemctl enable reboot.service
八、修改 .bashrc / .zshrc
.bashrc / .zshrc 会在打开一个 shell 的时候加载,这给我们设置重启提供了条件,我们假设 bash / zsh 环境下切换到 root 用户,或者 root 用户打开一个 bash / zsh 的时候就重启。
我们需要分别设置 /root/.bashrc 和 /root/.zshrc 2个文件,在文件末尾添加如下代码,注意有严格的格式要求,包括空格:
if [ "$USER" == "root" ]; then
reboot
fi
这样我们从 kali 账户,使用 su root 切换到 root 用户时,系统就会重启。注意,以下几种情况均会重启:
针对 .bashrc ,在 bash 环境下切换到 root 会重启:
┌──(kali㉿kali)-[~]
└─$ bash --norc
bash-5.2$ su root
Password: # 输完 root 密码回车,就会重启
针对 .zshrc ,在 kali 默认 zsh 环境中,切换到 root 就会重启 :
┌──(kali㉿kali)-[~]
└─$ su root
Password:
针对 .zshrc ,在 恢复模式 中,进入 root 的 shell(实际就是 zsh )也会重启:
以上因为是写在 root 的 .bashrc / .zshrc 文件中,所以我们正常启动用 kali 账户登录就不会触发重启,使用 sudo vim 命令修改两个文件即可恢复正常。
九、修改 .profile
有别于 .bashrc / .zshrc 是在 shell 加载的时候触发,家目录中的 .profile 是在登录的时候触发,登录包括 kali 的视窗登录,和通过 ssh 登录。代码原理和本身同上面的 .bashrc / .zshrc 一样。这次我们先修改 kali 账户家目录的 .profile,具体修改如下:
vim ~/.profile
# 文末添加下列3行代码并 :wq 退出
if [ "$USER" == "kali" ]; then
sudo reboot
fi
然后我们启动 ssh 服务:
sudo systemctl restart ssh
使用 windows 自带的 cmd 或者其他 ssh 登录工具登录,登录后提示如下,此时需要我们为 .profile 脚本中的 sudo reboot 输入密码,如果我们正确输入 kali 账户密码,则立即会重启,如果不想重启,此时可以按 ctrl + c 退出密码输入。
我们再做个实验,用 kali 用户的 sudo 权限修改 root 用户家目录中的 .profile ,具体如下:
vim /root/.profile
# 文末添加下列3行代码并 :wq 退出
if [ "$USER" == "root" ]; then
sudo reboot
fi
修改完毕后,我们重启操作系统,到登录界面用 root 用户进行登录,登录后立即重启。注意,如果我们修改 kali 用户中的 .profile 文件去掉 sudo reboot 前面的 sudo ,也可以达到同样的效果:
十、再次重申
重要的事情说三遍!!!重要的事情说三遍!!!重要的事情说三遍!!!
本节课程相关内容具有一定破坏性,请勿在物理机上操作,也请勿用于实战,请仅在实验环境 / 靶场环境中进行操作,建议只在自己已经做好镜像备份,并且里面没有任何重要资料的虚拟机中操作,虚拟机做好快照克隆镜像操作,玩坏了可以恢复。
相关文章:
泷羽sec专题课笔记-- Linux作业--开机自启动方法以及破解
本笔记为 泷羽sec 《红队全栈课程》学习笔记,课程请可自行前往B站学习,课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等,请使用该课程、本笔记以及课程和笔记中提及工具的读者,遵守网络安全相关法律法规,切勿…...
OpenCV
MFC(C)的使用 1、官网下载 https://opencv.org/ 选 Library - Release - 选择你需要的版本 2、安装 3、配置环境变量 将 OpenCV 的bin目录 C:\Program Files\OpenCV481\opencv\build\bin添加到系统的PATH环境变量中。这使得在运行程序时能够找到 Open…...
Wwise 使用MIDI文件、采样音频
第一种:当采样音频只有一个文件的时候 1.拖入MIDI文件到Interactive Music Hierarchy层级 2.拖入采样音频到Actor-Mixer Hierarchy层级 3.勾选MIDI显示出面板,设置Root Note与采样音频音高相同,这里是C#5 4.播放测试,成功&…...
OpenStack-Glance组件
Glance Glance使用磁盘格式和容器格式基础配置镜像转换 Glance 是 OpenStack 的镜像服务,负责存储、发现和管理虚拟机镜像。它允许用户创建和共享镜像,用于启动虚拟机实例。 Glance 的主要功能 (1)虚拟机镜像的管理 支持镜像的上…...
写译热点单词 | 50篇文章整理 | 手敲自用
目录 文化类 政治类 经济类 教育类 科技类 健康类 安全类 体育类 第二版 删去了部分不太常用的 文化类 1. 阴历: lunar calendar 2. 阳历: solar calendar 3. 春节: the Spring Festival 4. 除夕: Chinese New Year’s Eve 5. 清明节: Tomb Sweeping Day 6. 重阳…...
【UE5 C++】判断两点连线是否穿过球体
目录 前言 方法一 原理 代码 测试 结果 方法二 原理 一、检查连线与球体的相交情况 二、检查距离与球体半径的关系 三、检查连线与球体的相交 代码 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 方法一 …...
A1228 php+Mysql旅游供需平台的设计与实现 导游接单 旅游订单 旅游分享网站 thinkphp框架 源码 配置 文档 全套资料
旅游供需平台 1.项目描述2. 开发背景与意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着社会经济的快速发展,生活水平的提高,人们对旅游的需求日益增强,因此,为给用户提供一个便利的查看导游信息,进行导游招募的平…...
【linux】服务器Ubuntu20.04安装cuda11.8教程
【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录:将头文件复制到 /usr/local/cuda/include/ 目录:将库文件复制到 …...
SpringMVC其他扩展
一、全局异常处理机制: 1.异常处理两种方式: 开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,…...
用“*”构成一个倒三角形:JAVA
输入:5 输出: ******* ***** *** * 代码: import java.util.Scanner; //倒三角 public class FF6 {public static void main(String[] args) {Scanner scannernew Scanner(System.in);while (scanner.hasNextInt()){int nscanner…...
洛谷P2670扫雷游戏(Java)
三.P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩…...
Windows 11 环境下 条码阅读器输入到记事本的内容不完整
使用Windows11时,为什么记事本应用程序中的扫描数据被截断或不完整?为什么sdo 特殊字符的显示与Windows 10 记事本应用程序不同? 很多人认为和中文输入法有关,其实主要问题出在这个windows11下的记事本程序上,大家知道这个就可以了&#x…...
C# 动态类型 Dynamic
文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...
设计模式10:观察者模式(订阅-发布)
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考:简说设计模式——工厂方法模式 - JAdam - 博客园 参考:简单工厂模式(Simple Factory Pattern) - 回忆酿的甜 - 博客园 一:概述 观察者模式࿰…...
2020 年 12 月青少年软编等考 C 语言四级真题解析
目录 T1. 开餐馆思路分析T2. 邮票收集思路分析T3. 带通配符的字符串匹配思路分析T4. 删除数字思路分析T1. 开餐馆 北大信息学院的同学小明毕业之后打算创业开餐馆。现在共有 n n n 个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 n n n 个地点排列在同一条直线…...
高级java每日一道面试题-2024年12月03日-JVM篇-什么是Stop The World? 什么是OopMap? 什么是安全点?
如果有遗漏,评论区告诉我进行补充 面试官: 什么是Stop The World? 什么是OopMap? 什么是安全点? 我回答: 在Java虚拟机(JVM)中,Stop The World、OopMap 和 安全点 是与垃圾回收(GC)和性能优化密切相关的概念。理…...
探索 Apache Commons Collections 4:Java 集合框架的强大扩展
在 Java 开发中,集合框架是处理数据的核心工具。然而,标准 Java 集合框架虽然功能强大,但在某些场景下仍显得不够灵活。Apache Commons Collections 4(以下简称 commons-collections4)作为一个强大的工具库,…...
NIO(New IO)和BIO(Blocking IO)的区别
Java中的NIO(New IO)和BIO(Blocking IO)的区别及NIO的核心组件 Java中的NIO(New IO)和BIO(Blocking IO)是两种不同的网络通信模型,各自具有独特的特性和适用场景。下面将…...
【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序
1、改成Release,生成解决方案 串口助手调试成功后,将Debug改为Release,点击生成解决方案 2、运行exe文件 生成解决方案后,在bin文件夹下, Release文件夹下,生成相关文件 复制一整个Release文件夹…...
Linux 编译 convert_geotiff 时遇到的几个问题
步骤1:安装libgeotiff-dev 在ubuntu上,安装命令为: sudo apt-get install libgeotiff-dev在macos上,安装命令为: brew install libgeotiff在Linux上安装命令为: sudo yum install libgeotiff-devel注意…...
执行存储过程报:This function has none of DETERMINISTIC, NO SQL ???
执行存储过程时报如下错你该怎么整? [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)来…...
JAVA |日常开发中Servlet详解
JAVA |日常开发中Servlet详解 前言一、Servlet 概述1.1 定义1.2 历史背景 二、Servlet 的生命周期2.1 加载和实例化2.2 初始化(init 方法)2.3 服务(service 方法)2.4 销毁(destroy 方法) 三、Se…...
Spring Cloud Alibaba 之 “Sentinel”
从网上下载好sentinel-dashboard-1.6.3.jar,然后执行 java -jar sentinel-dashboard-1.6.3.jar,执行成功之后在浏览器输入localhost:8080,Sentinel的登录名和密码都是sentinel,登陆成功之后看到只有一个首页。 接下来开始整合Spring Cloud Alibaba Sen…...
UE4外挂实现分析-PC端-附源码
UE4外挂实现分析-PC端 游戏分析 分析工具: Cheat Engine 7.5 x64dbg IDA Pro 参考文章: UE4逆向笔记之GWORLD GName GameInstance - 小透明‘s Blog 【项目源码下载】https://download.csdn.net/download/Runnymmede/90079718 本次分析的游戏使用UE4.2…...
力扣88题:合并两个有序数组
力扣88题:合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2,以及它们的长度 m 和 n,要求将 nums2 合并到 nums1,使得合并后的数组仍按非递减顺序排列。 输入与输出 示例 1: 输入&am…...
Lua面向对象实现
Lua中的面向对象是通过表(table)来模拟类实现的,通过setmetatable(table,metatable)方法,将一个表设置为当前表的元表,之后在调用当前表没有的方法或者键时,会再查询元表中的方法和键,以此来实现…...
小程序 模版与配置
WXML模版语法 一、数据绑定 1、数据绑定的基本原则 (1)在data中定义数据 (2)在WXML中使用数据 2、在data中定义页面的数据 3、Mustache语法的格式(双大括号) 4、Mustache语法的应用场景 (…...
【Elasticsearch】实现分布式系统日志高效追踪
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
探索Go语言中的循环单链表
简介 循环单链表是一种特殊的链表数据结构,它的最后一个节点指向链表的头节点,形成一个闭环。今天我们将探讨如何在Go语言中实现和操作这种数据结构。 为什么选择循环单链表? 连续访问:在循环单链表中,可以无限循环…...
[go-redis]客户端的创建与配置说明
创建redis client 使用go-redis库进行创建redis客户端比较简单,只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…...
Windows 和 Linux 系统命令行操作详解:从文件管理到进程监控
1.切换盘符与目录操作 在命令行中,切换盘符和目录是最常见的操作。尽管 DOS 和 Linux 在这些操作上有所不同,但它们都能实现相似的功能。 (1)切换盘符 ①DOS命令:在 DOS 中,切换盘符非常简单,使用 盘符名:ÿ…...
SpringBoot中@Import和@ImportResource和@PropertySource
1. Import Import注解是引入java类: 导入Configuration注解的配置类(4.2版本之前只可以导入配置类,4.2版本之后也可以导入普通类)导入ImportSelector的实现类导入ImportBeanDefinitionRegistrar的实现类 SpringBootApplication…...
etcd-v3.5release-(3)-readIndexRead
笔记1:读操作包括两种,readIndex和serilizable,readIndex指一致性读,一旦a读到了数据x,那么a及a以后的数据都能读到x,readIndex读会先确认本leader是不是有效地leader,如果有效则记录此刻的comm…...
Chrome 中小于 12px 文字的实现方式与应用场景详解
让 Chrome 支持小于 12px 的文字 在 Web 开发中,有时需要将文字显示为小于 12px 的尺寸,尤其是在设计精细的 UI 元素时。虽然大多数浏览器支持小于 12px 的字体大小,但 Chrome 默认情况下会通过调整文本渲染来确保文字可读性,尤其在非常小的文字尺寸下,可能会进行抗锯齿处…...
数据挖掘之数据预处理
引言 数据挖掘是从大量数据中提取有用信息和知识的过程。在这个过程中,数据预处理是不可或缺的关键步骤。数据预处理旨在清理和转换数据,以提高数据质量,从而为后续的数据挖掘任务奠定坚实的基础。由于现实世界中的数据通常…...
slam学习笔记6---样例展示雅可比手推过程
背景:一直在使用模板、自动化求导,对于背后雅可比推导只剩一个基本概念,有必要好好梳理巩固一下。本人水平有限,若推导过程有误,欢迎评论区提出。 假设一个二维slam问题,使用欧式距离观测模型,…...
ThreadLocal 详解
ThreadLocal 详解 ThreadLocal 是 Java 提供的一种线程本地存储机制,用于为每个线程提供独立的变量副本,变量的值仅在线程内可见,从而实现线程隔离。这种特性在需要为每个线程维护独立状态的场景中非常有用,例如用户上下文、事务…...
SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了。windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …...
Unity 基于Collider 组件在3D 物体表面放置3D 物体
实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...
项目搭建:springboot,mybatis, maven
创建一个基于Spring Boot、MyBatis和Maven的项目可以简化很多配置,因为Spring Boot自带了很多自动配置的功能。下面我将给出一个简单的示例来展示如何搭建这样一个项目。 ### 1. 创建一个新的Spring Boot项目 你可以通过Spring Initializr(https://sta…...
网页端五子棋对战(四)---玩家匹配实现上线下线处理
文章目录 1.游戏大厅用户匹配1.1请求和响应1.2设计匹配页面1.3获取玩家信息1.4玩家信息的样式设置1.5初始化我们的websocket1.6点击按钮和客户端交互1.7点击按钮和服务器端交互 2.服务器端实现匹配功能框架2.1方法重写2.2借用session 3.处理上线下线3.1什么是上线下线3.2实现用…...
Linux笔记---进程:进程替换
1. 进程替换的概念 进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。 这种技术通常用于在不创建新进程的情况下,改变进程的行为。 我们之前谈到过for…...
【AI日记】24.12.04 kaggle 比赛 Titanic-7
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容: 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster学习机器学习基础(pandas,numpy,sklearn,seaborn,matplotl…...
使用 Flutter 进行移动应用开发:深入探索
文章目录 前言一、介绍二、安装 Flutter 环境三、Flutter 应用结构与基础组件四、状态管理策略五、高级主题结语 前言 随着移动技术的迅猛发展,跨平台开发的需求日益增长。开发者们一直在寻找一种既能保证应用性能又能减少开发成本和时间的技术方案。Flutter 应运而…...
SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2
Caused by: javax.net.ssl.SSLHandshakeException: the server selected protocol version TLS10 is not accepted by client preferences [TLS12] 原因描述:SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2 解决方法如下: 打开文件…...
Linux命令行解释器的模拟实现
欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:Linux命令行解释器 制作日期:2024.12.04 隶属专栏:linux之旅 本篇简介: 主线带你用ubuntu版系统步步分析实现基础版本的shell;比如支持重定向操作࿰…...
模块化设计割草机器人系统研究与实现(系统架构师论文)
摘要: 割草机器人项目旨在实现自主草坪修剪,以提高园艺工作的效率。本文以具体项目为背景,介绍系统架构师在项目开发过程中的架构设计策略、关键技术应用、问题解决方案和优化措施。首先,本文分析割草机器人项目的总体架构需求&a…...
javascript(前端)作为客户端端通过grpc与cpp(服务端)交互
参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...
股市复盘笔记
复盘是股市投资中非常重要的一个环节,它指的是投资者在股市收盘后,对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结,以便更好地指导未来的投资决策。以下是对复盘的详细解释: 一、复盘的目的 总结市场走势ÿ…...
【SARL】单智能体强化学习(Single-Agent Reinforcement Learning)《纲要》
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...