Shell脚本实践练习
声明
学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。
笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣幸成为一名分享者,最终目标是成为一名开拓者,很有趣也十分有意义
🤵♂️ 个人主页: @One_Blanks
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
- 关注总部:泷羽Sec
目录
- Shell篇技能实践练习
- 用Shell写一个计算器
- 方法一:if-elif-else
- 方法二:使用case语句
- 用Shell定义一个求n的阶乘的函数
- 方法一:递归
- 方法二:循环
- 写一个Shell脚本去筛选eth0网卡的ipv4地址
- grep命令(拓展)
- awk命令(拓展)
- 计划任务添加与重定向输出到指定文件
- 计划任务crontab
- 像Windows中一样无限重启脚本(LINUX中的自启动)
- 自启动:rc.local文件(传统Linux方式)
- 自启动:systemd (现代Linux方式)
Shell篇技能实践练习
用Shell写一个计算器
方法一:if-elif-else
#!/bin/bash
echo 这是一个计算器
read -p "请输入第一个数字:" x1
read -p "请输入需要的运算符:" nm
read -p "请输入第二个数字:" x2
echo 运算式为 $x1 "$nm" $x2
if [ "$nm" = "+" ];then
result=$(expr $x1 + $x2)
elif [ "$nm" = "-" ];then
result=$(expr $x1 - $x2)
elif [ "$nm" = "*" ];then
result=$(expr $x1 \* $x2)
elif [ "$nm" = "/" ];then
result=$(expr $x1 / $x2)
else
echo 输入错误
fi
echo 运算结果为: $result
-
#! /bin/bash 脚本解析器声明
-
if-elif-else型多条件判断,注意 fi 闭合if 语句
-
对变量用""进行包裹,防止 Shell 对其进行通配符扩展,否则此处的*被扩展为,将
*
进行文件名匹配(通配符扩展),而不是将其当作普通的字符*
方法二:使用case语句
#!/bin/bash
echo 这是一个计算器
read -p "请输入第一个数字:" x1
read -p "请输入需要的运算符:" nm
read -p "请输入第二个数字:" x2
echo 运算式为 $x1 "$nm" $x2
case "$nm" in"+")result=$(expr $x1 + $x2);;"-")result=$(expr $x1 - $x2);;"*")result=$(expr $x1 \* $x2);;"/")result=$(expr $x1 / $x2);;
esac
echo 运算结果为:$result
- 注意使用 esac 闭合 case语句
用Shell定义一个求n的阶乘的函数
方法一:递归
#!/bin/bash
qiun() {n=$1if [ $n -eq 0 ]; thenecho 1elsetemp=$((n - 1))result=$(quin $temp)echo $((n * result))fi
}
- 将函数qiun传入参数n-1,当n-1为0时结果为1,函数递归停止
原理:quin(n) = n * quin(n-1)
方法二:循环
- for循环
#!/bin/bash
quin() {n=$1result=1for i in $(seq 1 $n); doresult=$((result * i))doneecho $result
}
-
这里通过seq命令生成从1到n的数字序列,然后通过for循环依次赋值
-
while循环
#!/bin/bash
quin() {n=$1result=1while [ $n -ge 1 ]; doresult=$((result * n))n=$((n - 1))doneecho $result
}
quin 4
- 计算方式用到 ( ( ) ) 最简便的,不同去管什么 (()) 最简便的,不同去管什么 (())最简便的,不同去管什么符号
- 还可用
let “result *= n”
result=$(expr $result \* $n)
result= ( e c h o " (echo " (echo"result * $n" | bc) – bc用于支持更灵活的浮点数运算
写一个Shell脚本去筛选eth0网卡的ipv4地址
#!/bin/bash
ipv4=$(ifconfig eth0 | grep "inet " | awk '{print $2}')
echo "eth0网卡的IPv4地址是: $ipv4"
ifconfig eth0
查看网卡eth0的信息 ,管道符 |
将上一个命令的结果传给下一个命令,grep "inet "
正则匹配输出包含inet
的行内容,awk '{print $2}'
按照默认空格进行分割并输出第二个字段。
grep命令(拓展)
-
语法格式:
基本语法一般是grep [选项] 模式 [文件或文本流]
-
常用选项举例:
-i
:进行忽略大小写的匹配。例如grep -i "hello" file.txt
,不管file.txt
里的hello
是大写还是小写形式,只要包含相应字母组合的行都会被匹配出来。-v
:反向匹配,也就是输出不包含指定模式的行。比如grep -v "error" log.txt
,会把log.txt
中所有不包含error
这个词的行都输出。-r
(或-R
):递归搜索,用于在目录及其子目录下的所有文件中查找匹配的内容。例如要在一个代码项目目录下查找所有包含TODO
字样的文件内容,可以使用grep -r "TODO" project_directory/
,它会遍历project_directory
及其子目录里的所有文件进行搜索。
awk命令(拓展)
-
语法格式:
基本语法是awk '条件{动作}' [文件或文本流]
,其中条件
部分可以是一些用来判断行、字段等是否满足的表达式,比如判断某字段是否等于某个值等;动作
部分通常是要执行的操作,最常见的就是输出某些字段内容(像上面脚本中的print
操作)等。 -
常用操作举例:
- 字段操作:
除了像上面那样简单提取字段,还可以进行更复杂的字段处理。例如有一个文本文件data.txt
,内容如下:
- 字段操作:
apple 3
banana 5
cherry 2
要把每种水果的数量都乘以 2
并输出,可以使用 awk '{print $1, $2 * 2}' data.txt
,这里 $1
输出的是水果名称(第一个字段),$2 * 2
就是对第二个字段(水果的数量)进行乘法运算,运行后输出结果为:
apple 6
banana 10
cherry 4
- 条件判断操作:
比如只想输出数量大于3
的水果信息,可以使用awk '$2 > 3 {print $1, $2}' data.txt
,这里$2 > 3
就是条件判断,只有当第二个字段(数量)大于3
时,才会执行print $1, $2
这个输出动作,输出结果为:
apple 3
banana 5
在实际的 Shell 脚本编写中,grep
和 awk
经常配合使用,先用 grep
筛选出感兴趣的行,再用 awk
对筛选出来的行进一步提取、处理需要的信息.
计划任务添加与重定向输出到指定文件
- 编辑计划任务
crontab -e
- 添加条目
0 12 30 12 * /home/kali/oft/eth0ip.sh >/home/kali/oft/eth0.txt
计划任务的格式为:分 时 日 月 周 命令
这条命令是指在 12月30日任意星期12点整执行命令,并将标准输出重定向到目标指定文件进行保存
注意需要给指定脚本文件添加执行权限,chmod +x eth0ip.sh
计划任务crontab
-
crontab
基本概念-
在 Linux 中,
crontab
是用于设置周期性被执行的指令的工具。cron
是一个守护进程,它会按照设定的时间规则来自动执行任务。crontab
文件中的每一行代表一个任务,每个任务的格式为:分 时 日 月 周 命令
- 分钟(0 - 59):取值范围是 0 到 59,表示每个小时的哪一分钟执行任务。例如,
0
表示整点,15
表示每小时的第 15 分钟。 - 小时(0 - 23):取值范围是 0 到 23,表示一天中的哪个小时执行任务。例如,
9
表示上午 9 点,20
表示晚上 8 点。 - 日期(1 - 31):取值范围是 1 到 31,表示一个月中的哪一天执行任务。不过要注意日期的取值要结合月份来考虑实际有效的日期,例如在 2 月,日期最大取值可能是 28 或者 29(闰年)。
- 月份(1 - 12):取值范围是 1 到 12,表示一年中的哪个月份执行任务。
- 星期(0 - 6):取值范围是 0 到 6,其中 0 表示星期日,1 表示星期一,以此类推。
- 命令:这是要执行的具体脚本、程序或者命令。例如
/bin/bash /home/user/myscript.sh
,就是执行用户家目录下的myscript.sh
脚本文件。
- 分钟(0 - 59):取值范围是 0 到 59,表示每个小时的哪一分钟执行任务。例如,
-
-
crontab
的使用方法-
编辑计划任务
-
要编辑当前用户的计划任务,可以使用
crontab -e
命令。这个命令会根据系统配置打开一个文本编辑器(通常是vi或者nano)。例如,如果你想每天晚上 10 点 30 分备份一个文件,你可以在打开的编辑器中添加以下行:
30 22 * * * /bin/cp /home/user/important_file.txt /backup/
-
如果你希望每两个小时执行一次任务,比如每两个小时检查一次系统负载,可以使用以下条目:
0 */2 * * * /usr/bin/uptime
- 这里
*/2
表示每隔 2 个小时。
-
-
查看计划任务
- 使用
crontab -l
命令可以列出当前用户的所有计划任务。例如,如果你已经设置了几个计划任务,执行crontab -l
会显示这些任务的详细信息,包括执行时间和命令。
- 使用
-
删除计划任务
- 要删除当前用户的所有计划任务,可以使用
crontab -r
命令。不过要小心使用这个命令,因为它会直接清除所有计划任务,没有确认提示。如果只想删除某一个任务,可以先使用crontab -l
查看任务列表,然后使用crontab -e
编辑,删除相应的任务行。
- 要删除当前用户的所有计划任务,可以使用
-
-
系统范围的计划任务(
/etc/crontab
和/etc/cron.d/
)/etc/crontab
文件- 这个文件是系统范围的计划任务配置文件,与用户的
crontab
略有不同。它的格式为:分 时 日 月 周 用户 命令
。多了一个 “用户” 字段,用于指定执行任务的用户。例如:0 3 * * * root /bin/bash /root/system_backup.sh
- 这表示每天凌晨 3 点,以
root
用户身份执行/root/system_backup.sh
脚本。
- 这个文件是系统范围的计划任务配置文件,与用户的
/etc/cron.d/
目录- 这个目录下可以放置多个计划任务文件,用于组织系统范围的计划任务。每个文件的格式与
/etc/crontab
类似,也包含执行时间、用户和命令等信息。这些文件通常是由软件包安装时添加的,用于实现软件的定期维护任务,如日志清理、数据库备份等。
- 这个目录下可以放置多个计划任务文件,用于组织系统范围的计划任务。每个文件的格式与
像Windows中一样无限重启脚本(LINUX中的自启动)
重启脚本
#!/bin/base
echo "1秒后系统重启"
sleep 1
reboot
添加可执行权限
sudo chmod +x reboot.sh
自启动:rc.local文件(传统Linux方式)
sudo touch /etc/rc.local
加权限
sudo chmod +x /etc/rc.local
编辑文件
vi /etc/rc.local
在rc.local
文件中,通常会看到一些注释和一个exit 0
语句。在exit 0
之前添加自启动脚本或命令。
#!/bin/bash
/home/kali/oft/reboot.sh
exit 0
这里的&
符号很重要,它表示将脚本在后台运行。这是因为rc.local
文件的执行是在系统启动的过程中,如果脚本不放在后台运行,可能会阻塞系统启动的其他进程,导致启动过程变慢甚至出现问题。
自启动:systemd (现代Linux方式)
创建.servicee
文件,通常放在/jetc/systemd/system目录下,这个目录用于存放系统管理员创建的服务配置文件,以补充或覆盖系统默认的服务配置。
vim myreboot.service
输入
[Unit]
Description=My Reboot Task[Service]
# 服务类型设为oneshot,适用于执行一次就结束的脚本启动场景
Type=oneshot
# 指定启动脚本的绝对路径,这里假设脚本在/home/user/目录下,需根据实际修改
ExecStart=/usr/bin/bash /home/kali/oft/reboot.sh
# 当脚本执行出错(以非零退出码结束)时尝试重启,最多重启5次,每次间隔10秒
Restart=on-failure
RestartSec=10
StartLimitBurst=5
# 指定运行脚本的用户身份,这里是user,要替换为实际有权限执行脚本的用户名
User=kali[Install]
# 设定该服务应被安装到多用户模式启动目标下,系统进入多用户模式时自动启动
WantedBy=multi-user.target
- [Unit] 部分
- 功能概述:
[Unit]
部分主要用于定义服务单元的基本元数据和依赖关系。它提供了系统在管理和启动服务时所需的一些基本信息,如服务的描述、与其他单元的启动顺序关系等。这些信息帮助 systemd 理解服务的性质和它在整个系统启动流程中的位置。
- 常用配置项:
- Description:
- 这是一个简短的文本描述,用于清晰地说明服务的用途。例如,
Description = My Custom Backup Service
,这样在使用systemctl status
命令查看服务状态或者在日志文件中,都能很容易地识别服务的功能。
- 这是一个简短的文本描述,用于清晰地说明服务的用途。例如,
- After:
- 用于指定此服务应该在哪些其他单元(可以是其他服务、目标等)启动之后再启动。例如,
After = network.target
表示这个服务依赖网络初始化完成,只有在网络相关的目标启动后,本服务才会启动。这对于那些需要网络连接才能正常工作的服务(如网络监控工具、云存储客户端等)非常重要。除了network.target
,还可以是其他服务单元,如syslog.target
(表示在系统日志服务启动之后)等。
- 用于指定此服务应该在哪些其他单元(可以是其他服务、目标等)启动之后再启动。例如,
- Before:
- 与
After
相反,它指定此服务应该在哪些其他单元启动之前启动。不过在实际使用中,相对After
来说较少用到,因为大多数情况下我们更关心服务启动的后置依赖条件。
- 与
- Requires:
- 这个配置项表示当前服务严格依赖于指定的其他单元。如果指定的单元无法启动,那么当前服务也不会启动。例如,
Requires = another_service.service
意味着如果another_service.service
不能正常启动,当前服务会失败。这和After
的区别在于,After
只是定义了启动顺序,即使依赖的单元启动失败,当前服务仍可能尝试启动;而Requires
则是强依赖关系,依赖单元失败会导致当前服务无法启动。
- 这个配置项表示当前服务严格依赖于指定的其他单元。如果指定的单元无法启动,那么当前服务也不会启动。例如,
- Wants:
- 它类似于
Requires
,但表示一种弱依赖关系。如果指定的单元无法启动,当前服务仍然会启动。例如,Wants = optional_service.service
表示希望optional_service.service
启动,但不是必须的,即使它没有启动,本服务也会继续启动。这种配置在一些非关键依赖的场景下很有用,比如某个服务希望有一个辅助服务(如日志收集服务)来增强功能,但即使这个辅助服务不可用,主服务也能运行。
- 它类似于
- Description:
- 功能概述:
- [Service] 部分
- 功能概述:
[Service]
部分聚焦于服务本身的执行细节,包括如何启动、停止服务,服务的类型,以及在遇到错误或其他特殊情况时如何处理等。它是.service
文件的核心部分,直接决定了服务的实际运行方式。
- 常用配置项:
- Type:
- 定义服务的类型,常见的类型有以下几种:
- simple:这是最基本的类型。对于这种类型的服务,
ExecStart
指定的命令就是服务的主进程,systemd 会认为这个进程代表了整个服务。一旦这个进程启动,systemd 就认为服务已经启动。例如,Type = simple
且ExecStart = /usr/bin/myapp
,当/usr/bin/myapp
进程启动后,服务即视为启动状态。这种类型适用于大多数简单的、持续运行的应用程序启动场景。 - oneshot:这种类型用于执行一次就结束的任务。systemd 会等待
ExecStart
指定的命令执行完毕后,才认为服务完成启动。例如,一个用于系统初始化阶段执行一次数据库迁移任务的脚本可以使用这种类型。当脚本执行完成(无论成功与否),服务的启动过程就结束了。 - forking:服务启动后会产生一个父进程,这个父进程会 fork 出子进程,然后父进程退出。systemd 会跟踪子进程作为服务的主进程。这种类型适用于一些传统的、启动方式为 fork 子进程的服务,如一些旧版本的服务器软件。
- notify:和
simple
类型类似,但服务需要在启动完成后通过发送一个特殊的通知消息(如使用sd_notify
函数)给 systemd,systemd 才会认为服务已经启动。这种类型可以用于更精确地控制服务启动过程的通知。 - dbus:服务通过 D - Bus(一种进程间通信机制)来与 systemd 通信,用于启动和管理服务。这种类型主要用于那些基于 D - Bus 接口的服务。
- simple:这是最基本的类型。对于这种类型的服务,
- 定义服务的类型,常见的类型有以下几种:
- ExecStart:
- 这是最重要的配置项之一,用于指定启动服务的命令。它可以是一个可执行文件的绝对路径,也可以是一个包含命令和参数的完整命令行。例如,
ExecStart = /usr/bin/python3 /home/user/my_script.py
,就是使用 Python 3 解释器来运行位于/home/user/
目录下的my_script.py
脚本。确保这个命令的路径和参数正确无误,否则服务将无法正常启动。
- 这是最重要的配置项之一,用于指定启动服务的命令。它可以是一个可执行文件的绝对路径,也可以是一个包含命令和参数的完整命令行。例如,
- ExecStop:
- 用于指定停止服务时要执行的命令。与
ExecStart
类似,它也是一个命令或命令行。例如,对于一个运行在后台的服务器程序,ExecStop
可能是发送一个特定的信号(如kill -TERM
)给服务进程来停止它。如果不指定ExecStop
,systemd 可能会使用默认的停止方式(如发送SIGTERM
信号),但这可能并不适用于所有服务。
- 用于指定停止服务时要执行的命令。与
- Restart:
- 定义服务在什么情况下会自动重启。常见的值有:
- no:服务不会自动重启,这是默认值。
- on - success:只有当服务正常退出(退出码为 0)时才会重启。
- on - failure:当服务以非零退出码退出(即发生错误)时会自动重启。这是比较常用的设置,用于确保服务在遇到可恢复的故障时能够自动重新启动。
- always:无论服务以何种方式退出,都会自动重启。这种设置在一些需要服务始终保持运行状态的场景下很有用,但要注意如果服务存在严重的错误导致反复重启,可能会消耗大量资源。
- 定义服务在什么情况下会自动重启。常见的值有:
- RestartSec:
- 当服务需要重启时,这个配置项指定了重启之间的间隔时间(以秒为单位)。例如,
RestartSec = 5
表示每次重启之间间隔 5 秒。合理设置这个时间可以避免在短时间内频繁重启服务,给服务足够的时间来恢复或者避免对系统资源造成过大的压力。
- 当服务需要重启时,这个配置项指定了重启之间的间隔时间(以秒为单位)。例如,
- StartLimitBurst和StartLimitInterval:
- 这两个配置项一起使用,用于限制服务在一定时间内的启动次数。
StartLimitBurst
指定在StartLimitInterval
时间范围内允许启动的最大次数。例如,StartLimitBurst = 5
和StartLimitInterval = 60
表示在 60 秒内,服务最多允许启动 5 次。如果超过这个限制,systemd 可能会停止尝试启动服务,并将其标记为启动失败状态。这对于防止服务在出现故障时无限次重启导致系统资源耗尽很有用。
- 这两个配置项一起使用,用于限制服务在一定时间内的启动次数。
- User:
- 指定运行服务的用户身份。这对于确保服务以正确的权限运行非常重要。例如,
User = user
表示服务将以user
这个用户的身份运行。要确保这个用户拥有执行ExecStart
命令以及访问服务运行过程中所需资源(如配置文件、数据文件等)的权限。
- 指定运行服务的用户身份。这对于确保服务以正确的权限运行非常重要。例如,
- Type:
- 功能概述:
- [Install] 部分
- 功能概述:
[Install]
部分主要用于定义服务的安装信息,也就是告诉 systemd 在系统启动过程中如何处理这个服务。它决定了服务是否会在系统启动时自动启动,以及如果自动启动,应该在哪个启动目标下启动。
- 常用配置项:
- WantedBy:
- 这是最常用的配置项,它指定了服务应该被安装到哪个系统启动目标下。例如,
WantedBy = multi - user.target
表示服务应该在系统进入多用户模式时自动启动。常见的启动目标还有graphical.target
(用于图形化界面启动时)、rescue.target
(用于系统救援模式)等。通过将服务与适当的启动目标关联,可以确保服务在合适的系统运行阶段自动开启。
- 这是最常用的配置项,它指定了服务应该被安装到哪个系统启动目标下。例如,
- RequiredBy:
- 与
WantedBy
类似,但表示一种更强的依赖关系。如果指定的启动目标没有被激活,那么这个服务也不会被启动。在实际使用中,相对WantedBy
来说较少用到,因为WantedBy
的弱依赖关系更符合大多数服务的启动需求。
- 与
- Alias:
- 可以为服务定义一个或多个别名。这些别名可以在使用 systemd 命令(如
systemctl
)时用于引用服务,方便记忆和操作。例如,Alias = my - service - alias.service
,之后可以使用systemctl start my - service - alias.service
来启动这个服务,就像使用它的原始服务名一样。
- 可以为服务定义一个或多个别名。这些别名可以在使用 systemd 命令(如
- WantedBy:
- 功能概述:
相关文章:
Shell脚本实践练习
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
CentOS上如何离线批量自动化部署zabbix 7.0版本客户端
CentOS上如何离线批量自动化部署zabbix 7.0版本客户端 管理的服务器大部分都是CentOS操作系统,版本主要是CentOS 7。因为监控服务器需要,要在前两天搭建的Zabbix 7.0系统上把这些CentOS 7系统都监控起来。因为服务器数量众多,而且有些服务器…...
DDR3与MIG IP核详解(一)
一、ddr3(全称第三代双倍速率同步动态随机存储器): 1、特点:1:掉电无法保存数据,需要周期性的刷新。2:时钟上升沿和下降沿都会传输数据。 3:突发传输,突发长度 Burst Length一般为…...
转录组数据挖掘(生物技能树)(第11节)下游分析
转录组数据挖掘(生物技能树)(第11节) 文章目录 R语言复习转录组数据差异分析差异分析的输入数据操作过程示例一:示例二:示例三:此代码只适用于人的样本 R语言复习 #### 读取 ####dat read.deli…...
CTF-RE 从0到N:Chacha20逆向实战 2024 强网杯青少年专项赛 EnterGame WP (END)
只想解题的看最后就好了,前面是算法分析 Chacha20 c语言是如何利用逻辑运算符拆分变量和合并的 通过百度网盘分享的文件:EnterGame_9acdc7c33f85832082adc6a4e... 链接:https://pan.baidu.com/s/182SRj2Xemo63PCoaLNUsRQ?pwd1111 提取码:1…...
Spring Boot 的 WebClient 实践教程
什么是 WebClient? 在 Spring Boot 中,WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端,用于与 RESTful 服务或其他 HTTP 服务交互。相比于传统的 RestTemplate,WebClient 更加现代化,具有异步和…...
STM32笔记(串口IAP升级)
一、IAP简介 IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 通常实…...
Ollama - 简化使用本地大语言模型
学习完用 Transformers 和 llama.cpp 使用本地大语言模型后,再继续探索如何使用 Ollama 跑模型。Ollama 让运行和管理大语言模型变得更为简单,它构建在 llama.cpp 之上,并有优化,性能表现同样不俗。下面罗列一下它的特点 从它的 …...
圆域函数的傅里叶变换和傅里叶逆变换
空域圆域函数的傅里叶变换 空域圆域函数(也称为空间中的圆形区域函数)通常指的是在二维空间中,以原点为中心、半径为 a a a的圆内取值为1,圆外取值为0的函数。这种函数可以表示为: f ( x , y ) { 1 if x 2 y 2 ≤ …...
智能交易模型的全景探索:量化技术的进步与未来
随着金融市场日益复杂化,量化交易模型在投资领域扮演着愈加重要的角色。这些模型通过数据驱动和技术创新,赋能投资者在高度波动的市场中寻找确定性收益点。本文将从技术进步、模型构建、应用优势和未来发展四个方面,探讨量化交易模型的演变与…...
mysql学习
1、 数据库的三范式是什么? 2、特点 - 永久性:从本质上来说数据库中的数据以计算机文件的方式存储在磁盘上- 结构性:数据不是杂乱无章的存储- 大量:只受到磁盘空间的影响 3、 Myisam与innodb的区别 4、mysql架构 开始编程语言进…...
小白新手村冒险之“烤”json串
JSON是什么? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但是JSON是独立于语言的文本格式,许多编…...
SQL基础入门—— 简单查询与条件筛选
在SQL中,查询是从数据库中获取数据的核心操作,而条件筛选是查询中不可或缺的一部分。通过使用条件筛选,我们可以精准地从大量数据中提取我们需要的信息。本节将详细讲解如何使用SQL进行简单查询与条件筛选,包含常见的条件运算符和…...
Java线程池种类及具体应用场景
Java线程池种类及具体应用场景 在实际开发中,选择合适的线程池类型至关重要,不同场景有不同的线程池需求。本文将结合线程池种类和具体应用示例,详细说明每种线程池的使用场景和适用情况。 一、固定大小线程池(FixedThreadPool&a…...
3D建筑模型的 LOD 规范
LOD(细节层次) 是3D城市建模中用于表示建筑模型精细程度的标准化描述不同的LOD适用于不同的应用场景 LOD是3D建模中重要的分级标准,不同层级适合不同精度和用途的需求。 从LOD0到LOD4,细节逐渐丰富,复杂性和精度也逐…...
掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)
前面化解了Micro_ROS通讯问题,并在 RT-Thread Studio 环境下,使用Micro_ROS软件包中的例程,实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c ,实现了接收 turtle_teleop_key 所发出的 turtle…...
同步时序电路——描述
这部分要求了解一些触发器的状态方程: R-S触发器: D触发器: JK触发器: 时序电路:任一时刻的输出既与即刻输入有关(若有输入),还与电路当时的状态有关(和以前的输入有关),即电路具有记忆能力。 时…...
.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角
窗体透明, 将Form的属性Opacity,由默认的100% 调整到 80%,这个数字越小越透明(尽量别低于50%,不信你试试看)! 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...
反爬虫机制
许多网站会采取措施来防止爬虫频繁访问或抓取大量内容,这些措施被称为反爬虫机制。常见的反爬手段包括: IP 限制:通过检测频繁访问的 IP 地址,限制该 IP 的访问。 请求频率限制:网站可能通过检测请求间隔过短来判断是…...
ML 系列:第 31 节— 机器学习中的协方差和相关性
文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 (有关详细信息)3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…...
registry 删除私有仓库镜像
原文链接:https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除,只需进行register 磁盘删除镜像 彻底删除了,就可以到达彻底删除的目的。 如果只需要软删除,则只需进行通过API删除。 curl --header "Ac…...
初识java(3)
大家好,今天我们来讲讲我们的老伙计-变量,在哪一门编程语言中,变量的作用都是不可或缺的,那么下面我们就来详细了解一下java中的变量。 一.变量概念 在程序中,除了有始终不变的常量外,有些内容可能会经常…...
前端JavaScript(一)---基本介绍
Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对…...
【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)
🗺️博客地图 📍1、报错发现 📍2、原因分析 📍3、解决办法 📍4、测试结果 1、报错发现 装好了CentOS操作系统,使用ssh远程登陆CentOS,出现如下告警信息: bash: 警告:setlocale…...
P1198 [JSOI2008] 最大数
P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士:单调队列 思路: 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的(真无语了) 我们可以在每次插入时整一个叫…...
嵌入式串口通信 基于芯片STC8H8K64U 串口通信入门001
引言 差不多有四年的时间没有写csdn的原创文章了。一方面是由于家庭的角色转换,已为人母,家中的很多琐事牵绊了我。另一方面是因为工作确实也非常的忙碌。工作需要,也会不断地学习新的知识和复习旧的知识,思来想去,还是决心把工作中的经验心得和遇到的问题,和各位程序猿朋…...
基于Java的小程序电商商城开源设计源码
近年来电商模式的发展越来越成熟,基于 Java 开发的小程序电商商城开源源码,为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行,可以实现管理员;首页、个人中心、用户…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 硬件: 设备容量备注硬盘>500G多版本系统测试,必须固态,否则编译卡死硬盘>300G单系统…...
计算机网络八股整理(二)
计算机网络八股整理(二) 应用层 1:dns的全称了解过吗? dns全称domain-name-system,翻译过来就是域名系统,是在计算机网络中将域名转换成ip地址的分布式数据库系统; 域名服务器的层级类似一个树…...
华财术_号卡分销平台讲解(四大运营商+手机卡)
【号卡分销平台对比讲解稿】 大家好,今天我们来详细对比几款热门的号卡分销平台,帮助您找到最适合自己的合作伙伴。我们将从佣金结算、数据安全、功能特性、用户体验以及适用人群等多个维度进行剖析,让您一目了然各平台的优劣。 一、号易号…...
fatal error in include chain (rtthread.h):rtconfig.h file not found
项目搜索这个文件 rtconfig 找到后将其复制粘贴到 你的目录\Keil\ARM\ARMCC\include 应该还有cJSON,rtthread.h和 等也复制粘贴下...
服务器记录所有用户docker操作,监控删除容器/镜像的人
文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户,所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器,使用的docker …...
电磁继电器
它的控制原理很简单,当我们给它的线圈接电,这个线圈就有了磁性,它上面的衔铁就会被吸引,这样小灯泡就会点亮 继电器于MOS管的差别在于,继电器可以很轻松的胜任高电压、大电流的场合 我们从外壳上可以看到 30VDC&#x…...
Hadoop生态圈框架部署(九)- Hive部署
文章目录 前言一、Hive部署(手动部署)下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…...
thread_id_key != 0x7777(`fibers` 包与 Node.js 16 及以上版本存在兼容性问题)
文章目录 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性1. Node.js 版本兼容性2. 特定包版本 (fibers4.0.3)3. 解决方案和替代方案 结论解决方案 运行yarn serve 启动项目,就会弹出上述错误。 fibers4.0.3 与 node-v16.13.2-win-x64 的兼容性 要判断 fibers4.0.3…...
LabVIEW实现UDP通信
目录 1、UDP通信原理 2、硬件环境部署 3、云端环境部署 4、UDP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合…...
hive的存储格式
1) 四种存储格式 hive的存储格式分为两大类:一类纯文本文件,一类是二进制文件存储。 Hive支持的存储数据的格式主要有:TEXTFILE、SEQUENCEFILE、ORC、PARQUET 第一类:纯文本文件存储 textfile: 纯文本文件存储格式…...
设置Mysql5.6允许外网访问
设置mysql用户支持外网访问步骤: 需要使用root权限登录mysql,更新mysql.user表,设置指定用户的Host字段为%,默认一般为127.0.0.1或者localhost。 1.登录数据库 1 mysql -u root -p 输入密码 1 mysql> use mysql; 2.查询hos…...
【智能制造-44】装配仿真
装配仿真包含以下功能模块: 零件建模与导入模块 功能描述: 能够创建简单的几何零件,如立方体、圆柱体、球体等基本形状。这对于一些标准件或者形状规则的零件来说,可以直接在装配仿真软件中生成,方便快捷。 支持多种…...
如何借助AI生成PPT,让创作轻松又高效
PPT是现代职场中不可或缺的表达工具,但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作,常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化,还重新定义了效率与创意的关系…...
【工具变量】城市供应链创新试点数据(2007-2023年)
一、测算方式:参考C刊《经济管理》沈坤荣和乔刚老师(2024)的做法,使用“供应链创新与应用试点”的政策虚拟变量(TreatPost)表征。若样本城市为试点城市,则赋值为 1,否则为 0…...
线程的生命周期
计时等待(Timed Waiting)状态:这是等待状态的一种特殊情况,当线程调用带有超时参数的等待方法(如Thread.sleep(long millis)、Object.wait(long timeout)等)时会进入计时等待状态。例如,Thread.…...
Python入门(18)--实战项目
机器学习实战项目指南 🤖 项目概览 🌐 本项目是一个综合性的机器学习入门实战指南,通过实际案例展示机器学习项目的完整生命周期,包括数据处理、模型训练、评估和部署等关键环节。 1. 系统架构 🏗️ 1.1 核心组件 …...
DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放
提示:视频转hls流加密、web解密播放 需求:研究视频截屏时,播放器变黑,所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 HLS流媒体协议&a…...
在linux上部署Tomcat方法
上传jdk,配置运行环境 解压jdk安装包 将jdk文件夹移动到/usr/local/jdk目录下 配置java环境变量vim /etc/profile 使环境变量生效,并且查看是否配置成功 安装tomcat,上传tomcat软件包 解压tomcat软件包 将tomcat解压文件移动到/usr/local/tomcat/下 启动…...
Git 使用问题与解决方案
Git 使用问题与解决方案 目录 常见错误及原因分析检查当前使用 HTTPS 或 SSH如何切换远程仓库到 SSHSSH 密钥的配置与验证错误解决步骤总结与参考 1. 常见错误及原因分析 错误提示 fatal: unable to access https://github.com/username/repository.git/: Failed to connect…...
LeetCode 热题 100_最大子数组和(13_53)(贪心算法 ||动态规划)
LeetCode 热题 100_最大子数组和(13_53) 题目描述:输入输出样例:题解:解题思路:代码实现(思路二(贪心算法 ||动态规划)): 题目描述: …...
Z2400023基于Java+Servlet+jsp+mysql的酒店管理系统的设计与实现 源码 调试 文档
酒店管理系统的设计与实现 1.摘要2.主要功能3. 项目技术栈运行环境 4.系统界面截图5.源码获取 1.摘要 本文介绍了一个基于Java的酒店管理系统,该系统采用Servlet、JSP、JDBC以及c3p0等技术构建,为酒店提供了一个全面的管理平台。该系统不仅适合酒店进行…...
T3 TensorFlow入门实战——天气识别
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import numpy as np import os,PIL,pathlib import matplotlib.pyplot as …...
vue3 多种方式接受props,定义ref,reactive
定义props 1 第一种 interface AddType { dialogStudyVisible: boolean; } const props defineProps<AddType>(); 第二种 // const props defineProps({ // dialogStudyVisible:{ // type:Boolean, // default:false // } // }) 第三种 // const …...