linux入门系列9--用户管理及文件权限控制

2023-11-09

​ 前面文章分享了Linux下常用命令以及Shell编程相关知识,本节继续学习Linux用户管理及文件权限控制。

​ Linux是多用户多任务操作系统,具有很好的稳定性和安全性。既然是多用户,那就意味着多个用户可以同时使用同一个Linux操作系统,因此就会涉及用户的添加、修改、删除等管理工作以及权限分配问题;平时使用Linux系统一般是用于信息处理,而文件是信息载体,因此也需要掌握文件相关的操作和权限。

​ 相信大家平时在使用windows操作系统时,为了不让别人轻易看到某些敏感文件,而把文件设置为隐藏文件,Linux下是否也能实现同样的操作?是否能通过隐藏权限让黑客最多只能查看某些日志文件但不能进行修改和删除操作?是否能够对某个用户或某个用户组进行特殊的权限设置,让其只有能满足工作需求的最小权限,从而降低安全风险?本篇文章将逐一解决这些疑问。

一、用户及用户组管理

1.1 用户相关命令

​ 针对初学者,在日常工作中,一般都是领导分配一个拥有一定权限的账号,然后开展各项工作,不会开放很高的权限。但初学阶段,正如前面系列文章所演示,都是直接用root账户进行操作,这样的目的是减少权限带来的干扰,让我们更专注于相应知识点的学习。但是在生产环境中建议慎用root,因为权限太大,控制不当会有安全隐患。

1.1.1 who命令

​ who命令用于查看登录用户信息,包括:who、whoami、who am i。

  • whoami

功能描述:*查看当前登录用户的用户名*

案例:

~~~[root@heimatengyun test]# whoamiroot[root@heimatengyun test]# su - testLast login: Sat Nov 30 22:55:38 CST 2019 on pts/0[test@heimatengyun ~]$ whoamitest[test@heimatengyun ~]$ exitlogout~~~

可以看到,切换用户后,相应的结果发生变化,只显示当前登录的用户。

  • who am i

功能描述:*显示最初登录时用的用户名(无论切换几次)*

案例:

~~~[root@heimatengyun test]# who am iroot pts/0 2019-12-17 22:23 (192.168.78.1)[root@heimatengyun test]# su - testLast login: Tue Dec 17 22:31:09 CST 2019 on pts/0[test@heimatengyun ~]$ who am iroot pts/0 2019-12-17 22:23 (192.168.78.1)[test@heimatengyun ~]$ exitlogout~~~

​ 可以看到,切换后用户名还是显示最开始登录时的用户名称。

  • who

功能描述:*显示当前有哪些用户真正登录到了本台机器(不会显示那些用su命令切换的用户)*

案例:

~~~[root@heimatengyun test]# who(unknown) :0 2019-12-17 22:22 (:0)root pts/0 2019-12-17 22:23 (192.168.78.1)[root@heimatengyun test]# su - testLast login: Tue Dec 17 22:34:44 CST 2019 on pts/0[test@heimatengyun ~]$ who(unknown) :0 2019-12-17 22:22 (:0)root pts/0 2019-12-17 22:23 (192.168.78.1)[test@heimatengyun ~]$ exitlogout~~~

​ 可以看到用su命令切换用户后,显示结果中并咩有test用户,因此显示的知识真正登录到本机的所有用户。

1.1.2 id命令

语法:id 用户名

功能描述:判断用户是否存在

案例:

~~~[root@heimatengyun test]# id testuid=1000(test) gid=1000(test) groups=1000(test)[root@heimatengyun test]# id loverid: lover: no such user~~~

​ 如果用户存在返回用户信息,如果用户不存在则提示no such user

1.1.3 useradd命令

语法:

​ useradd [选项] 用户名

功能描述:

​ 添加新用户,默认的用户家目录存放在/home目录中,默认的Shell解释器为 /bin/bash,同时会默认创建一个与该用户同名的基本用户组。在创建用户时,通过以下参数可以修改默认设置。

选项:

参数 作用
-d
home-dir,指定用户的家目录,默认为/home/username
-e
expiredate,账户到期时间,格式:YYYY-MM-DD
-u
uid,指定用户默认的UID
-g
gid,指定初始用户基本组,组必须已存在
-G
groups,指定一个或多个扩展用户组
-N
no-user-group,不创建与用户同名的基本用户组
-s
shell,指定用户默认的Shell解释器

案例:

(1)采用默认参数创建用户

~~~[root@heimatengyun test]# id loverid: lover: no such user[root@heimatengyun test]# useradd lover[root@heimatengyun test]# id loveruid=1001(lover) gid=1001(lover) groups=1001(lover)[root@heimatengyun ~]# cat /etc/passwd...省略部分内容lover:x:1001:1001::/home/lover:/bin/bash~~~

创建的用户保存在/etc/passwd文件中,可以通过此文件查看用户信息。

一行为一条用户记录,分为7个字段,每个字段用冒号分隔。每个字段分别对应:

用户名:密码:UID:GID:注释:家目录:伪用户

(2)创建用户指定家目录、UID以及Shell解释器

~~~[root@heimatengyun ~]# useradd -d /home/heima -u 9988 -s /sbin/nologin heimage[root@heimatengyun ~]# id heimageuid=9988(heimage) gid=9988(heimage) groups=9988(heimage)[root@heimatengyun ~]# ls /home/heima test~~~

/sbin/nologin是终端解释器中的一员,但是与Bash解释器不同,被设置为nologin后,用户将不能登录到系统中。

RHEL7(Centos7)系统中,用户身份有3种:管理员、系统用户、普通用户。系统的管理员用户UID为0;系统用户UID 为 1~999, Linux 系统为了避免因某个服务程序出现漏洞而被黑客提 权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏 范围;普通用户 UID 从 1000 开始,是由管理员创建的用于日常工作的用户。

需要注意的是,UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。

另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且 这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户 组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满 足日常的工作需要。

1.1.4 passwd命令

语法:

​ passwd [选项] 用户名

功能描述:

​ 设置或修改用户密码、过期时间、认证信息等。

选项:

参数 作用
-l
lock,锁定用户,禁止登录
-u
unlock,解除锁定,允许用户登录
-e
expire,强制用户在下次登录时修改密码
-S
status,显示yoghurt的密码是否被锁定,以及密码采用的加密算法名称

案例:

(1)修改其他账户密码

~~~[root@heimatengyun test]# passwd loverChanging password for user lover.New password:Retype new password:passwd: all authentication tokens updated successfully.~~~

​ 修改的密码不能太简单,否则修改不成功。修改成功后,即可使用账户进行登录。在界面中登录后,即可查看当前登录用户

~~~[root@heimatengyun test]# wholover :0 2019-12-17 23:05 (:0)root pts/0 2019-12-17 22:23 (192.168.78.1)~~~

新建一个用户,如果没有设置密码,则用户无法直接登录,只能通过root用户使用su命令切换。因此,一般新建用户就会同时设置密码。也就是说useradd和passed命令一般是一起使用。

​ 无论是普通用户还是超级权限用户都可以运行passwd命令,但是如果是普通用户则只能修改自己的密码。配合选项参数可以实现更丰富的功能,具体用法可以通过man命令进行查看。

(2)锁定及解锁账户

假设你部门有一位同事要休假半年,那么可以通过-l参数锁定用户,禁止其登录,等休假完毕回来上班后再使用-u参数将其解锁。这样避免了删除用户、添加用户带来的麻烦同时也保证了这段时间内系统的安全。

~~~[root@heimatengyun ~]# passwd -S testtest PS 2019-11-27 0 99999 7 -1 (Password set, SHA512 crypt.)[root@heimatengyun ~]# passwd -l testLocking password for user test.passwd: Success[root@heimatengyun ~]# passwd -S testtest LK 2019-11-27 0 99999 7 -1 (Password locked.)[root@heimatengyun ~]# passwd -u testUnlocking password for user test.passwd: Success[root@heimatengyun ~]# passwd -S testtest PS 2019-11-27 0 99999 7 -1 (Password set, SHA512 crypt.)~~~

1.1.5 usermod命令

语法:

​ usermod [选项] 用户名

功能描述:

​ 修改用户信息

Linux系统一切皆文件,修改用户也就是修改配置文件。用户信息保存在/etc/passwd文件中,可以直接采用文本编辑器修改也可以通过usermod命令进行修改。

选项:

参数 作用
-e
expiredate,账号到期时间,格式为YYYY-MM-DD
-g
gid,变更所属用户组
-G
groups,变更扩展用户组
-L
lock,锁定用户禁止其登录
-U
unlock,解锁用户,允许其登录
-u
uid,修改用户的UID

案例:

​ 通过-G参数将上边创建的lover用户加入到root用户组

~~~[root@heimatengyun test]# id loveruid=1001(lover) gid=1001(lover) groups=1001(lover)[root@heimatengyun test]# usermod -G root lover[root@heimatengyun test]# id lover
uid=1001(lover) gid=1001(lover) groups=1001(lover),0(root)~~~

1.1.5 userdel命令

语法:

​ userdel [选项] 用户名

功能描述:

​ 当用户不会再登录系统,则使用此命令删除用户

选项:

参数 作用
-f
force,强制删除
-r
remove,删除用户及用户家目录

案例:

​ 删除之前创建的lover用户,并删除目录

~~~[root@heimatengyun home]# pwd/home[root@heimatengyun home]# lslover test[root@heimatengyun home]# userdel -r loveruserdel: user lover is currently used by process 4419[root@heimatengyun home]# userdel -rf lover[root@heimatengyun home]# lstest~~~

​ 删除用户时默认会保留用户主目录,添加-r参数则会删除home目录下用户主目录。-f表示强制删除,由于前文通过界面上登录了lover用户,所以提示有进程在使用,通过-f强制删除用户。

1.2 用户组相关命令

1.2.1 groupadd命令

语法:

​ groupadd [选项] 组名

功能描述:

​ 添加用户组,有时候为了高效的管理系统中各个用户的权限,经常会将多个用户添加到一个指定组中。

案例:

添加heima用户组并查看组信息

~~~[root@heimatengyun ~]# groupadd heima[root@heimatengyun ~]# cat /etc/group...省略部分内容test:x:1000:testheima:x:1001:~~~

/etc/group文件包含所有组信息,可以查看到刚才添加的heima用户组。

/etc/group文件每行表示一条记录,标识一个用户组。每条记录分为四个字段,用冒号分割。第一字段:用户组名称;第二字段:用户组密码;第三字段:GID;第四字段:用户列表,每个用户之间用逗号分隔,本字段可以为空

1.2.2 groupmod命令

语法:

​ groupmod [选项] 新组名 老组名

功能描述:

选项:

参数 作用
-n
修改组名称

案例:

(1)修改heima组名称heimage

~~~[root@heimatengyun ~]# groupmod -n heimage heima[root@heimatengyun ~]# cat /etc/group...省略部分内容test:x:1000:testheimage:x:1001:~~~

(2)新建并添加用户到heimage组

~~~[root@heimatengyun ~]# cat /etc/group...省略部分内容test:x:1000:testheimage:x:1001:[root@heimatengyun ~]# useradd -g 1001 heimagege[root@heimatengyun ~]# id heimagegeuid=1001(heimagege) gid=1001(heimage) groups=1001(heimage)[root@heimatengyun ~]# cat /etc/group...省略部分内容test:x:1000:testheimage:x:1001:[root@heimatengyun ~]# cat /etc/passwd...省略部分内容heimagege:x:1001:1001::/home/heimagege:/bin/bash~~~

1.2.3 groupdel命令

语法:

​ groupdel 组名

功能描述:

​ 删除组,前提是组内没有用户才能删除

案例:

(1)删除用户组

~~~[root@heimatengyun ~]# groupdel heimagegroupdel: cannot remove the primary group of user 'heimagege'[root@heimatengyun ~]# userdel heimagege[root@heimatengyun ~]# groupdel heimage~~~

(2)查看组内用户

如案例1所示,如果组内有用户则无法直接删除组。可以通过/etc/group文件匹配对应的组名查看对应组内有哪些用户

~~~[root@heimatengyun ~]# grep 'test' /etc/grouptest:x:1000:test~~~

查找之前建的test组内有哪些用户,第四个字段即为该组内所有用户列表。

二、文件及相关权限

2.1 文件权限

2.1.1 ll命令查看文件权限

Linux中一切皆文件,但是每个文件类型可能不同,如何区分文件类型呢?每个文件都有所有者和所有组以及其他人对文件拥有的读、写、执行权限,如何查看文件的这些权限呢?

当然是通过ls或ll命令就可以查看

~~~[root@heimatengyun test]# ll-rw-r--r--. 1 root root 9 Nov 30 20:43 test1.txtdrwxr-xr-x. 2 root root 6 Dec 20 11:32 test1~~~

ll命令显示结果详解

file

以test1.txt文件为例,各部分代表的含义依次为如下

  • 文件类型:
    第一个字符“-”表示文件类型,此处表示test1.txt是一个普通文件。不同文件类型用不同字符表示,文件类型与字符对应关系如下
符号 文件类型
-
普通文件
d
目录文件
l
连接文件
b
块设备文件
c
字符设备文件
p
管理文件
s
套接字文件

  • 文件权限:

“rw-r--r--.”,可以分为四段,前三段每三位为一段,最后一个点单独为一段。第一段rw-表示文件创建者/所有者对该文件所具有的权限,第二段r--表示创建者/所有者所在的组的其他用户所具有的权限,第三段r--表示其他组的其他用户所具有的权限。第四段.

字符 权限类型
r
read,读取权限,数字表示为4。对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限
w
write,写入权限,数字表示为2。对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限
x
execute,执行权限,数字表示为1。对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。
s或S SUID,Set UID,可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。
t或T sticky,/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。
.或 如果为 表示设置了ACL

此处test1.txt文件,其创建者/所有者具有可读可写的权限,其创建者/所有者所在的组的其他用户具有可读权限,其他组的其他用户则具有可读权限。

文件权限除了可以使用rwx表示,也可以用数字表示。如777代表:rwxrwxrwx(r=4,w=2,x=1,4 2 1=7=rwx),由此可以看出数字表示会简洁一些。

  • 连接个数

对于文件,表示指向它的链接文件的个数;对于目录文件,表示它的第一级子目录的个数。注意此处看到的值要减2才等于该目录下的子目录的实际个数,比如test1目录下其实并没有任何文件和目录,但此处显示为2,这是因为要加上.目录和..目录。在linux下,.目录表示当前目录,..目录表示上一级目录。

  • 所有者和所属组

表示该文件的所有者/创建者(owner)及其所在的组(group)。

  • 文件大小

如果是文件,则表示该文件的大小,单位为字节。如果是目录,则表示该目录符所占的大小,并不表示该目录下所有文件的大小。

  • 修改日期

该文件最后修改的日期时间。

  • 文件名称

文件或目录的名称。

不同的shell窗口,还能用颜色区分文件的属性,能一目了然通过颜色区分文件类型,普通文件、可执行文件、压缩文件、目录、连接文件都有不同的颜色区分。不同工具可以根据自己需要进行颜色方案的修改和配置,这里就不说了。

2.1.2 文件权限设置

2.1.2.1 chmod命令

语法:

​ chmod [选项] [ugoa] [ -=] [rwx或数字] 文件或目录

选项参数:

选项 含义
-R
recursive,递归执行

属性符号 作用
u
文件拥有者
g
文件所属组
o
文件所属组外的其他用户
a
所有用户,相当于是ugo同时使用

操作符号 作用

添加权限
-
删除权限
=
设置权限,未指定的部分将被清除

权限符号 作用
r
对于文件有查看权限,对于目录可以列出目录内容
w
对于文件有修改权限,对于目录可以在目录中创建和删除
x
对于文件有执行权限,对于目录可以进入目录

功能描述:

​ 改变文件或目录权限

案例:

(1)分别通过ugoa添加文件的可执行权限

~~~[root@heimatengyun test1]# lltotal 8-rw-r--r--. 1 root root 6 Dec 20 14:52 hello-rw-r--r--. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod u x hello[root@heimatengyun test1]# lltotal 8-rwxr--r--. 1 root root 6 Dec 20 14:52 hello-rw-r--r--. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod g x hello[root@heimatengyun test1]# lltotal 8-rwxr-xr--. 1 root root 6 Dec 20 14:52 hello-rw-r--r--. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod o x hello[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rw-r--r--. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod a x test[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxr-xr-x. 1 root root 6 Dec 20 14:51 test~~~

从示例可以看到可以通过u、g、o分别对不同部分赋予权限,也可以直接用o一次性赋值。根据实际需要灵活选择即可。

(2)移除所有者或所属组之外其他用户的执行权限

~~~[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxr-xr-x. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod o-x test[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxr-xr--. 1 root root 6 Dec 20 14:51 test~~~

(3)用数字设置权限

~~~[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxr-xr--. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod 777 test[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test~~~

(4)通过=号设置权限

~~~[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chmod o=w test[root@heimatengyun test1]# lltotal 8-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello-rwxrwx-w-. 1 root root 6 Dec 20 14:51 test~~~

(5)改变目录下所有文件

~~~[root@heimatengyun test]# chmod -R 777 test1[root@heimatengyun test]# lldrwxrwxrwx. 2 root root 29 Dec 20 14:52 test1[root@heimatengyun test]# cd test1/[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test~~~

可以看到内部的所有文件权限一次性被修改。

2.1.2.2 chown命令

语法:

​ chown [选项] 最终用户[:最终所属组] 文件或目录

参数:

参数 作用
-R
递归修改

功能描述:

​ 改变文件或目录的所有者

案例:

(1)修改文件所有者

~~~[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test[root@heimatengyun test1]# chown test test[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello-rwxrwxrwx. 1 test root 6 Dec 20 14:51 test~~~

(2)递归修改目录及其下所有文件所有者

~~~[root@heimatengyun test]# chown -R test:test /root/test/test1[root@heimatengyun test]# lldrwxrwxrwx. 2 test test 29 Dec 20 14:52 test1[root@heimatengyun test]# cd test1/[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello-rwxrwxrwx. 1 test test 6 Dec 20 14:51 test~~~

这种用法在修改所有者时同时修改了所属组。注意,修改的当前目录及其下的所有文件都会修改,上级目录不会影响。如此处的/root/test目录不会变化,只会影响test1目录。

2.1.2.3 chgrp命令

语法:

​ chgrp 最终用户组 文件或目录

功能描述:

​ 改变文件或目录的所属组

案例:

~~~[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello-rwxrwxrwx. 1 test test 6 Dec 20 14:51 test[root@heimatengyun test1]# chgrp root test[root@heimatengyun test1]# lltotal 8-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello-rwxrwxrwx. 1 test root 6 Dec 20 14:51 test~~~

2.2 文件特殊权限

​ 单纯设置文件的 rwx 一般权限无法满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位。

​ 这是一种对文件权限进行设置的特殊功 能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

2.2.1 SUID

​ 针对二进制程序设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。SUID是一种有条件的、临时的特殊权限授权方法,下文以passwd命令进行介绍。

​ 还记得1.1.4讲的passwd命令吗?该命令用于修改用户密码,所有用户都可以执行 passwd 命 令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中,执行passwd命令本质就是修改shadow文件。

​ 但仔细查看这个文件就会发 现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。

~~~[root@heimatengyun test1]# ll /etc/shadow----------. 1 root root 1157 Dec 20 00:06 /etc/shadow~~~

​ 既然没有此密码文件读写权限,那为何所有用户都可以执行命令修改密码呢?先不急,我们来看看passed命令的权限。

~~~[root@heimatengyun test1]# ll /bin/passwd-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd~~~

​ 可以看到所有者权限为rws,以前讲过可执行权限为x,此处为s。对,就是因为所有者的权限由 rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID 权限。在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。

说明:设置SUID后,如果原本没有执行权限,则为S,有执行权限则为s。如rwx将变为rws,rw-变为rwS。

设置SUID权限,就是使用之前介绍的chmod命令即可,针对命令或可执行二进制文件进行设置。

~~~[root@heimatengyun test]# ll-rwxrwxrwx. 1 root root 145 Dec 1 16:06 mypid.sh[root@heimatengyun test]# chmod u s mypid.sh[root@heimatengyun test]# ll-rwsrwxrwx. 1 root root 145 Dec 1 16:06 mypid.sh~~~

2.2.2 SGID

主要应用场景和功能有:

(1)让执行者临时拥有所属组权限,对拥有执行权限的二进制程序进行设置。

(2)在某个目录中创建的文件自动继承该目录的用户组,只可以对目录进行设置。

SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文 件所有者的临时权限,而是获取到文件所属组的权限。

针对第二种功能,我们知道,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户,即该用户就是文件的所有者。

假设有这样一种情况,需要在部门内创建一个共享目录,部门内所有人员都能读取目录中的内容。如果每个人都去建立各自的文件,所有者和所属组都是创建者自己,别人无法使用。SGID的出现就是为了解决这个问题,创建部门共享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。

SGID功能就是在某个目录中创建的文件自动继承该目录的用户组,只可以对目录进行设置。

下面演示在目录上创建SGID

~~~[root@heimatengyun test]# mkdir sgid[root@heimatengyun test]# lldrwxr-xr-x. 2 root root 6 Dec 20 18:11 sgid[root@heimatengyun test]# chmod 777 sgid/[root@heimatengyun test]# lldrwxrwxrwx. 2 root root 6 Dec 20 18:11 sgid[root@heimatengyun test]# chmod g s sgid/[root@heimatengyun test]# lldrwxrwsrwx. 2 root root 6 Dec 20 18:11 sgid~~~

创建SGID后,就可以切换到普通用户,创建文件,观察文件的所属组

~~~[root@heimatengyun test]# su - testLast login: Fri Dec 20 17:26:36 CST 2019 on pts/0[test@heimatengyun ~]$ cd sgid/[test@heimatengyun sgid]$ echo 'hello'>hello[test@heimatengyun sgid]$ lltotal 4-rw-rw-r--. 1 test root 6 Dec 20 18:14 hello~~~

可以看到test普通用户创建的文件所属组变为给上层文件夹一致属于root,不再属于test自己。这样针对所属组设置权限,其他用户就可以实现操作文件。

2.2.3 SBIT

SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

回到上文的例子,当一个部门共享一个目录后,如何避免用户删除其他用户的文件呢?显然用SBIT就可以保证用户不能删除别人的文件。

设置目录SBIT,同样用chmod命令

~~~[root@heimatengyun test]# mkdir sbit[root@heimatengyun test]# lldrwxr-xr-x. 2 root root 6 Dec 20 18:26 sbit[root@heimatengyun test]# chmod -R o t sbit/[root@heimatengyun test]# lldrwxr-xr-t. 2 root root 6 Dec 20 18:26 sbit~~~

与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T。

我们仔细观察,就会发现/tmp目录其实就是默认设置了SBIT,它是一个共享目录,保证用户只能删除自己的文件。

~~~[root@heimatengyun /]# ll -d /tmp/drwxrwxrwt. 15 root root 4096 Dec 20 18:30 /tmp/~~~

创建新用户并在tmp下创建文件,验证用其他用户去删除看能否删除,答案肯定是不能删除的。

~~~[root@heimatengyun /]# useradd heimagege[root@heimatengyun /]# su - heimagege[heimagege@heimatengyun ~]$ cd /tmp/[heimagege@heimatengyun tmp]$ echo 'heimagege'>heimagege[heimagege@heimatengyun tmp]$ ll-rw-rw-r--. 1 heimagege heimagege 10 Dec 20 18:34 heimagege[root@heimatengyun /]# su - testLast login: Fri Dec 20 18:29:10 CST 2019 on pts/0[test@heimatengyun ~]$ cd /tmp/[test@heimatengyun tmp]$ rm -f heimagegerm: cannot remove ‘heimagege’: Operation not permitted~~~

2.3 文件隐藏属性

​ Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起 来的权限,默认情况下不能直接被用户发觉。当你新接手一台服务器,碰到明明权限充足但却无法删除某个文件的情况,或者仅能在日志文件中追加内容而不能修改或删除内容,这肯you可能就是设置了文件隐藏属性。这种属性在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux 系统的安全性。

2.3.1 chattr命令

语法:

​ chattr [选项] [ -=参数] 文件

选项及参数:

选项 作用
R
递归

参数 作用
i
无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容 而不能新建或删除文件
a
仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S
文件内容在变更后立即同步到硬盘(sync)
s
彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A
不再修改这个文件或目录的最后访问时间(atime)
b
不再修改文件或目录的存取时间
d
使用 dump 命令备份时忽略本文件/目录
u
当删除该文件后依然保留其在硬盘中的数据,方便日后恢复

功能描述:

​ 设置文件的隐藏权限

案例:

通过隐藏属性,设置文件不能删除

~~~[root@heimatengyun test]# echo 'test chattr'>testattr[root@heimatengyun test]# chattr a testattr[root@heimatengyun test]# rm testattrrm: remove regular file ‘testattr’? yrm: cannot remove ‘testattr’: Operation not permitted~~~

2.3.2 lsattr命令

语法:

​ lsattr 文件

功能描述:

​ 显示文件的隐藏权限

案例:

​ 查看文件隐藏属性,删除隐藏属性

~~~[root@heimatengyun test]# lsattr testattr-----a---------- testattr[root@heimatengyun test]# chattr -a testattr[root@heimatengyun test]# lsattr testattr
---------------- testattr[root@heimatengyun test]# rm testattrrm: remove regular file ‘testattr’? y[root@heimatengyun test]#~~~

​ 可以看到,删除隐藏属性后文件删除成功。

2.3 文件访问控制列表

前文讲解的一般权限、特殊权限、隐藏权限都是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件 的访问控制列表(ACL)了。

2.3.1 setfacl命令

基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录中 的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。

语法:

​ setfacl [参数] 文件名称

参数选项:

参数 作用
-R
递归参数
-m
modify修改目录或文件的ACL
-b
删除扩展ACL,保留原有的基础权限

功能描述:

​ 管理文件的 ACL 规则

案例:

让普通用户能访问root目录

~~~[root@heimatengyun ~]# ll -d /root/dr-xr-x---. 16 root root 4096 Dec 20 11:49 /root/[root@heimatengyun ~]# su - testLast login: Fri Dec 20 18:34:47 CST 2019 on pts/0[test@heimatengyun ~]$ ls /root/ls: cannot open directory /root/: Permission denied[test@heimatengyun ~]$ exitlogout~~~

未设置ACL前其他用户是不能访问root目录的,设置root目录ACL允许test访问。

~~~[root@heimatengyun ~]# setfacl -Rm u:test:rwx /root/[root@heimatengyun ~]# ll -d /root/
dr-xrwx--- 16 root root 4096 Dec 20 11:49 /root/[root@heimatengyun ~]# su - testLast login: Fri Dec 20 22:10:26 CST 2019 on pts/0[test@heimatengyun ~]$ ls /root/anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Videos Desktop Downloads Music Public test~~~

同时通过ll命令可以看到权限后边的点变为了 。这个标识说明已经设置了ACL。

2.3.2 getfacl命令

语法:

​ getfacl 文件名称

功能描述:

​ 查看文件上设置的ACL信息

案例:

(1)查看文件上设置的ACL

~~~[test@heimatengyun ~]$ getfacl /root/getfacl: Removing leading '/' from absolute path names

file: root/

owner: root

group: root

user::r-xuser:test:rwxgroup::r-xmask::rwxother::---~~~

(2)删除文件ACL

~~~[root@heimatengyun ~]# ll -d /root/dr-xrwx--- 16 root root 4096 Dec 20 11:49 /root/[root@heimatengyun ~]# setfacl -b /root/[root@heimatengyun ~]# ll -d /root/
dr-xr-x---. 16 root root 4096 Dec 20 11:49 /root/~~~

2.4 临时权限提升

​ 平时学习一般直接用root可以避免各种配置服务或权限导致的干扰问题,使得学习中心放在相应的知识点上。但是正式工作中,往往很少用root操作,因此可能会涉及用户切换以及用户提权问题。

2.4.1 su命令

​ su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切 换到其他用户。

​ 由于前文已经演示了su命令的用法,因此不再赘述。只是要注意su命令与用户名之间有一个减号(-),这意味着完全切 换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强 烈建议在切换用户身份时添加这个减号(-)。另外,当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了;这也是一个必要的安全检查。

2.4.2 sudo命令

​ 尽管使用 su 命令后,普通用户可以完全切换到 root 管理员身份来完成相应工作,但这将暴露 root 管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。

​ sudo 命令可以把特定命令的执行权限赋予给指定用户而无需给出root密码, 这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。

语法格式:

​ sudo [参数] 命令

参数:

参数 作用
-l
列出当前用户可执行的命令

功能描述:

​ sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务。

​ 使用sudo之前需要先配置sudo服务,配置文件为/etc/sudoers,可以直接编辑此文件,也可以使用visudo命令进行配置。

案例:

(1)为普通用户test添加sudo权限

​ 未为普通用户配置sudo服务时,通过sodo命令查看能执行的命令,将提升没有配置。

~~~[root@heimatengyun ~]# su - testLast login: Fri Dec 20 22:14:02 CST 2019 on pts/0[test@heimatengyun ~]$ sudo -lWe trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things:

1) Respect the privacy of others.

2) Think before you type.

3) With great power comes great responsibility.

[sudo] password for test:Sorry, user test may not run sudo on heimatengyun.~~~

​ 通过visudo命令,在“root ALL=(ALL) ALL”后仿照添加“test ALL=(ALL) ALL”,然后保存退出。操作方式跟vi编辑器一致。

配置内容解释:test ALL=(ALL) ALL 其中test为用户名,表示谁可以使用sudo,第一个ALL表示是运行使用的主机,等号之后括号内的ALL表示以谁的身份执行,最后的ALL表示可执行命令的列表。“谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表”

配置后,再次使用test用户来查看,将得出如下结果:

~~~[root@heimatengyun ~]# su - testLast login: Fri Dec 20 22:41:52 CST 2019 on pts/0[test@heimatengyun ~]$ sudo -l[sudo] password for test:Matching Defaults entries for test on this host:requiretty, !visiblepw, alwayssethome, envreset, envkeep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LSCOLORS", envkeep ="MAIL PS1PS2 QTDIR USERNAME LANG LCADDRESS LCCTYPE", envkeep ="LCCOLLATELCIDENTIFICATION LCMEASUREMENT LCMESSAGES", envkeep ="LC_MONETARYLCNAME LCNUMERIC LCPAPER LCTELEPHONE", envkeep ="LCTIME LC_ALLLANGUAGE LINGUAS XKBCHARSET XAUTHORITY",secure_path=/sbin:/bin:/usr/sbin:/usr/binUser test may run the following commands on this host:(ALL) ALL~~~

表明针对test用户的sudo服务配置成功。配置成功之后,就可以采用sudo提升test用户的权限了。

~~~[test@heimatengyun ~]$ ls /root/ls: cannot open directory /root/: Permission denied[test@heimatengyun ~]$ sudo ls /root/anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates VideosDesktop Downloads Music Public test[test@heimatengyun ~]$~~~

是不是很神奇,test用户通过sudo提权就可以看到root目录内容了。

(2)按需为用户配置sudo权限

我们前边直接给了ALL最大的权限,实际情况应该按需分配最小权限,比如我们只给test用户cat命令权限。

通过whereis命令查看cat所在路径,一定要给命令的绝对路径,不然系统无法识别命令。

~~~[test@heimatengyun ~]$ whereis catcat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz~~~

通过visudo命令修改之前添加的内容为:test ALL=(ALL) /usr/bin/cat。保存后切换到test普通用户查看效果

~~~[root@heimatengyun ~]# visudo...省略部分内容

Allow root to run any commands anywhere

root ALL=(ALL) ALL

test ALL=(ALL) ALL

test ALL=(ALL) /usr/bin/cat...省略部分内容[test@heimatengyun ~]$ sudo -l[sudo] password for test:Matching Defaults entries for test on this host:requiretty, !visiblepw, alwayssethome, envreset, envkeep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LSCOLORS", envkeep ="MAIL PS1PS2 QTDIR USERNAME LANG LCADDRESS LCCTYPE", envkeep ="LCCOLLATELCIDENTIFICATION LCMEASUREMENT LCMESSAGES", envkeep ="LC_MONETARYLCNAME LCNUMERIC LCPAPER LCTELEPHONE", envkeep ="LCTIME LC_ALLLANGUAGE LINGUAS XKBCHARSET XAUTHORITY",secure_path=/sbin:/bin:/usr/sbin:/usr/binUser test may run the following commands on this host:(ALL) /usr/bin/cat[test@heimatengyun ~]$ cat /etc/shadowcat: /etc/shadow: Permission denied[test@heimatengyun ~]$ sudo cat /etc/shadow...省略部分内容heimagege:!!:18250:0:99999:7:::[test@heimatengyun ~]$ ls /root/ls: cannot open directory /root/: Permission denied[test@heimatengyun ~]$~~~

从实验结果可以看出,配置cat命令后,只能执行cat命令,再次使用ls命令就不能看到root目录内容。这样权限就得到了很好的控制。

学习完用户及文件相关权限知识后,下一篇文章我们将讲解防火墙相关知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux入门系列9--用户管理及文件权限控制 的相关文章

  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 干净地销毁System V共享内存段

    我在用shmget shmat and shmctl分别获取和创建共享内存段 将其附加到进程地址空间中并删除它 我想知道进程是否仍然可以使用共享内存段 即使它已被分离并要求使用删除 shmctl id IPC RMID 在一个过程中 我无法
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐

  • C++智能指针详解

    1 概述 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码必须显式的销毁它们 在C 中 动态内存的管理是用一对
  • Linux下的两个特殊的文件(可用来清理日志)——/dev/null与/dev/zero

    1 dev null简介 在类Unix系统中 dev null被称为空设备 是一个特殊的设备文件 写入 dev null 会丢弃一切写入其中的数据 但报告写入操作成功 读取 dev null 则会立即得到一个EOF 在Unix行话中 dev
  • OpenMP、MPI、CUDA总结

    文章目录 一 OpenMP 1 1 多执行绪的概念 1 2 多执行绪的程式 1 3 OpenMP 的基本使用 1 4 OpenMP使用详解 二 MPI Message Passing Interface 三 CUDA 3 1 CUDA发展历
  • 华为OD2023(A卷)基础题23【最短木板长度】

    题目描述 小明有n块木板 第i 1 i n 块木板的长度为ai 小明买了一块长度为m的木料 这块木料可以切割成任意块 拼接到已有的木板上 用来加长木板 小明想让最短的木板尽量长 请问小明加长木板后 最短木板的长度最大可以为多少 输入描述 输
  • Git超实用总结,再也不怕记忆力不好了

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯工蜂发表于云 社区专栏 Git 是什么 Git 是一个分布式的代码管理容器 本地和远端都保有一份相同的代码 Git 仓库主要是由是三部分组成 本地代码 缓存区 提交历史 这
  • js if判断多个条件_python量化基础

    编辑 Cowboy 校对 李明 来源 牛角财经 目的 python量化基础 条件分支与循环 IF条件分支判断语句的用法 python教程 从入门到高级 免费 特点 案例基于金融市场数据展开 让python量化初学者快速上手 一 基础部分 人
  • springboot/cloud版本升级常见问题和文档

    版本对照链接 https spring io projects spring cloud overview 升级mybatis的starter版本后 集成mybatis spring尽量用高版本 要不然容易出现datesource无法找到或
  • MATLAB R2021b(07)

    详细原文介绍 神经网络入门详解 nftool MathWoks 神经网络入门随记 以及 matlab中神经网络工具箱的使用 关于神经网络的非常基础概念 个人笔记 不具权威性 仅供参考 欢迎指正错误 提供意见 交流讨论等 1 思路简介 我们有
  • 【PCIe】3: PCIe BDF(Bus,Device,Function)

    目录 1 概述 2 BUS 总线号 3 Device 设备号 4 Function 功能号 1 概述 PCIe总线中的每一个功能都有一个唯一的标识符与之对应 这个标识符就是BDF Bus Device Function
  • Knife4j 基础(OpenAPI2)

    1 Knife4j OpenApi2 入门示例 Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案 本文按照官方文档 在 SpringBoot2 7 项目中 集成 Knife4j 的 OpenApi2 版本
  • vscode中编译时当前工作目录的设置

    options cwd usr bin 在tasks json中options选项中 使用cwd项进行编译过程当前工作目录的设置 上面的代码把编译时的当前工作目录强制设置到 usr bin 如果使用该选项不设置 则工作目录为当前打开工程的文
  • go ethereum private net 在miner.start()后返回null及停止挖矿的问题

    查了好久在go ethereum社区查到一个情况相同的提问 why does miner start return null does not start in private testchain 提问者也是在miner start 后进入
  • 1、asyncio aiohttp aiofile 异步爬取图片

    1 asyncio aiohttp aiofile 异步爬取图片 前后折腾了好多天 不废话 先直接上代码 再分析 1 import aiohttp 2 import asyncio 3 import aiofiles 4 5 header
  • Surround the Trees

    http acm zju edu cn onlinejudge showProblem do problemId 453 There are a lot of trees in an area A peasant wants to buy
  • Linux下的grub2引导修复

    目录 引导故障分析处理 1 修复grub2引导故障 2 修复grub2 误删掉 boot grub2 3 修复grub2 引导破坏故障 4 修复 boot 下所有文件被删除故障 引导故障分析处理 1 修复grub2引导故障 故障原因 gru
  • 第五章-数字水印-2-原理及实现

    数字水印原理 根据之前图像获取位平面的操作可知 最低位位平面对整体图像的影响最小 因此数字水印的原理为在图像的最低有效位上嵌入隐藏信息 即在图像的最低位替换为数字水印位平面 完成数字的嵌入操作 对已嵌入数字水印的图片提取最低位位平面 即可得
  • 计算机数值分析课学后感,计算方法课程总结 心得体会

    计算方法课程总结 心得体会 一 课程简介 本课程是信息与计算科学 数学与应用数学本科专业必修的一门专业基础课 我们需在掌握数学分析 高等代数和常微分方程的基础知识之上 学习本课程 在实际中 数学与科学技术一向有着密切关系并相互影响 科学技术
  • 白手起家学习数据科学 ——梯度下降法之“优化步长和随机梯度下降篇”(六)

    选择正确的步长 Choosing the Right Step Size 虽然针对梯度移动的基本原理是清楚的 但是移动多少是不清楚的 的确 选择一个合适的步长是一门艺术 流行的选择包括 使用固定的步长 随时间逐步缩小步长 在每次迭代 选择最
  • ajp8009端口分析

    1 AJP是什么 最近有一个ajp的文件包含漏洞CVE 2020 1938很火 因此就研究了一下tomcat的ajp服务 复现了该漏洞 首先我们来看一下ajp是什么 ajp是tomcat的一个转发协议 通过这个协议 我们可以在自己的客户端上
  • linux入门系列9--用户管理及文件权限控制

    前面文章分享了Linux下常用命令以及Shell编程相关知识 本节继续学习Linux用户管理及文件权限控制 Linux是多用户多任务操作系统 具有很好的稳定性和安全性 既然是多用户 那就意味着多个用户可以同时使用同一个Linux操作系统 因