linux基础操作11------(运行级别)

一.前言

这个是linux最后一章节内容,主要还是介绍一下,这个就和安全有关系了,内容还是很多的,但是呢,大家还是做个了解就好了。

二.权限掩码

运行级别 0 关机

运行级别 1 单用户 ,这个类似于windows安全模式,可以用于找回密码等操作。

运行级别 2 不带网络的多用户 ,这种是不能联网的。

运行级别 3 完整的多用户模式 multi-user.target , 我们平常使用的模式

运行级别 4 保留

运行级别 5 桌面模式 graphical.target , 桌面版系统就是这个模式,如果不想开机进入图形化界 面,就需要修改运行级别,可以试一下

运行级别 6 重启

centos6是通过数字来设置,centos7都不是用数字了,而是用下面的方式,不过数字设置依然有效:

#切换运行级别

init

# 执行init 6,就会重启,执行init 0就会关机

#查看运行级别

runlevel

systemctl get-default #

#设置运行级别,设置之后一重启就改变了

systemctl set-default graphical.target #设置默认运行级别为图形,注意没有安装图形化界面 工具的话是不能切换为桌面版的

systemctl set-default multi-user.target #设置默认运行级别为命令行 

2.1 掩码

查看掩码值

umask

[root@localhost ~]# umask
0022

这个值就决定着我们创建文件的初始权限,比如我们创建个目录和文件,如下

[root@localhost ~]# mkdir jaden

[root@localhost ~]# touch wulaoban.txt

[root@localhost ~]# ll -h

总用量 4.0K

-rw-------. 1 root root 1.3K 3月 15 20:14 anaconda-ks.cfg

drwxr-xr-x 2 root root 6 3月 27 09:29 jaden

-rw-r--r-- 1 root root 0 3月 27 09:29 wulaoban.txt

# 可以看到,目录的初始权限为755,文件的初始权限为644。这些权限都是通过umask掩码计算得来的。

# 文件权限计算:0666-0022 = 0644

# 目录权限计算:0777-0022 = 0755 

我们还可以修改掩码值来控制初始文件和文件夹的权限:

#修改文件vim /etc/profile,找到umask来修改

root 默认权限掩码 022

普通用户 默认权限掩码 002 

2.2 inode和block 

inode :存储除文件名以外的属性,比如文件路径,inode全称index node,索引节点的意思。索引主 要是用于方便我们进行文件查找的。我们也叫它为目录文件。

block: 存储文件的内容。 

[jaden@localhost ~]$ df -h #查看硬盘空间

文件系统 容量 已用 可用 已用% 挂载点

devtmpfs 980M 0 980M 0% /dev

tmpfs 991M 0 991M 0% /dev/shm

tmpfs 991M 9.6M 981M 1% /run

tmpfs 991M 0 991M 0% /sys/fs/cgroup

/dev/sda1 100G 2.0G 98G 2% /

tmpfs 199M 0 199M 0% /run/user/0

tmpfs 199M 0 199M 0% /run/user/1000

[jaden@localhost ~]$ df -ih # 查看inode空间

文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点

devtmpfs 245K 369 245K 1% /dev

tmpfs 248K 1 248K 1% /dev/shm

tmpfs 248K 707 247K 1% /run

tmpfs 248K 16 248K 1% /sys/fs/cgroup

/dev/sda1 50M 60K 50M 1% /

tmpfs 248K 1 248K 1% /run/user/0

tmpfs 248K 1 248K 1% /run/user/1000

可以看到我们的虚拟机,硬盘100G,inode空间为50M,所以其实硬盘会划分两个空间,一个是存数据 的空间,一个是存文件索引的空间。每个文件会用多个block块来存储,这个block就类似于windows上 我们说的簇,文件数据的最小存放空间单元,每个文件都会有一条目录索引记录到inode空间中,方便 以后我们找寻找个文件。

 

我们在linux上创建文件的时候,可能会看到一个报错信息: No space left on device ,意思是没有 可用空间了。说明要么是硬盘确实存满了,要么是inode空间存满了,如果是inode空间存满了,那么就 去删除那些临时文件或者一些无用的空文件、小文件等等来清理inode空间。 

三.特殊权限 

讲这个的原因是,后期安全课程中有一个叫做提权的概念,可以借助到特殊权限来进行权限提升,让普 通用户能变为root用户。

3.1 suid

例子1:

passwd 是用来修改密码的一个命令文件

[root@localhost ~]# passwd jaden

#看一下passwd文件的权限

[root@localhost ~]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

# 可以看到ugo权限组合中的u权限rws,这个s其实就是x权限,但是s就是用来标记这个文件是一个具有suid权限的特殊执行文件。由于权限位只有9位,所以特殊权限的执行权限用s代替了x。

# 有执行权限的时候是小写的s,去掉用户的执行权限之后,这个地方是大写的S。如下[root@localhost ~]# chmod u-x /usr/bin/passwd

[root@localhost ~]# ll /usr/bin/passwd

-rwSr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

# 再将执行权限加回来,看效果,又变回了小s

[root@localhost ~]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

# 那么,为什么会给这个文件一个叫做suid的权限呢?这个文件是用来修改密码的执行文件,普通用户是不是 也可以修改自己的密码啊,对吧,但是修改密码修改的是/etc/shadow文件内容,看一下/etc/shadow文件 权限:

[root@localhost ~]# ll /etc/shadow

---------- 1 root root 768 3月 27 10:45 /etc/shadow

# /etc/shadow文件权限是000,普通用户根本就没有修改这个文件的权限。因为如果普通用户能修改这个文件,那么root用户的密码就能被普通用户修改了,这就很不安全,对吧。但是每次改密码都找root用户,也 是很麻烦的,所以普通用户也有自己改密码的需求,这怎么办。比如我们登录一下普通用户,修改一下密码试试 

[jaden@localhost ~]$ passwd

更改用户 jaden 的密码 。

为 jaden 更改 STRESS 密码。

(当前)UNIX 密码: # 普通用户修改密码,必须要输入原来的密码,root用户不需要

新的 密码: # 而且密码复杂度要高,比如我设置的是123@qq.com,才行

无效的密码: 密码少于 8 个字符

[jaden@localhost ~]$ passwd

更改用户 jaden 的密码 。

为 jaden 更改 STRESS 密码。

(当前)UNIX 密码: 新的 密码:

重新输入新的 密码:

passwd:所有的身份验证令牌已经成功更新。

# 普通用户修改密码其实比较麻烦,要输入原密码、还要将密码复杂度加高。

# 普通用户也要用passwd修改密码,有这种需求,所以给系统给passwd执行文件了一个特殊权限,就是s。

[root@localhost ~]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

# 那么普通用户使用这个文件的时候,可以拥有这个文件属主的执行权限,也就是root的x权限。所以我们看 到普通用户可以使用passwd来修改自己的密码,这就是suid权限的意思,但是只能修改当前自己的用户密 码,而且是用的root身份来执行的,如下,用普通用户修改一下root用户的密码,看看效果

[jaden@localhost ~]$ passwd root

passwd:只有根用户才能指定用户名。 # 只有root用户才能指定用户名来修改某个用户的密码,普通用户 不能指定用户名,只能修改自己的。

# 如果将passwd文件的s权限去掉了,那么普通用户就没有修改密码的能力了,如下[root@localhost ~]# chmod u-s /usr/bin/passwd

[root@localhost ~]# ll /usr/bin/passwd

-rwxr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

# 切换到普通给用户修改密码看效果:

[jaden@localhost ~]$ passwd

更改用户 jaden 的密码 。

为 jaden 更改 STRESS 密码。

(当前)UNIX 密码:

新的 密码: # abc.123.xx

重新输入新的 密码:

passwd: 鉴定令牌操作错误

# 发现密码修改不了了。因为passwd没有了suid权限。、

# 我们把suid权限再给加回去就可以了。

[root@localhost ~]# chmod u+s /usr/bin/passwd

[root@localhost ~]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

例子2:

netstat -ltp

# root用户身份运行,结果如下

[root@localhost ~]# netstat -ltp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

PID/Program name

tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN

1185/sshd

tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN

1330/master

tcp6 0 0 [::]:ssh [::]:* LISTEN

1185/sshd

tcp6 0 0 localhost:smtp [::]:* LISTEN 1330/master

#普通用户运行,结果如下

[jaden@localhost ~]$ netstat -ltp #p参数普通用户不能使用

(No info could be read for "-p": geteuid()=1000 but you should be root.) # 看到了 一个报错提示,并且PID数据没显示

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

PID/Program name

tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN

-

tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN

-

tcp6 0 0 [::]:ssh [::]:* LISTEN

-

tcp6 0 0 localhost:smtp [::]:* LISTEN

-

# 给netstat执行文件加上suid权限

[root@localhost ~]# chmod u+s /usr/bin/netstat

[root@localhost ~]# ll /usr/bin/netstat

-rwsr-xr-x. 1 root root 155008 8月 9 2019 /usr/bin/netstat

#普通用户再运行,就不报错了,而且看到了PID数据

[jaden@localhost ~]$ netstat -ltp
Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

PID/Program name

tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN

1185/sshd

tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN

1330/master

tcp6 0 0 [::]:ssh [::]:* LISTEN

1185/sshd

tcp6 0 0 localhost:smtp [::]:* LISTEN

1330/master

#加上suid权限,就表示普通用户使用这个执行文件的时候,会用root的身份来运行。#这是suid的作用,但是好多黑客利用它来进行恶意的权限提升。

sgid 其他用户,拥有该文件属组的权限 locate 针对命令文件,一般是读取文件,不能用来搞事情,所 以简单了解一下即可。

# 这个sgid,我找了很久,也就找到一个例子,就是这个locate指令。

# 先安装一下locate指令,如果不知道安装哪个软件包,就查询一下yum provides locate

# yum install mlocate.x86_64 -y # 需要用root用户来安装
 

[root@localhost ~]# locate

locate: 没有指定任何搜索模式[

root@localhost ~]# touch test.txt

[root@localhost ~]# locate test.txt

locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录

[root@localhost ~]# ls

anaconda-ks.cfg jaden jaden2 test.txt wu2.txt wulaoban.txt

[root@localhost ~]# locat wulaoban.txt

-bash: locat: 未找到命令

[root@localhost ~]# locate wulaoban.txt

locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录

[root@localhost ~]# updatedb # 更新一下文件路径记录的缓存,就可以通过locate查看到文件的路径了。

[root@localhost ~]# locate wulaoban.txt

/root/wulaoban.txt

[root@localhost ~]# ll /var/lib/mlocate/mlocate.db

-rw-r----- 1 root slocate 1389239 3月 27 13:43 /var/lib/mlocate/mlocate.db

[root@localhost ~]# which locate

/usr/bin/locate

[root@localhost ~]# ll /usr/bin/locate

-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate

[root@localhost ~]# chmod g-x /usr/bin/locate

[root@localhost ~]# ll /usr/bin/locate

-rwx--S--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate

[root@localhost ~]# chmod g+x /usr/bin/locate

[root@localhost ~]# ll /usr/bin/locate

-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate 

#切换到普通用户

[jaden@localhost ~]$ ls

jaden jaden2 jaden2.txt jaden.txt

[jaden@localhost ~]$ locate jaden.txt # 普通用户也是在slocate组的,所以可以通过locate

查看文件路径

/home/jaden/jaden.txt

[jaden@localhost ~]$ updatedb

updatedb: 无法为 `/var/lib/mlocate/mlocate.db' 打开临时文件

[jaden@localhost ~]$ ll /usr/bin/locate

-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate

# 这个简单了解一下即可。

sticky 叫做粘滞位,这个是针对目录的权限,很多用户共同使用的目录,实现用户之间不能互相删除改 变对方的文件的权限

# 例子:

[jaden@localhost ~]$ ll /

总用量 20

lrwxrwxrwx. 1 root root 7 3月 15 20:10 bin -> usr/bin

dr-xr-xr-x. 5 root root 4096 3月 15 20:14 boot

...

drwxrwxrwt. 13 root root 4096 3月 27 13:58 tmp # 可以看到一个权限位是t,所有用户都有 这个目录的操作权限。

# 为什么需要这么个权限呢?我们自行搞一个目录来看效果:

[root@localhost ~]# cd /

[root@localhost /]# mkdir data

[root@localhost /]# chmod 777 data

[root@localhost /]# ll

总用量 20

lrwxrwxrwx. 1 root root 7 3月 15 20:10 bin -> usr/bin

dr-xr-xr-x. 5 root root 4096 3月 15 20:14 boot

drwxrwxrwx 2 root root 6 3月 27 14:01 data

drwxr-xr-x 19 root root 3160 3月 27 09:22 dev

# 切换到普通用户,去data目录中写入文件

[jaden@localhost ~]$ cd /data/

[jaden@localhost data]$ touch jaden.txt

[jaden@localhost data]$ ls jaden.txt

# 再切换到root下,写文件

[root@localhost /]# cd data/

[root@localhost data]# touch root.txt

[root@localhost data]# ll

总用量 0

-rw-rw-r-- 1 jaden jaden 0 3月 27 14:02 jaden.txt

-rw-r--r-- 1 root root 0 3月 27 14:03 root.txt 

# 现在这个data目录的权限是777,所以任意用户都可以往里面写文件。

# 再切换回普通用户,来删除一下root用户创建的root.txt

[jaden@localhost data]$ ll

总用量 0

-rw-rw-r-- 1 jaden jaden 0 3月 27 14:02 jaden.txt

-rw-r--r-- 1 root root 0 3月 27 14:03 root.txt

[jaden@localhost data]$ rm -rf root.txt

[jaden@localhost data]$ ll

总用量 0

-rw-rw-r-- 1 jaden jaden 0 3月 27 14:02 jaden.txt

# 删除成功了。这就容易混乱了,不同用户之间的文件都可以互相修改删除等。

# 创建data目录的目的就是让大家共享这个目录,但是不能让用户做一些恶意的操作,比如恶意删除其他用户 创建的文件,那么就可以用到sticky 粘滞位来标记这个目录,如下[root@localhost data]# chmod o+t /data/

[root@localhost data]# cd ..

[root@localhost /]# ll

总用量 20

lrwxrwxrwx. 1 root root 7 3月 15 20:10 bin -> usr/bin

dr-xr-xr-x. 5 root root 4096 3月 15 20:14 boot

drwxrwxrwt 2 root root 23 3月 27 14:04 data

drwxr-xr-x 19 root root 3160 3月 27 09:22 dev

# 此时再用root在data目录中去创建个root.txt文件

[root@localhost /]# cd data/

[root@localhost data]# touch root.txt

[root@localhost data]# ll

总用量 0

-rw-rw-r-- 1 jaden jaden 0 3月 27 14:02 jaden.txt

-rw-r--r-- 1 root root 0 3月 27 14:08 root.txt

# 再切换到普通用户,删除root.txt试试

[jaden@localhost data]$ ll

总用量 0

-rw-rw-r-- 1 jaden jaden 0 3月 27 14:02 jaden.txt

-rw-r--r-- 1 root root 0 3月 27 14:08 root.txt

[jaden@localhost data]$ rm -rf root.txt

rm: 无法删除"root.txt": 不允许的操作

# 粘滞位保护了共享目录中,不同用户之间不能互相删除对方的文件。

# /tmp/目录就是这么一个目录。

查看 /tmp 目录的权限 

[root@localhost data]# stat /tmp

        文件:"/tmp"

        大小:4096 块:8 IO 块:4096 目录

设备:801h/2049d Inode:75 硬链接:13

权限:(1777/drwxrwxrwt) ... # 1777,这个1就是粘滞位权限的值,suid这个值是4,sgid这个值是2。

四.su和sudo

4.1 su 

su全称:switch user

# root用户可以很方便的切换到任意用户

[root@localhost ~]# su - jaden

上一次登录:一 3月 27 15:03:29 CST 2023从 192.168.2.110pts/1 上

[jaden@localhost ~]$ ls

jaden jaden2 jaden2.txt jaden.txt 

[jaden@localhost ~]$ exit # 退出,又回到root用户了

登出

[root@localhost ~]#

# 普通用户切换到root用户,必须输入root密码

[jaden@localhost ~]$ su - root

密码: # 需要输入root用户的密码

上一次登录:一 3月 27 10:48:24 CST 2023从 192.168.2.110pts/0 上

[root@localhost ~]# exit

登出

[jaden@localhost ~]$

# 不带-也是可以的,带-的话,就是切换完用户之后,直接到用户家目录下,不带-就不是家目录。

[jaden@localhost ~]$ su root

密码:

[root@localhost jaden]# exit

4.2 sudo 

sudo全称:superuser do,它的作用是用来授权的。就是给普通用户高级权限用的。原因就是很多的操 作,如果都需要root用户去做,太麻烦了,所以可以给普通用户做一些授权,普通用户操作就方便了。 授权就用到了sudo,sudo并不是一下子给用户很多权限,而是一个命令一个命令的授权。

sudo需要修改配置才能开启。 

# root用户才能修改这个配置。

1.配置/etc/sudoers

# 直接visudo就能编辑这个文件

[root@localhost ~]# visudo

#用户名 所有终端 = 运行的用户身份 命令ALL,ALL是所有指令,不能给所有的,不然权限太高了

#在100行下面添加如下内容

jaden ALL=(ALL) /bin/systemctl,/usr/bin/vim,/usr/sbin/reboot # 单独给指令 权限,而且要写指令的绝对路径,逗号分割

# 修改完配置文件,保存退出之后,立马就生效了,不需要重启或者重新登录。

#切换到普通用户,查看可以使用的授权命令

sudo -l

[jaden@localhost ~]$ sudo -l

我们信任您已经从系统管理员那里了解了日常注意事项。

总结起来无外乎这三点:

        #1) 尊重别人的隐私。

        #2) 输入前要先考虑(后果和风险)。

        #3) 权力越大,责任越大。

[sudo] jaden 的密码: # 需要输入jaden用户的密码

匹配 %2$s 上 %1$s 的默认条目:

        !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,

        env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME

        LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",

        env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE 

        LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

用户 jaden 可以在 localhost 上运行以下命令: # 提示可以使用sudo来执行的命令

        (ALL) /bin/systemctl, /usr/bin/vim, /usr/sbin/reboot

[jaden@localhost ~]$

2.使用sudo执行命令

# 授权的命令使用起来和普通指令是不同的,需要使用sudo来执行命令,也就是以授权的方式来执行指令。

# 比如reboot重启

[jaden@localhost ~]$ sudo reboot

Connection closing...Socket close.

Connection closed by foreign host.

...

# 比如重启网卡

# sudo systemctl restart network #start,stop,restart

# 比如:vim权限

[jaden@localhost ~]$ vim /etc/shadow

[jaden@localhost ~]$ sudo vim /etc/shadow

# 注意,vim的权限很大,比如可以修改密码,可以修改授权配置文件等,甚至root用户的密码都可以修改, 所以不要将vim的root权限给普通用户。

五.linux普通用户提权 

5.1 sudo提权 

就是我们进行sudo授权时给的授权太高,或者给授权时控制的不合理,就会被普通用户利用来提权。

示例1:

vim # 命令模式执行: !/

        # 通过vim修改/etc/sudoers,授权ALL

        # 再通过vim进入一个文件

        # :输入指令,是可以直接输入系统指令的,前面加一个!即可,比如创建一个文件,!touch 3.txt

        # 查看3.txt信息如下

        [jaden@localhost ~]$ ll

        总用量 0

        -rw-r--r-- 1 root root 0 3月 27 17:05 3.txt # 以root用户身份创建的文件

        # 如果在vim文件时,执行!/bin/bash,就进入到了root的命令终端,可以为所欲为。

        # 这就是sudo提权,但是sudo提权需要借助到可以执行系统指令的交互式的功能,比如vim。

示例2:

        find # sudo find . -exec bash \; # 直接进入root的命令终端,这个指令退出root终端可能 要退好几次才行,看find找到了几个文件,找到了3个文件,就输入三次exit才能退出。

示例3:

        awk # sudo awk 'BEGIN {system("/bin/bash")}' jaden.txt # 直接进入到root命令终 端,exit直接退出。

# 还有好多指令可以提权,比如cp命令也可以提权,将其他电脑上的/etc/shadow文件拷贝到这个系统中, 密码就改掉了,再su切换到root即可等等,还有什么mv、vi、sed修改文件、chmod改重要文件权限等等这 里就不多提了。大家可以试试,普通用户使用sudo来修改shadow文件的root用户的密码。 

5.2 脏牛提权 

dcow全称dirty cow,脏牛,原理:Linux内核的内存子系统在处理写入时复制(copy-on-write, COW, 组合起来是牛的意思)时产生了竞争条件。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进 行写访问,所以大家都管这个提权方式叫做脏牛提权。原理这一块大家不需要掌握,会监测是否存在这 个漏洞即可。

仓库地址:https://github.com/gbonacini/CVE-2016-5195

# github上对它有介绍,比如哪些版本的系统有这样的漏洞。要某个系统版本和gcc版本同时满足的时候才会 有这个漏洞,我们的centos7.8虽然系统版本能对上,但是gcc版本高,对不上,所有没有这个漏洞,不能用 这个程序提权,所以我给大家准备了一个虚拟机系统,大家打开直接用来玩玩即可。 

#上传文件 脏牛提权.zip

unzip 脏牛提权.zip

cd CVE-2016-5195-master/

make         #编译

./dcow -s         #提权

# 看内核版本,比如我们使用的

[jaden@dms CVE-2016-5195-master]$ cat /etc/redhat-release

CentOS Linux release 7.2.1511 (Core) 

说明这个系统有这个漏洞,解决这个漏洞就是升级系统或者升级gcc软件版本。也可以用我们的centos7.8自己试试,应该是不能提权。

六.总结 

本期的linux基础到这已经全部更新完,本期还涉及到了网路安全的内容,大家做个小知识了解一下就好了,后期还会更新其他的知识点,期待大家的点赞关注加收藏。 

 

 

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

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

相关文章

QT+Visual Studio 配置开发环境教程

一、QT架构 Qt Creator 是一个轻量级、跨平台的 IDE,专为 Qt 开发量身打造,内置对 qmake/CMake 的深度支持、Kits 配置管理、原生 QML 调试器以及较低的资源占用维基百科。 而在 Windows 环境下,Visual Studio 配合 Qt VS Tools 扩展则可将 Q…

(2)JVM 内存模型更新与 G1 垃圾收集器优化

JVM 内存模型更新与 G1 垃圾收集器优化 🚀 掌握前沿技术,成为顶尖 Java 工程师 2️⃣ JVM 内存模型更新 👉 点击展开题目 JVM内存模型在Java 17中有哪些重要更新?如何优化G1垃圾收集器在容器化环境的表现? &#x1…

TASK04【Datawhale 组队学习】构建RAG应用

目录 将LLM接入LangChain构建检索问答链运行成功图遇到的问题 langchain可以便捷地调用大模型,并将其结合在以langchain为基础框架搭建的个人应用中。 将LLM接入LangChain from langchain_openai import ChatOpenAI实例化一个 ChatOpenAI 类,实例化时传入超参数来…

springAI调用deepseek模型使用硅基流动api的配置信息

查看springai的官方文档,调用deepseek的格式如下: spring.ai.deepseek.api-key${your-api-key} spring.ai.deepseek.chat.options.modeldeepseek-chat spring.ai.deepseek.chat.options.temperature0.8 但是硅基流动的格式不是这样,这个伞兵…

SpringMVC 通过ajax 实现文件的上传

使用form表单在springmvc 项目中上传文件,文件上传成功之后往往会跳转到其他的页面。但是有的时候,文件上传成功的同时,并不需要进行页面的跳转,可以通过ajax来实现文件的上传 下面我们来看看如何来实现: 方式1&…

Docker安装Fluentd采集中间件

Fluentd 简介 :Fluentd 是一个高性能、可扩展的数据收集与聚合工具,能够统一数据收集和消费,实现各种数据源到各种数据接收器的高效传输,广泛应用于日志收集等领域。 功能特点 : 统一日志收集 :支持从各种…

07SpringMVC底层形象解析

目录 一、基于餐厅比喻的代码示例 ,帮助你理解各组件间的协作关系 1. DispatcherServlet 配置(服务员) 2. HandlerMapping 配置(菜单索引) 3. Controller 实现(厨师) 4. Service 层&#x…

eclipse 生成函数说明注释

在Eclipse中生成函数说明注释(JavaDoc风格)可以通过以下方法实现: 快捷键方式: 将光标放在函数上方输入/**后按回车键Eclipse会自动生成包含参数和返回值的注释模板 菜单方式: 选中函数点击菜单栏 Source > Gen…

【题解-洛谷】P6180 [USACO15DEC] Breed Counting S

题目:P6180 [USACO15DEC] Breed Counting S 题目描述 Farmer John 的 N N N 头奶牛,从左到右编号为 1 …

基于Android的XX校园交流APP

开发语言:Java框架:ssmAndroidJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 APP登录 APP首页…

25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection

76个工业组件库示例汇总 工业防火墙 - 工控网络保护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟工业防火墙在保护关键工控网络(特别是 DCS - 分布式控制系统)免受网络攻击(如勒索软件传播)方面的核心功能。组件通过可视化简化的网络拓扑、模拟网络流量、应用防火…

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别: SharingStarted.Eagerly: 立即开始收集上游流,即使没有下游订阅者持续保持活跃状态,直到 ViewModel 被清除优点:响应更快,数据始终保持最新缺点:消耗更多资源&#x…

Windows_RustRover Rust语言开发环境构建

Windows_RustRover Rust语言开发环境构建 一、Rust语言简介(一)起源与发展(二)语言特点(三)应用场景(四)社区与生态 二、RustRover(一)主要功能(二…

XCOSnTh-fatfsShell

#include "XCOSnTh.h" #include "ff.h" #include "stdio.h" static char pwd[1024]"1:"; static char pwdCount2; FRESULT lsExe(char *path,int(*printf)(const char* format, ...)) {FRESULT res;DIR dir;FILINFO fno;// 打开根目录…

篇章十 消息持久化(二)

目录 1.消息持久化-创建MessageFileManger类 1.1 创建一个类 1.2 创建关于路径的方法 1.3 定义内部类 1.4 实现消息统计文件读写 1.5 实现创建消息目录和文件 1.6 实现删除消息目录和文件 1.7 实现消息序列化 1. 消息序列化的一些概念: 2. 方案选择&#xf…

中间件-seata

分布式事务seata 角色组成角色指责AT模式TCC模式 角色组成 TC:事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。TM:事务管理者,定义全局事务的范围:开始全局事务、提交或回滚全局事务。RM&am…

python代码绘制某只股票最近90天的K线图、均线、量能图

运行代码,要求输入股票代码和名称,其他参数可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在线升级 FPGA 在线升级FLASH时,一般是通过逻辑生成SPI接口操作FLASH,当然也可以通过其他SOC经FPGA操作FLASH,那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA,只有CCLK是专用引脚,SPI接口均为普…

Azure 应用服务中的异常处理、日志记录和通知:综合指南

简介 Azure 应用服务是基于云的应用程序,使开发人员能够在云上构建、部署和管理应用程序。与任何应用程序一样,制定适当的异常处理、日志记录和通知实践至关重要,以确保应用程序平稳运行,并快速识别和解决任何问题。在本篇博文中&…

Java 应用如何实现 HTTPS:加密数据传输的实用指南

Java 应用如何实现 HTTPS:加密数据传输的实用指南 在当今的互联网环境中,数据安全至关重要,HTTPS 作为加密的数据传输协议,为 Java 应用提供了安全通信的保障。本文将深入探讨 Java 应用如何实现 HTTPS,通过详细代码实…