Linux基础(十七)——Linux 帐号管理与 ACL 权限设置
Linux 帐号管理与 ACL 权限设置
- 1.UID与GID
- 2.`/etc/passwd`
- 3.`/etc/shadow`
- 4.`/etc/group`
- 5.`/etc/gshadow`
- 6.有效群组和初始群组
- 7.账号管理
- 7.1 增加、修改、删除账户
- 7.2 增加、修改、删除群组
- 7.3 实例
- 8.ACL使用
- 8.1 ACL定义
- 8.2 查询与设置ACL
- 9.用户切换
- 9.1 su
- 9.2 .sudo
- 10. 使用者的特殊 shell 与 PAM 模块
- 10.1 特殊 shell——`sbin/nologin`
- 10.2 PAM 模块
- 11. Linux 主机上的使用者讯息传递
- 11.1 查询系统在线的使用者——`w、who、last、lastlog`
- 11.2 使用者对谈——` write、mesg、wall`
1.UID与GID
UID(User Identifier) 是用户的唯一标识符,用于识别系统中的每个用户。在用户管理文件(如 /etc/passwd)中,每个用户都有一个 UID。系统使用 UID 而非用户名来管理文件权限和其他安全属性。
GID(Group Identifier)是用户组的唯一标识符,用于标识用户所属的组。在用户组管理文件(如 /etc/group)中,每个用户组都有一个唯一的 GID。GID 与用户组相关联,帮助系统管理用户组权限和文件访问控制。
与UID、GID相关的文件有/etc/passwd、/etc/shadow、 /etc/group、/etc/gshadow。
2./etc/passwd
[root@CentOS7 ~]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
passwd文件有七个字段:
①帐号名称
就是帐号啦! 用来提供给对数字不太敏感的人类使用来登陆系统的! 需要用来对应 UID 喔。 例如 root 的 UID 对应就是 0 ( 第三字段) 。
②密码
早期 Unix 系统的密码就是放在这字段上! 但是因为这个文件的特性是所有的程序都能够读取, 这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。 所以这里你会看到一个“ x ”, 呵呵!
③UID

④GID
这个与 /etc/group 有关! 其实 /etc/group 的观念与 /etc/passwd 差不多, 只是他是用来规范群组名称与 GID 的对应而已
⑤使用者信息说明栏
这个字段基本上并没有什么重要用途, 只是用来解释这个帐号的意义而已! 不过, 如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息呢! 本章后面的 chfn 指令会来解释这里的说明。
⑥主文件夹
这是使用者的主文件夹, 以上面为例, root 的主文件夹在 /root , 所以当root 登陆之后, 就会立刻跑到 /root 目录里头啦
⑦Shell
当使用者登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行使用者的操作任务。 那为何默认 shell 会使用 bash 呢? 就是在这个字段指定的啰.
3./etc/shadow
很多程序的运行都与权限有关, 而权限与 UID/GID 有关! 因此各程序当然需要读取/etc/passwd 来了解不同帐号的权限。 因此 /etc/passwd 的权限需设置为 -rw-r–r–(others可读) 这样的情况, 虽然早期的密码也有加密过, 但却放置到 /etc/passwd 的第二个字段上! 这样一来很容易被有心人士所窃取。所以后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头呢。
[root@CentOS7 ~]# head -n 4 /etc/shadow
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
shadow文件有九个字段:
①帐号名称
与 /etc/passwd对应
②密码
这个字段内的数据才是真正的密码, 而且是经过编码的密码 ( 加密)
③最近更动密码的日期
这个字段记录了“更动密码那一天”的日期, 不过, 很奇怪呀! 在我的例子中怎么会是 18353 呢? 呵呵, 这个是因为计算 Linux 日期的时间是以 1970 年 1月 1 日作为 1 而累加的日期, 1971 年 1 月 1 日则为 366 啦! 得注意一下这个数据呦!上述的 18353 指的就是 2015-05-04 那一天啦(18353/366=50.1448年,1970+50=2020)
④密码不可被更动的天数
如果是 0 的话, 表示密码随时可以更动的意思。 这的限制是为了怕密码被某些人一改再改而设计的! 如果设置为 20 天的话, 那么当你设置了密码之后, 20 天之内都无法改变这个密码呦
⑤密码需要重新变更的天数
99999 ( 计算为 273 年)
⑥密码需要变更期限前的警告天数
如上面的例子, 则是密码到期之前的 7 天之内, 系统会警告该用户
⑦密码过期后的帐号宽限时间
⑧帐号失效日期
⑨保留
看以后有没有新功能加入
对于密码忘记了:
①一般用户的密码忘记了: 这个最容易解决, 请系统管理员帮忙, 他会重新设置好你的密码而不需要知道你的旧密码! 利用 root 的身份使用 passwd 指令来处理即可。
②root 密码忘记了: 这就麻烦了! 因为你无法使用 root 的身份登陆了嘛! 但我们知道 root的密码在 /etc/shadow 当中, 因此你可以使用各种可行的方法开机进入 Linux 再去修改。例如重新开机进入单人维护模式后, 系统会主动的给予 root 权限的 bash接口, 此时再以 passwd 修改密码即可
4./etc/group
这个文件就是在记录 GID 与群组名称的对应了.
[root@CentOS7 ~]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
①群组名称
需要与第三字段的 GID 对应
②群组密码
通常不需要设置, 这个设置通常是给“群组管理员”使用的, 目前很少有这个机会设置群组管理员啦。同样的, 密码已经移动到 /etc/gshadow 去, 因此这个字段只会存在一个“x”而已;
③GID
④此群组支持的帐号名称
我们知道一个帐号可以加入多个群组, 那某个帐号想要加入此群组时, 将该帐号填入这个字段即可。 举例来说, 如果我想要让 dmtsai 与 alex 也加入root 这个群组, 那么在第一行的最后面加上“dmtsai,alex”, 注意不要有空格, 使成为“root❌0:dmtsai,alex ”就可以啰。新版的 Linux 中, 初始群组的用户群已经不会加入在第四个字段。
5./etc/gshadow
[root@CentOS7 ~]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
这个文件几乎与/etc/group一样。以系统管理员的角度来说, 这个 gshadow 最大的功能就是创建群组管理员啦! 那么什么是群组管理员呢? 由于系统上面的帐号可能会很多, 但是我们 root 可能平时太忙碌, 所以当有使用者想要加入某些群组时, root 或许会没有空管理。 此时如果能够创建群组管理员的话, 那么该群组管理员就能够将那个帐号加入自己管理的群组中! 可以免去 root 的忙碌啦! 不过,由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了。
6.有效群组和初始群组
在 Linux 中,每个用户都有一个初始群组(Primary Group)和一个或多个有效群组(Secondary Groups),用于决定用户的权限和文件访问控制。
①初始群组
是指用户的默认组,通常在用户创建文件或目录时,这些文件或目录默认属于初始群组。每个用户都只能有一个初始群组,该群组在 /etc/passwd 文件中定义,也就是 /etc/passwd中记录的GID。
②有效群组(也称附属群组或辅助群组)
是用户所属的其他群组,可以赋予用户更多权限。一个用户可以属于多个有效群组,允许用户访问这些组所拥有的文件和资源。有效群组信息存储在 /etc/group 文件中。
查询一个用户的初始群组和有效群组:
[root@CentOS7 ~]# groups
root
[root@CentOS7 ~]# su fle
[fle@CentOS7 root]$ groups
fle wheel
[fle@CentOS7 root]$
可以使用groups命令来查看一个用户的群组信息,第一个出现的就是其初始群组。
可以使用newgrp来切换有效群组:
[fle@CentOS7 ~]$ touch /tmp/file
[fle@CentOS7 ~]$ ll /tmp/file
-rw-rw-r-- 1 fle fle 0 11月 15 14:32 /tmp/file
[fle@CentOS7 ~]$ newgrp wheel
[fle@CentOS7 ~]$ touch /tmp/file2
[fle@CentOS7 ~]$ ll /tmp/file2
-rw-r--r-- 1 fle wheel 0 11月 15 14:33 /tmp/file2
[fle@CentOS7 ~]$ ll /tmp/file
-rw-rw-r-- 1 fle fle 0 11月 15 14:32 /tmp/file
[fle@CentOS7 ~]$ newgrp root
密码:
newgrp: failed to crypt password with previous salt: 无效的参数
从上面可以看到,切换fle用户的有效群组后,其创建的文件的group变为了wheel。但要注意的是,切换的群组必须为原本已有的群组,比如fle只有fle和wheel两个群组,就不能切换为root群组。
Tips:newgrp切换成功后,是会变换到一个新的shell环境的

7.账号管理
7.1 增加、修改、删除账户
对应的命令分别是useradd、usermod、userdel,此外,一般增加账户输入密码时使用passwd.




下面使用root身份在CentOS7上新建一个Flx用户:
[root@CentOS7 ~]# grep 'flx' /etc/passwd
[root@CentOS7 ~]# grep 'fle' /etc/passwd
fle:x:1000:1000:fle:/home/fle:/bin/bash
[root@CentOS7 ~]# useradd flx
[root@CentOS7 ~]# grep 'flx' /etc/passwd
flx:x:1005:1005::/home/flx:/bin/bash
[root@CentOS7 ~]# grep 'flx' /etc/shadow
flx:!!:20042:0:99999:7:::
[root@CentOS7 ~]# grep 'flx' /etc/group
flx:x:1005:
上面创建了一个用户,可以看到useradd是有固定的初始设置的,具体如下:
[root@CentOS7 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
除了以root身份进行账户信息的修改,也可以用usermod命令进行修改:
[root@CentOS7 ~]# usermod -l flz flx
[root@CentOS7 ~]# grep 'flx' /etc/passwd
flz:x:1005:1005::/home/flx:/bin/bash
[root@CentOS7 ~]# su - flz
[flz@CentOS7 ~]$ usermod -l flx flz
usermod: user flz is currently used by process 22520
[flz@CentOS7 ~]$ su - fle
密码:
上一次登录:五 11月 15 14:30:18 CST 2024pts/0 上
[fle@CentOS7 ~]$ usermod -l flx flz
usermod: Permission denied.
usermod:无法锁定 /etc/passwd,请稍后再试。
接下来删除创建的用户:
[fle@CentOS7 ~]$ grep 'flz' /etc/passwd
flz:x:1005:1005::/home/flx:/bin/bash
[fle@CentOS7 ~]$ su -
密码:
上一次登录:五 11月 15 20:54:53 CST 2024pts/0 上
[root@CentOS7 ~]# userdel -rf flz
[root@CentOS7 ~]# grep 'flz' /etc/passwd
Tips:id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息.
[root@CentOS7 ~]# id fle
uid=1000(fle) gid=1000(fle) 组=1000(fle),10(wheel)
7.2 增加、修改、删除群组



[root@CentOS7 ~]# grep 'Openwifi_Group' /etc/group
[root@CentOS7 ~]# groupadd Openwifi_Group
[root@CentOS7 ~]# grep 'Openwifi_Group' /etc/group
Openwifi_Group:x:1006:
[root@CentOS7 ~]# groupmod -n OpenLora_Group Openwifi_Group
[root@CentOS7 ~]# grep 'OpenLora_Group' /etc/group
OpenLora_Group:x:1006:
[root@CentOS7 ~]# groupdel -f OpenLora_Group
[root@CentOS7 ~]# grep 'OpenLora_Group' /etc/group
[root@CentOS7 ~]#
7.3 实例
①

[root@CentOS7 ~]# groupadd mygroup1
[root@CentOS7 ~]# useradd -c "1st user" -G mygroup1 myuser1
[root@CentOS7 ~]# useradd -c "2nd user" -G mygroup1 myuser2
[root@CentOS7 ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser1
更改用户 myuser1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser2
更改用户 myuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser3
更改用户 myuser3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# grep myuser* /etc/passwd /etc/group
/etc/passwd:myuser1:x:1006:1006:1st user:/home/myuser1:/bin/bash
/etc/passwd:myuser2:x:1007:1009:2nd user:/home/myuser2:/bin/bash
/etc/passwd:myuser3:x:1008:1010:3rd user:/home/myuser3:/sbin/nologin
/etc/group:mygroup1:x:1008:myuser1,myuser2
/etc/group:myuser1:x:1006:
/etc/group:myuser2:x:1009:
/etc/group:myuser3:x:1010:
myuser1 与 myuser2 都有支持次要群组, 但该群组不见得会存在, 因此需要先手动创建他! 然后 myuser3 是“不可登陆系统”的帐号, 因此需要使用 /sbin/nologin这个 shell 来给予, 这样该帐号就无法登陆啰.
②
我的使用者 pro1, pro2, pro3 是同一个专案计划的开发人员, 我想要让这三个用户在同一个目录下面工作, 但这三个用户还是拥有自己的主文件夹与基本的私有群组。 假设我要让这个专案计划在 /srv/projecta 目录下开发。
[root@CentOS7 ~]# userdel pro1
[root@CentOS7 ~]# userdel pro2
[root@CentOS7 ~]# userdel pro3
[root@CentOS7 ~]# groupdel projecta
[root@CentOS7 ~]# groupadd projecta
[root@CentOS7 ~]# mkdir /srv/projecta && chgrp projecta /srv/projecta
[root@CentOS7 ~]# chmod 2770 /srv/projecta
[root@CentOS7 ~]# useradd -G projecta pro1
[root@CentOS7 ~]# useradd -G projecta pro2
[root@CentOS7 ~]# useradd -G projecta pro3
[root@CentOS7 ~]# passwd pro1
更改用户 pro1 的密码 。
新的 密码:pro1
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro1
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# passwd pro2
更改用户 pro2 的密码 。
新的 密码:pro2
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro2
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# passwd pro3
更改用户 pro3 的密码 。
新的 密码:pro3
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro3
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# su - pro1
最后一次失败的登录:六 11月 16 14:41:25 CST 2024pts/0 上
最有一次成功登录后有 1 次失败的登录尝试。
[pro1@CentOS7 ~]$ pwd
/home/pro1
[pro1@CentOS7 ~]$ touch /srv/projecta/afile_pro1 ~/pfile_pro1
[pro1@CentOS7 ~]$ echo "This is a file created by pro1 in ~/" >> ~/pfile_pro1
[pro1@CentOS7 ~]$ echo "This is a file created by pro1 in /srv/projecta/" >> /srv/projecta/afile_pro1
[pro1@CentOS7 ~]$ su - pro2
密码:pro2
最后一次失败的登录:六 11月 16 15:20:50 CST 2024pts/0 上
最有一次成功登录后有 3 次失败的登录尝试。
[pro2@CentOS7 ~]$ head -n 1 /home/pro1/pfile_pro1
head: 无法打开"/home/pro1/pfile_pro1" 读取数据: 权限不够
[pro2@CentOS7 ~]$ head -n 1 /srv/projecta/afile_pro1
This is a file created by pro1 in /srv/projecta/
[pro2@CentOS7 ~]$
chmod 2770 /srv/projecta就表示为/srv/projecta目录设置SGID功能。设置SGID功能意味着:使用者在此目录下的有效群组将会变成该目录的群组。而前面已经设置了该目录的群组为projecta,所以projecta群组下的pro1、pro2、pro3就拥有7的权限了,即可以rwx目录/srv/projecta下的任何文件(包括子目录)。
但接下来有个困扰的问题发生了! 假如实例一的 myuser1 是 projecta 这个专案的助理, 他需要这个专案的内容, 但是他“不可以修改”专案目录内的任何数据! 那该如何是好? 你或许可以这样做:
①将 myuser1 加入 projecta 这个群组的支持, 但是这样会让 myuser1 具有完整的/srv/projecta 的使用权限, myuser1 是可以删除该目录下的任何数据的! 这样是有问题的;
②将 /srv/projecta 的权限改为 2775 , 让 myuser1 可以进入查阅数据。 但此时会发生所有其他人均可进入该目录查阅的困扰! 这也不是我们要的环境。
传统的权限仅有三种身份 ( owner, group, others) 搭配三种权限 ( r,w,x) 而已, 并没有办法单纯的针对某一个使用者或某一个群组来设置特定的权限需求。这就需要用到ACL权限了。
8.ACL使用
8.1 ACL定义
ACL 是 Access Control List 的缩写, 主要的目的是在提供传统的 owner,group,others 的read,write,execute 权限之外的细部权限设置。 ACL 可以针对单一使用者, 单一文件或目录来进行 r,w,x 的权限规范。
处理对象:

8.2 查询与设置ACL

利用“ u:使用者:权限 ”的方式来设置的啦! 设置前请加上 -m这个选项。 如果一个文件设置了 ACL 参数后, 他的权限部分就会多出一个 + 号了! 但是此时你看到的权限与实际权限可能就会有点误差! 那要如何观察呢? 就通过 getfacl 吧。

①user的ACL设置
使Fle可以访问7.3小节中实例2的/srv/projecta,但是不能修改该目录下的文件:
[fle@CentOS7 ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: 权限不够
[fle@CentOS7 ~]$ su -
密码:
上一次登录:六 11月 16 18:44:20 CST 2024pts/0 上
[root@CentOS7 ~]# setfacl -m u:fle:rx /srv/projecta
[root@CentOS7 ~]# getfacl /srv/projecta
getfacl: Removing leading '/' from absolute path names
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s-
user::rwx
user:fle:r-x
group::rwx
mask::rwx
other::---[root@CentOS7 ~]# su - fle
上一次登录:六 11月 16 19:28:18 CST 2024pts/0 上
[fle@CentOS7 ~]$ cd /srv/projecta
[fle@CentOS7 projecta]$
②group的ACL设置
设置projecta群组对fle的设置的/tmp/fle_dir目录有rwx权限
[fle@CentOS7 ~]$ mkdir /tmp/fle_dir && chmod 770 /tmp/fle_dir
[fle@CentOS7 ~]$ ll -d /tmp/fle_dir
drwxrwx--- 2 fle fle 6 11月 16 19:45 /tmp/fle_dir
[fle@CentOS7 ~]$ su - pro1
密码:
上一次登录:六 11月 16 19:43:55 CST 2024pts/0 上
[pro1@CentOS7 ~]$ cd /tmp/fle_dir
-bash: cd: /tmp/fle_dir: 权限不够
[pro1@CentOS7 ~]$ su -
密码:
上一次登录:六 11月 16 19:40:50 CST 2024pts/0 上
[root@CentOS7 ~]# setfacl -m g:projecta:rwx /tmp/fle_dir
[root@CentOS7 ~]# su - pro1
上一次登录:六 11月 16 19:46:22 CST 2024pts/0 上
[pro1@CentOS7 ~]$ getfacl /tmp/fle_dir
getfacl: Removing leading '/' from absolute path names
# file: tmp/fle_dir
# owner: fle
# group: fle
user::rwx
group::rwx
group:projecta:rwx
mask::rwx
other::---[pro1@CentOS7 ~]$ cd /tmp/fle_dir
[pro1@CentOS7 fle_dir]$ su - pro2
密码:
上一次登录:六 11月 16 15:23:53 CST 2024pts/0 上
[pro2@CentOS7 ~]$ cd /tmp/fle_dir
[pro2@CentOS7 fle_dir]$
9.用户切换
9.1 su

①su
su命令并不会改变PATH等变量:
[fle@CentOS7 ~]$ su
密码:
[root@CentOS7 fle]# id
uid=0(root) gid=0(root) 组=0(root)
[root@CentOS7 fle]# env | grep 'fle'
USER=fle
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/fle/.local/bin:/home/fle/bin
MAIL=/var/spool/mail/fle
PWD=/home/fle
LOGNAME=fle
XDG_DATA_DIRS=/home/fle/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
从上面可以看到,USER、PWD、MAIL等仍然是fle,并没有切换为root,因为su命令是以non-login shell方法来读取变量的。
②su -
[fle@CentOS7 ~]$ su -
密码:
上一次登录:六 11月 16 19:54:41 CST 2024pts/0 上
[root@CentOS7 ~]# id
uid=0(root) gid=0(root) 组=0(root)
[root@CentOS7 ~]# env | grep 'fle'
[root@CentOS7 ~]# env | grep 'root'
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
③su - -c "命令"
加上-c选项,可以使得非root用户用root身份执行命令
[fle@CentOS7 ~]$ head -n 2 /etc/shadow
head: 无法打开"/etc/shadow" 读取数据: 权限不够
[fle@CentOS7 ~]$ su - -c "head -n 2 /etc/shadow"
密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
bin:*:18353:0:99999:7:::
④su -l
使用-l选项可以从一个普通用户切换到另一个普通用户
[fle@CentOS7 ~]$ su -l pro1
密码:
上一次登录:六 11月 16 19:47:00 CST 2024pts/0 上
[pro1@CentOS7 ~]$ id
uid=1006(pro1) gid=1006(pro1) 组=1006(pro1),1008(projecta)
[pro1@CentOS7 ~]$ echo ${PWD}
/home/pro1
9.2 .sudo

相对于 su 需要了解新切换的使用者密码 ( 常常是需要 root 的密码) , sudo 的执行则仅需要自己的密码即可!由于 sudo 可以让你以其他用户的身份执行指令 ( 通常是使用 root 的身份来执行指令) , 因此并非所有人都能够执行sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令。
在安装 CentOS 7 的第三章时, 在设置一般帐号的项目中, 有个“让这位使用者成为管理员”的选项吧? 如果你有勾选该选项的话, 那除了 root 之外, 该一般用户确实是可以使用 sudo 的喔:
[root@CentOS7 ~]# grep 'fle' /etc/sudoers
[root@CentOS7 ~]# su -l fle
上一次登录:六 11月 16 20:29:20 CST 2024pts/0 上
[fle@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] fle 的密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
但是 sudo 默认仅有 root 能使用啊! 为什么呢? 因为 sudo 的执行是这样的流程:
1.当使用者执行 sudo 时, 系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;
2.若使用者具有可执行 sudo 的权限后, 便让使用者“输入使用者自己的密码”来确认;
3.若密码输入成功, 便开始进行 sudo 后续接的指令( 但 root 执行 sudo 时, 不需要输入密码) ;
4.若欲切换的身份与执行者身份相同, 那也不需要输入密码。
[fle@CentOS7 ~]$ sudo cd /tmp
[fle@CentOS7 ~]$ cd /tmp
[fle@CentOS7 tmp]$
从上面可以看到,fle用户使用sudo是无效的。所以要使普通用户可以使用sudo,就需要在/etc/sudoers中添加。除了 root 之外的其他帐号, 若想要使用 sudo 执行属于 root 的权限指令, 则 root 需要先使用 visudo 去修改 /etc/sudoers , 让该帐号能够使用全部或部分的root 指令功能。
[pro1@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] pro1 的密码:
pro1 不在 sudoers 文件中。此事将被报告。
[pro1@CentOS7 ~]$ su -
密码:
上一次登录:六 11月 16 20:27:58 CST 2024pts/0 上
[root@CentOS7 ~]# visudo
[root@CentOS7 ~]# su - pro1
上一次登录:六 11月 16 20:30:51 CST 2024pts/0 上
[pro1@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] pro1 的密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
[root@CentOS7 ~]# visudo执行后编写如下:

10. 使用者的特殊 shell 与 PAM 模块
10.1 特殊 shell——sbin/nologin
系统帐号(System Account)是指在 Linux 或类 Unix 系统中,用于执行系统服务、管理任务或运行特定服务(如数据库、Web服务器等)的特殊用户帐号。这些帐号通常不是为普通用户登录系统而设计的,而是为系统或服务的内部使用提供功能支持。系统帐号(System Account)是指在 Linux 或类 Unix 系统中,用于执行系统服务、管理任务或运行特定服务(如数据库、Web服务器等)的特殊用户帐号。这些帐号通常不是为普通用户登录系统而设计的,而是为系统或服务的内部使用提供功能支持。
系统帐号这玩意儿的 shell 就是使用 /sbin/nologin , 重点在于系统帐号是不需要登陆的! 所以我们就给他这个无法登陆的合法 shell。 使用了这个 shell 的用户即使有了密码, 你想要登陆时他也无法登陆, 因为会出现如下的讯息喔:
This account is currently not available.
换个角度来想, 如果我的 Linux 主机提供的是邮件服务, 所以说, 在这部 Linux 主机上面的帐号, 其实大部分都是用来收受主机的信件而已, 并不需要登陆主机的呢! 这个时候, 我们就可以考虑让单纯使用 mail 的帐号以 /sbin/nologin 做为他们的 shell , 这样, 最起码当我的主机被尝试想要登陆系统以取得 shell 环境时, 可以拒绝该帐号呢。
10.2 PAM 模块
在过去, 我们想要对一个使用者进行认证 ( authentication) , 得要要求使用者输入帐号密码, 然后通过自行撰写的程序来判断该帐号密码是否正确。 也因为如此, 我们常常得使用不同的机制来判断帐号密码, 所以搞的一部主机上面拥有多个各别的认证系统, 也造成帐号密码可能不同步的验证问题! 为了解决这个问题因此有了 PAM ( Pluggable Authentication
Modules, 嵌入式模块) 的机制。
PAM 可以说是一套应用程序接口 ( Application Programming Interface, API) , 他提供了一连串的验证机制, 只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 ( 成功或失败) 。 由于 PAM 仅是一套验证的机制, 又可以提供给其他程序所调用引用, 因此不论你使用什么程序, 都可以使用 PAM 来进行验证。这也就是说, 你可以在写程序的时候将 PAM 模块的功能加入, 就能够利用 PAM 的验证功能啰。


11. Linux 主机上的使用者讯息传递
11.1 查询系统在线的使用者——w、who、last、lastlog
[root@CentOS7 ~]# w21:05:58 up 5:56, 2 users, load average: 0.05, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
fle :0 :0 15:10 ?xdm? 9:17 0.17s /usr/libexec/gn
fle pts/0 :0 15:10 6.00s 1.40s 32.66s /usr/libexec/gn
[root@CentOS7 ~]# who
fle :0 2024-11-16 15:10 (:0)
fle pts/0 2024-11-16 15:10 (:0)
last 可以列出从系统创建之后到目前为止的所有登陆者信息;如果您想要知道每个帐号的最近登陆的时间, 则可以使用 lastlog 这个指令喔。
11.2 使用者对谈—— write、mesg、wall

相关文章:
Linux基础(十七)——Linux 帐号管理与 ACL 权限设置
Linux 帐号管理与 ACL 权限设置 1.UID与GID2./etc/passwd3./etc/shadow4./etc/group5./etc/gshadow6.有效群组和初始群组7.账号管理7.1 增加、修改、删除账户7.2 增加、修改、删除群组7.3 实例 8.ACL使用8.1 ACL定义8.2 查询与设置ACL 9.用户切换9.1 su9.2 .sudo 10. 使用者的特…...
【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
11.16 Vue element
Ajax 概念:Asynchronous JavaScript Anderson XML,异步的JavaScript和XML。 作用: 数据交换:通过Ajax 可以给服务器发送请求,并收取服务器相应的数据。异步交互:可以在不重新加载整个页面的情况下&#…...
Gin 框架中的路由
1、路由概述 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。 RESTful API 是目前比较成熟的一套互联网应用程序的 API 设计理论,所以我们设计我们的路 由的时候建议参考 …...
在MATLAB中实现自适应滤波算法
自适应滤波算法是一种根据信号特性自动调整滤波参数的数字信号处理方法,其可以有效处理噪声干扰和信号畸变问题。在许多实时数据处理系统中,自适应滤波算法得到了广泛应用。在MATLAB中,可以使用多种方法实现自适应滤波算法。本文将介绍自适应…...
linux文件与重定向
目录 一、共识原理 二、回顾C语言文件函数 1.fopen 2.fwrite 3.fclose 三、文件系统调用 1.open 2.write 3.访问文件的本质 4.stdin&&stdout&&stderror 5.文件的引用计数 四、重定向 1.文件描述符的分配规则 2. 输出重定向 3.重定向系统调用 4.…...
基于Python的仓库管理系统设计与实现
背景: 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发,利用Django框架和MySQL数据库,实现了高效、便捷的仓库管理功能。 用户管理: 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…...
【Pikachu】URL重定向实战
人生在世只有一次,不必勉强选择自己不喜欢的路,随性而生或随性而死都没关系,不过无论选择哪条路,都不要忘记自己的初心。 1.不安全的url跳转实战 首先点击页面上的链接,观察url 直接修改url为https://www.baidu.com进…...
C语言实现3D动态爱心图形的绘制与动画效果
**标题:C语言实现3D动态爱心图形的绘制与动画效果** --- ### 一、引言 在计算机图形学中,三维图形的绘制和动画处理是一个重要且有趣的研究方向。通过数学公式描述的几何体可以在计算机屏幕上展示出丰富多彩的动态效果,其中“爱心”图形作…...
深入理解Nginx:从基础配置到高级优化
什么是Nginx? Nginx(发音为“Engine-X”)是一个高性能的HTTP和反向代理服务器,同时也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。Nginx以其高并发处理能力、稳定性和灵活的配置闻名,是现代Web开发和部署的核心…...
ONLYOFFICE8.2版本测评,团队协作的办公软件
文章目录 引言ONLYOFFICE产品简介功能与特点1. 实时协作2. 兼容性3. 模板库4. 评论和修订5. 安全性 体验与测评功能测试 邀请用户使用项目介绍结尾了解更多 引言 在数字化办公的浪潮中,效率和协作成为了工作的核心。ONLYOFFICE作为一个强大的办公套件,正…...
spring 和 grpc 的整合
spring 和 grpc 的整合 首先我们要知道 grpc 中我们在使用的时候用到了 grpc 的那些东西 dil 的编写serverimplserverbuilder addService 客户端的 stub 编写 这里面我们看一下我们那些地方可能需要 spring 帮我们管理,那些地方我们需要自己来管理呢?…...
企业项目级IDEA设置类注释、方法注释模板(仅增加@author和@date)
文章目录 前言一 设置类注释1.1 添加模板1.2 复制配置 二 设置方法注释2.1 添加模版2.2 设置模版2.3 设置参数变量2.4 配置对应快捷键2.5 配置对应作用域2.6 使用方式 说明 前言 公司代码规范中,需要在标准JavaDoc注释的基础上加上作者和日期。网上虽然有很多现成的…...
1 设计模式原则之开闭原则
一、开闭原则 1.定义 开闭原则:对扩展开放,对修改关闭。 2.具体用法 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这…...
前端大环境
需求增长: 数字化转型推动:企业和组织的数字化转型进程不断加快,对前端开发的需求持续增加。无论是企业官网、电子商务平台、在线办公系统还是各种移动端应用,都需要专业的前端开发来打造良好的用户界面和交互体验。新兴技术和平台…...
Electron: 主进程和渲染进程之间通信
// 渲染进程 向 主进程 异步通信// preload.js 预加载 const {ipcRenderer} require(electron) ipcRenderer.send(on-send-event, 这里是需要传递的参数) // 第一步ipcRenderer.on(on-resend-event, (e, data) > {console.log(data) // 打印的是ipcMain.on传递过来的参数&a…...
社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展
摘要:本文深入分析了社交电商相较于传统电商的优势,包括门槛低、易操作、更生活化和可团队化运作等特点。同时,探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用,以及它们与社交电商融合所带来的新机遇和发展前景…...
蓝桥杯c++算法学习【4】之简单数论(阶乘约数、求值、循环小数、等差数列、最大比例:::非常典型的必刷例题!!!)
别忘了请点个赞收藏关注支持一下博主喵!!!! 关注博主,更多蓝桥杯nice题目静待更新:) 简单数论 一、阶乘约数 【问题描述】 定义阶乘n!123...n。 请问100! (100 的阶乘)有多少个正约数。 【答案提交】 这…...
重构代码之删除对参数的赋值
删除对参数的赋值 是一种重构技术,旨在消除对方法参数的重新赋值。这种实践可以增强代码的可读性和维护性,避免潜在的副作用。以下是详细讲解: 一、动机 保护参数的意图:方法参数通常表示传入数据或状态。如果重新赋值ÿ…...
Docker的基本概念、安装步骤以及一些简单的用法
Docker 是一种开源的容器化平台,允许开发者打包应用及其依赖项到一个可移植的容器中。容器可以在任何支持Docker的环境中运行,这使得应用的部署和管理变得更加简单和高效。 1. Docker的基本概念 在深入学习Docker之前,了解一些基本概念是很…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
ABB馈线保护 REJ601 BD446NN1XG
配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器,用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合,具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器…...
