1、安装VMware软件
以管理员身份运行VMware17.6.exe

点击下一步

勾选“我接受许可协议中的条款”

这里可以更改软件的安装位置,然后点击下一步

将“启动时检查产品更新”和“加入VMware客户体验提升计划”前面的勾去掉

点击下一步

点击安装

正在安装中

点击许可证

输入产品密钥,点击输入

安装完成


2、安装rocky
点击创建新的虚拟机

点击下一步

点击下一步

点击稍后安装操作系统,点击下一步

点击Linux,选择centos8 64位,点击下一步

输入虚拟机的名称并选择虚拟机安装的位置,点击下一步

配置处理器,并点击下一步

选择虚拟机的内存大小,并点击下一步

默认使用网络地址转换,点击下一步

保持默认,并点击下一步

保持默认,并点击下一步

选择创建新虚拟磁盘,点击下一步

选择磁盘大小,点击下一步

点击下一步

点击自定义硬件

点击新CD/DVD,选择镜像,点击关闭

点击完成

点击开启此虚拟机,开始安装rocky8.10操作系统

这里我们默认选择英语,点击Continul

点击installation destination

选择automatic,点击done

点击time&date,设置时间时区


点击network&host name,设置网络


设置root密码


点击begin installation

开始安装

点击reboot system重启

勾选产品许可


点击finish configijration

进入操作系统






到这里Rocky8.10就按照完成啦
3、远程工具连接Rocky8.10
以管理员身份登录系统,打开终端,修改配置文件
[root@10 ~]# vim /etc/ssh/sshd_config
PermitRootLogin yes #将PermitRootLogin改成yes
查看系统IP地址
[root@10 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:57:7e:54 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 10.0.0.155/24 brd 10.0.0.255 scope global dynamic noprefixroute ens160
valid_lft 963sec preferred_lft 963sec
inet6 fe80::20c:29ff:fe57:7e54/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:94:56:4d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever



远程工具连接Rocky8.10成功
4、shell介绍
Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行 。
shell也被称为LINUX的命令解释器(command interpreter),Shell 本身是一个程序。将用户输入的命令行拆解为”命令名“与”参数“。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传给该程序并执行。
shell是一种高级程序设计语言,提供了变量,函数,条件判断,循环等开发语言的功能。由于Shell本身是个程序,所以它可以被任何用户自己开发的各种Shell所代替。
常见的shell
sh:steve bourne
bash:Bourne-Again Shell,GPL,CentOS和Ubuntu默认使用
csh:c shell,C语言风格
tcsh:
ksh:Korn Shell,AIX默认shell
zsh:MacOS默认shell
5、获取帮助
当碰到不熟悉的命令时,我们可以用man命令来查看命令手册
man页面分组
不同类型的帮助称为不同的“章节”,统称为Linux手册,man 1 man
[root@ubuntu2204 ~]# man man
标准man手册一般有以下几个章节:
- 可执行程序或 shell 命令
- 系统调用
- 库调用
- 特殊文件
- 文件格式和规范,
- 游戏
- 杂项
- 系统管理命令(通常只针对 root 用户)
- 内核API
man passwd #默认打开第一章帮助
man 5 passwd #指定第五章帮助
man 9 passwd #总共9个章节,中间的数字不能超过9,如果要找的章节里面没有对应的内容,则会提示没有
man 10 passwd #总共9个章节,中间的数字不能超过9,如果是数字大于9,则直接定位到最小的章
man -a passwd #打开所有帮助
man -f passwd #显示passwd 相关的章节,相当于 whatis passwd
man -k passwd #在man 手册中搜索所有与passwd 相关的内容,使用whatis 数据库
man -w ls #显示ls的man 文件路径
man -aw passwd #显示所有跟passwd有关的man文件路径
man -w 5 passwd #显示第5章的passwd的man文件路径
man -M /usr/local/share/man/zh_CN #显示中文man 的内容
[root@10 ~]# man passwd #默认打开第一章帮助

这里我们可以看到passwd命令的概要(SYNOPSIS)、描述(DESCRIPTION)、选项(OPTIONS)等等
[root@10 ~]# man 5 passwd #指定第五章帮助

6、Linux文件系统和目录功能

文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
除了斜杠和NUL所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
/boot #引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin #所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin #管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib #启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64 #专用于x86_64系统上的辅助共享库文件存放位置
/etc #配置文件目录
/home/USERNAME #普通用户家目录
/root #管理员的家目录
/media #便携式移动设备挂载点
/mnt #临时文件系统挂载点
/dev #设备文件及特殊文件存储位置, b:block device,随机访问,c:character device,线性访问
/opt #第三方应用程序的安装位置
/srv #系统上运行的服务用到的数据
/tmp #临时文件存储位置
/usr #universal shared, read-only data
/usr/bin #保证系统拥有完整功能而提供的应用程序
/usr/sbin #同上
/usr/lib #32位使用
/usr/lib64 #只存在64位系统
/usr/include #C程序的头文件(header files)
/usr/share #结构化独立的数据,例如doc, man等
/var #variable data files,可变数据目录
/var/cache #应用程序缓存数据目录
/var/lib #应用程序状态信息数据
/var/local #专用于为/usr/local下的应用程序存储可变数据
/var/lock #锁文件
/var/log #日志目录及文件
/var/opt #专用于为/opt下的应用程序存储可变数据
/var/run #运行中的进程相关数据,通常用于存储进程pid文件
/var/spool #应用程序数据池
/var/tmp #保存系统两次重启之间产生的临时数据
/proc #用于输出内核与进程信息相关的虚拟文件系统
/sys #用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux #security enhanced Linux,selinux相关的安全策略等信息的存储位置
文件类型
普通文件 -
目录文件 d directory
符号链接文件 l link
块设备文件 b block
字符设备文件 c character
管道文件 p pipe
套接字文件 s socket
7、文件操作常见的命令
7.1、显示当前工作目录-pwd
pwd命令
pwd -P #显示真实物理路径
pwd -L #显示链接路径(默认)
[root@Rocky lib]# pwd
/lib
[root@Rocky lib]# pwd -P
/usr/lib
[root@Rocky lib]# pwd -L
/lib
7.2、相对路径与绝对路径
相对路径:从当前目录出发(…/指当前目录 ./指上一级目录)
绝对路径:从根目录出发(/etc/ssh/sshd_config.d)
7.3、目录名与基名
基名:basename命令,只取文件名而不要路径
目录名:dirname命令,只取路径,不要文件名
[root@Rocky ssh]# dirname /etc/ssd/sshd_config.d
/etc/ssd
[root@Rocky ssh]# basename /etc/ssd/sshd_config.d
sshd_config.d
用法:
[root@Rocky ~]# url=http://nginx.org/download/nginx-1.18.0.tar.gz
[root@Rocky ~]# wget $url
[root@Rocky ~]# ls
a anaconda-ks.cfg nginx-1.18.0.tar.gz test.txt
[root@Rocky ~]# tar xf `basename $url`
[root@Rocky ~]# ls
a anaconda-ks.cfg nginx-1.18.0 nginx-1.18.0.tar.gz test.txt
7.4、更改目录-cd
cd命令
#常用选项
-L #切换至链接目录,默认选项
-P #切换至真实目录,而非链接目录
cd … #切换至父目录
cd - #切换到上一个目录
cd | cd ~ #切换至当前用户家目录
cd ~username #切换至指定用户家目录
[root@Rocky nginx-1.18.0]# cd ..
[root@Rocky ~]# cd -
/root/nginx-1.18.0
[root@Rocky nginx-1.18.0]#
[root@Rocky nginx-1.18.0]# cd ~allove
[root@Rocky allove]#
相关环境变量
$PWD #当前目录
$OLDPWD #上一次目录
[root@Rocky allove]# echo $PWD
/home/allove
[root@Rocky allove]# echo $OLDPWD
/root/nginx-1.18.0
7.5、列出当前目录-ls
ls命令
#常用选项
-a|–all #包含隐藏文件
-l #显示额外的信息
-R|–recursive #目录递归
-d|–directory #仅显示当前目录
-1 #数字1,文件分行显示
-S #按从大到小排序
-t #按mtime排序,时间新的靠前
-u #配合-t选项,显示并按atime从新到旧排序
-U #按目录存放顺序显示
-X #按文件后缀排序
-F|–classify #对不同类型文件显示时附加不同的符号:*/=>@|
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和$LS_COLORS变量定义
ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
ll 是 ls命令的一个别名,在centos 和 ubuntu 系统中,该别名的参数不一样
#ubuntu 中的颜色是在 dircolors 命令中定义的
root@Ubuntu2404:/etc# dircolors -p
#在ubuntu 中定义颜色,类似于别名定义,加在 .bashrc 中即可
7.6、查看文件状态-stat
stat命令
- 一个文件有两部份信息:元数据和具体内容
- 查看文件元数据stat
常用选项:
-t|–terse #使用简洁格式显示
-f|–file-system #显示相关的文件系统信息,所谓文件系统,对应的就是windows下面的硬盘分区
-c|–format #使用特定格式输出- 每个文件有三个时间戳属性:
atime (access time):访问时间,即读取文件内容时间,此字段值会延时更新,以降低IO负载
mtime (modify time):修改内容的时间
ctime (change time):元数据发生变化的时间
- atime更新策略:
1、当atime小于mtime或ctime会立即更新
2、当上一次的atime较于当前的atime超过了24h
[root@Rocky ~]# stat test.txt
文件:test.txt
大小:39 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:951069 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-08-22 22:04:54.814689249 +0800
最近更改:2024-08-14 15:16:55.124923659 +0800
最近改动:2024-08-14 15:16:55.124923659 +0800
创建时间:2024-08-14 15:16:55.123923611 +0800
[root@Rocky ~]# stat -f test.txt
文件:"test.txt"
ID:fd0000000000 文件名长度:255 类型:xfs
块大小:4096 基本块大小:4096
块:总计:10469376 空闲:9340798 可用:9340798
Inodes: 总计:20971520 空闲:20842282
7.7、查看文件类型-file
file命令
使用file命令查看文件的类型,然后确定适当的打开命令或者应用程序使用格式
file [options] …
#常用选项
-b|–brief #只显示结果,不显示文件名
-f|–files-from FILE #从指定文件中获取要处理的文件名
-F|–separator STRING #指定分割符
-L|–dereference #跟随软链接
[root@Rocky ~]# ./test.sh
hello world
[root@Rocky ~]# file test.sh
test.sh: Bourne-Again shell script, ASCII text executable
[root@Rocky ~]# chmod +x test-win.sh
[root@Rocky ~]# ./test-win.sh
hello world windows
[root@Rocky ~]# file test-win.sh
test-win.sh: UTF-8 Unicode text, with CRLF line terminators //windows与Linux格式区别
[root@Rocky ~]# file -b test-win.sh
UTF-8 Unicode text, with CRLF line terminators
# 从文件中读取
[root@Rocky ~]# cat test.txt
/etc
/bin
[root@Rocky ~]# file -f test.txt
/etc: directory
/bin: symbolic link to usr/bin
7.8、创建空文件和刷新时间-touch
touch命令可以用来创建空文件或刷新文件时间
touch [OPTION]... FILE...
\#常用选项
-a #改变atime,ctime
-m #改变mtime,ctime
-h|--no-dereference #touch链接文件时,默认是操作其指向的目标文件,此选项表示操作链接文件本身
-r|--reference #使用某个文件的更新时间和修改时间作为当前文件的更新时间和修改时间
-d|--date #指定修改时间和访问时间,而不是采用当前系统时间
-t [[CC]YY]MMDDhhmm[.ss] # --time=WORD
--time=STRING #指定修改项 access|atime 等同于 -a, modify|mtime 等同于-m
-c|--no-create #如果文件不存在,不创建
# 修改时间
[root@Rocky ~]# ll test.txt
-rw-r--r--. 1 root root 10 8月 26 08:59 test.txt
[root@Rocky ~]# touch test.txt
[root@Rocky ~]# ll test.txt
-rw-r--r--. 1 root root 10 8月 26 09:53 test.txt
[root@Rocky ~]# stat test.txt
文件:test.txt
大小:10 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:970815 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2024-08-26 09:53:43.458048737 +0800
最近更改:2024-08-26 09:53:43.458048737 +0800
最近改动:2024-08-26 09:53:43.458048737 +0800
创建时间:2024-08-26 08:59:55.042332508 +0800
7.9、复制文件
利用 cp(copy)命令可以实现文件或目录的复制
#常用选项
-i|--interactive #如果目标文件己存在,则提示是否覆盖
-n|--no-clobber #如果目标文件己存在,则跳过此文件复制
-R|-r|--recursive #递归复制,可用于目录的复制
-a|--archive #保留所有属性 相当于 dpR 选项组合
-s|--symbolic-link #不复制文件,而是创建链接
-p #同时复制访问时间,修改时间,权限等属性,同 --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] #选择属性,默认为 mode,ownership,timestamps
-u|--update #当源文件比目标文件新时,才执行复制操作
-v|--verbose #显示复制过程
-b #先备份再覆盖
--backup=numbered #目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本
mode #权限
ownership #属主属组
timestamp #时间戳
links #保留链接
xattr #保留自定义属性
context #保留selinux属性
all #所有属性
注:复制时如果覆盖先备份再覆盖
# 备份并询问是否覆盖
[root@Rocky ~]# cat windows.txt
ab
cd
ef
g
[root@Rocky ~]# cat test-win.sh
#!/bin/bash
echo "hello world windows"
[root@Rocky ~]# cp -bi test-win.sh windows.txt
cp:是否覆盖'windows.txt'? yes
[root@Rocky ~]# cat windows.txt
#!/bin/bash
echo "hello world windows"
# 保留多版本备份
[root@Rocky a]# ls
a.txt
[root@Rocky a]# cp --backup=numbered a.txt b.txt
[root@Rocky a]# ls
a.txt b.txt
[root@Rocky a]# cp --backup=numbered a.txt b.txt
cp:是否覆盖'b.txt'? yes
[root@Rocky a]# ls
a.txt b.txt b.txt.~1~
# 特殊文件复制要加a选项
[root@Rocky a]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 5月 15 2022 /usr/bin/passwd
[root@Rocky a]# cp /usr/bin/passwd ./passwd #权限发生了变化
[root@Rocky a]# ll passwd
-rwxr-xr-x. 1 root root 32656 8月 26 10:19 passwd
[root@Rocky a]# cp -a /usr/bin/passwd ./passwd1 #权限和原来一样
[root@Rocky a]# ll passwd1
-rwsr-xr-x. 1 root root 32656 5月 15 2022 passwd1
7.10、移动和重命名文件-mv
mv命令
mv 命令可以实现文件或目录的移动和改名
- 同一分区移动数据,速度很快,数据位置没有变化
- 不同分区移动数据,速度相对慢,数据位置发生了变化
rename命令可以实现批量修改文件名(版本不同用法不同)
# mv常用选项
-b #如果目标存在,则先备份
-n|--no-clobber #如果目标文件己存在,则跳过此文件移动
-i|--interactive #如果目标文件己存在,则提示是否覆盖
-u|--update #当源文件比目标文件新时,才执行移动操作
-v|--verbose #显示移动过程
# rename常用选项
rename [options] <expression> <replacement> <file>...
#常用选项
-v|--verbose #显示过程
-s|--symlink #如果目标是链接文件,则是重命名其指向
-n|--no-act #不做任何改变
-o|--no-overwrite #不覆盖己存在文件
# 移动前备份
[root@Rocky a]# ls
a.txt b.txt
[root@Rocky a]# mv -b a.txt b.txt
mv:是否覆盖'b.txt'? yes
[root@Rocky a]# ls
b.txt b.txt~
# 移动多个文件到目录中
[root@Rocky a]# mkdir a
[root@Rocky a]# ls
a b.txt b.txt~ passwd passwd1
[root@Rocky a]# mv b.txt b.txt~ passwd passwd1 ./a
[root@Rocky a]# ls
a
[root@Rocky a]# ls a
b.txt b.txt~ passwd passwd1
# 所有文件包含.txt的文件加上.bak后缀
[root@Rocky a]# rename .txt .txt.bak *
[root@Rocky a]# ls
b.txt.bak b.txt.bak~ passwd passwd1
# 去掉所有.bak的后缀
[root@Rocky a]# rename ".bak" "" *.bak
[root@Rocky a]# ls
b.txt b.txt.bak~ passwd passwd1
# 将 b.link 指向的文件由 b.txt 改成 bb.txt
# b.link -> b.txt 改为 b.link -> bb.txt
[root@Rocky a]# ln -s b.txt b.link
[root@Rocky a]# ll
总用量 72
lrwxrwxrwx. 1 root root 5 8月 26 11:13 b.link -> b.txt
[root@Rocky a]# rename -s b.txt bb.txt b.link
[root@Rocky a]# ll
总用量 72
lrwxrwxrwx. 1 root root 6 8月 26 11:16 b.link -> bb.txt
#将当前目录下 以.txt结尾的文件,批量改名成 .log结尾
[root@Rocky a]# rename -v txt log *.txt
7.11、删除文件-rm
rm命令
# 常见选项 -i #删除前确认 -f|--force #不确认直接删除 -r|-R|--recursive #递归删除 -d|--dir #删除空目录 --no-preserve-root #强删根目录⚠️注意:
rm -rf /tmp/dir1与rm -rf /tmp/dir1/的区别`rm -rf /tmp/dir1`与`rm -rf /tmp/dir1/`的区别 # 删除普通目录 [root@Rocky tmp]# cp -r /etc/* dir1 [root@Rocky tmp]# cp -r /etc/* dir2 [root@Rocky tmp]# ls dir1 dir2 [root@Rocky tmp]# rm -rf dir1 [root@Rocky tmp]# rm -rf dir2/ [root@Rocky tmp]# ls # 删除链接文件 [root@Rocky tmp]# du -sh /var/ 27M /var/ [root@Rocky tmp]# ln -s /var dir1 [root@Rocky tmp]# ln -s /var dir2 [root@Rocky tmp]# ll lrwxrwxrwx. 1 root root 4 9月 26 21:11 dir1 -> /var lrwxrwxrwx. 1 root root 4 9月 26 21:11 dir2 -> /var [root@Rocky tmp]# rm -rf dir1 #删除了dir1这个链接文件,而不删除/var的内容 [root@Rocky tmp]# du -sh /var 27M /var [root@Rocky tmp]# du -sh dir2 0 dir2 [root@Rocky tmp]# rm -rf dir2/ #删除/var的内容,dir2这个链接文件还存在 [root@Rocky tmp]# du -sh /var 0 /var [root@Rocky tmp]# ll lrwxrwxrwx. 1 root root 4 9月 26 21:11 dir2 -> /var
# 避免误删除,定义别名
[root@ubuntu2204 ~]# alias rm='mv -t /tmp'
7.12、目录操作
显示目录树:tree命令
创建目录:mkdir命令
删除空目录:rmdir命令(不常用)
tree命令
# 常用选项
-a #显示所有,包括隐藏目录和文件
-d #只显示目录
-f #显示所有内容的完整路径
-F #在执行文件,目录,Socket,符号链接,管道文件,各自加上"*","/","=","@","|"号
-g #显示文件属组,没找到组名,以gid代替
-u #显示文件属主,没找到用户名,以uid代替
-p #显示内容权限
-s #显示内容大小
-i #不以层级结构显示
-n #不显示颜色
-t #显示时用修改时间排序
-r #以默认显示顺序的反向规则显示,默认以数字,首字母的顺序规则来显示
-o filename #将显示的内容输出到指定文件中
-L n #只显示n层目录
-D #显示内容修改时间
-C #显示色彩
mkdir命令
#常用选项
-m|--mode #目录权限属性
-p|--parents #如果要创建的目录父级目录不存在,则一起创建,是递归的意思
-v|--verbose #显示创建过程
rmdir #只能删除空目录
#常用选项
--ignore-fail-on-non-empty #忽略非空错误提示
-p|--parents #连着父目录一起删除
-v|--verbose #显示删除过程
mkdir
# 指定权限
[root@Rocky tmp]# mkdir -m=777 aa
[root@Rocky tmp]# ll aa
总用量 0
[root@Rocky tmp]# ls -al
总用量 4
drwxrwxrwt. 14 root root 4096 8月 26 11:37 .
drwxr-xr-x. 20 root root 279 8月 13 15:16 ..
drwxrwxrwx. 2 root root 6 8月 26 11:37 aa
# 递归创建
[root@Rocky tmp]# mkdir -p a/b/c
[root@Rocky tmp]# tree a
a
└── b
└── c
# 显示创建过程
[root@Rocky tmp]# mkdir -pv aa/bb/cc
mkdir: 已创建目录 'aa/bb'
mkdir: 已创建目录 'aa/bb/cc'
# rmdir
[root@Rocky tmp]# rmdir -pv a/b/c
rmdir: 正在删除目录,'a/b/c'
rmdir: 正在删除目录,'a/b'
rmdir: 正在删除目录,'a'
8、文件元数据及链接
8.1、文件元数据
inode表结构
在Linux系统中,一切皆文件,每个文件,又分为文件元数据和具体内容两部份,一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。这种存储文件元数据的区域就叫 inode,中文译作 “索引节点”,每个文件都有一个inode和n(n>=1)个block 数据块,inode 存储文件元数据,数据块存储文件具体内容数据,磁盘在格式化时,系统会自动将磁盘分为两个区域,一个是 inode 区(inode table),用来存放文件的 inode,另一个是数据区,分成很多个block(块),用来存放文件的具体内容数据,一个磁盘分区上有多少个inode和多少个block,由系统自行决定,跟文件系统,磁盘分区大小,数据块大小有关,一个磁盘分区,能存放多少个文件,由文件大小,磁盘分区大小,inode数量决定,inode 编号可重复使用,当删除一个文件之后,其inode 编号会被回收,供下次新文件使用,
每一个inode表记录对应的保存了以下信息:
- inode number(索引节点编号)
- 文件类型
- 权限
- 属主属组
- 链接数
- 文件大小
- 各时间戳
- 指向具体数据块的指针
- 有关文件的其他数据
8.2、软链接
symbolic link,也称为符号链接,类似于windows 中的快捷方式,
软链接是建立一个独立的文件,这个文件的指向的是目标的文件名。
软链接特点
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录
- 删除软链接本身,不会删除源目录内容
- 删除源目录的文件,不会删除链接文件
ln -s filename linkname
范例:
[root@ubuntu2204 ~]# ll /bin/sh
lrwxrwxrwx 1 root root 4 Mar 23 2022 /bin/sh -> dash*
[root@ubuntu2204 ~]# ll /bin
lrwxrwxrwx 1 root root 7 Apr 21 2022 /bin -> usr/bin/
[root@ubuntu2204 ~]# readlink /bin/sh
dash
[root@ubuntu2204 ~]# readlink /bin
usr/bin
#创建跨目录的软链接时,源文件不能以当前路径为准,要以目标文件的路径为准
#正确
[root@ubuntu2204 ~]# ln -sv /root/abc /boot/abc.link2
'/boot/abc.link2' -> '/root/abc'
[root@ubuntu2204 ~]# ll /boot/abc.link2
lrwxrwxrwx 1 root root 9 Jul 12 15:10 /boot/abc.link2 -> /root/abc
#正确
[[root@ubuntu2204 ~]# ln -sv ../root/abc /boot/abc.link3
'/boot/abc.link3' -> '../root/abc'
[root@ubuntu2204 ~]# ll /boot/abc.link3
lrwxrwxrwx 1 root root 11 Jul 12 15:12 /boot/abc.link3 -> ../root/abc
[root@ubuntu2204 0509]# ll
total 0
drwxr-xr-x 2 root root 48 Jul 12 15:17 dir1
lrwxrwxrwx 1 root root 5 Jul 12 15:18 dir1.link -> dir1/
#这样是删除链接指向的目录
[root@ubuntu2204 0509]# rm -rf dir1.link/
#这样是删除链接文件
[root@ubuntu2204 0509]# rm -rf dir1.link
8.3、硬链接
hard link
硬链接的作用是允许一个文件拥有多个有效的路径名,
新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,
也就是多个文件名,都是指向同一个inode,这是硬链接的本质。
硬链接特性
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个文件引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
格式:
ln filename linkname
9、通配符
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件,通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符。
常见的通配符如下:
\* #匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? #匹配任何单个字符,一个汉字也算一个字符,
~ #当前用户家目录
. #当前工作目录
~+ #当前工作目录
~- #前一个工作目录
~mage #用户mage家目录
[0-9] #匹配数字范围
[a-z] #一个小写字母
[A-Z] #一个字母
[wang] #匹配列表中的任何的一个字符
\[^wang] #匹配列表中的所有字符以外的字符
\[^a-z] #匹配列表中的所有字符以外的字符
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示 a-z
[:upper:] #任意大写字母,表示 A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母
[:blank:] #水平空白字符
[:space:] #水平或垂直空白字符
[:punct:] #标点符号
[:print:] #可打印字符
[:cntrl:] #控制(非打印)字符
[:graph:] #图形字符
[:xdigit:] #十六进制字符
# 匹配以w开头的
[root@Rocky ~]# ls w*
windows.txt
# 匹配包含u的
[root@Rocky ~]# ls *u*
linux.txt
# 匹配任意单字符为文件名的文件
[root@Rocky ~]# ll ?
-rw-r--r--. 1 root root 0 8月 26 09:44 b
# 匹配两个字符
[root@Rocky ~]# ll ??
-rw-r--r--. 1 root root 0 8月 26 09:45 ab
10、Linux用户和用户组
10.1、用户和组的主要配置文件
- /etc/passwd:用户及其属性信息(名称、UID、主组ID等)
- /etc/shadow:用户密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshadow:组密码及其相关属性
10.2、passwd文件格式
[root@Rocky ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
root: x: 0: 0: root: /root: /bin/bash
# login name: password: UID: GID: GECOS: directory: shell
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell,一般用 chsh 命令修改 chsh -s /bin/csh allove
修改用户shell
[root@Rocky ~]# getent passwd allove
allove:x:1000:1000:allove:/home/allove:/bin/bash
[root@Rocky ~]# chsh -s /bin/sh allove
正在更改 allove 的 shell。
Shell 已更改。
[root@Rocky ~]# getent passwd allove
allove:x:1000:1000:allove:/home/allove:/bin/sh
10.3、shadow文件格式
次文件存储的是用户密码信息,任何用户都无权限
# rocky9.4系统
[root@Rocky ~]# ls -al /etc/shadow
----------. 1 root root 1131 8月 27 17:21 /etc/shadow
# 文件格式
#login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
login name: #登录用户名
encrypted password: #加密后的密文,一般用sha512加密,可为空,!表示该用户被锁定,不能登录系统
date of last password change: #上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密码,为空表示密码时效功能无效
minimum password age: #最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
maximum password age: #最大时间间隔,当前密码最多能使用多少天,99999表示可以一直使用
password warning period: #警告时间,密码过期前几天开始提醒用户,默认为7
password inactivity period: #不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可以登录,为空表示不使用此规则
account expiration date: #失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永不过期
reserved field #保留字段,无意义
#所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!;禁用账号,可以直接在密码字段前加 !
# rocky9.4系统
[root@Rocky ~]# cat /etc/shadow
root:$6$ROj9G2959N61NPLs$6WlXQAfGTIQPQQdpFuX7G7uYCtZIdvQFfmhFsHeHVrm58WwELQupSqJjaqqIf9snC2gr6/2TQ7zHE/NOmVTYR1::0:99999:7:::
10.4、group文件格式
# 文件格式
# group_name:password:GID:user_list
ftp:x:50:
mage:x:1002:
group_name #组名
password #组密码,当用户加组时,需要用此密码验证
GID #组ID
user_list #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组
10.5、gshadow文件格式
#文件格式
#group name:encrypted password:administrators:members
ftp:::
mage:!::
group name #组名
encrypted password #组密码,加密后的密文,!表示还没设密码
administrators #组管理员
members #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组
10.6、文件操作
可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专用的工具来修改这几个文件。
# vipw命令 编辑/etc/passwd,/etc/group,/etc/shadow
# vigr命令 编辑/etc/passwd,/etc/group,/etc/gshadow
# vipw 默认编辑 /etc/passwd 文件
# vigr 默认编辑 /etc/group 文件
-g|--group #编辑 group 文件
-p|--passwd #编辑 passwd 文件
-s|--shadow #编辑 /etc/shadow 或 /etc/gshadow 文件
[root@Rocky ~]# vigr -p
vigr:/etc/passwd 没有更改
[root@Rocky ~]# vipw
vipw:/etc/passwd 没有更改
[root@Rocky ~]# vipw -g
vipw:/etc/group 没有更改
[root@Rocky ~]# vipw -s
vipw:/etc/shadow 没有更改
pwck命令与grpck命令
#pwck [options] [passwd [shadow]]
#对用户相关配置文件进行检查,默认检查文件为 /etc/passwd
-q|--quiet #只报告错误,忽略警告
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
#grpck [options] [group [gshadow]]
#对用户组相关配置文件进行检查,默认检查文件为 /etc/group,/etc/gshadow
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
getent命令
getent passwd|shadow|group|gshadow [uname] #根据用户名查看配置项
[root@Rocky ~]# getent passwd root
root:x:0:0:root:/root:/bin/bash
11、用户和组管理命令
用户管理命令:
- useradd
- usermod
- userdel
- id
组账号维护命令:
groupadd
groupmod
groupdel
密码管理:
- passwd
- gpasswd
组成员管理:
- groupmems
11.1、用户创建-useradd
11.1.1、useradd
useradd 命令可以创建新的Linux用户
# 格式:
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
--badname #do not check for bad names
-b, --base-dir BASE_DIR #新账户的主目录的基目录
--btrfs-subvolume-home #use BTRFS subvolume for home directory
-c, --comment COMMENT #新账户的 GECOS 字段
-d, --home-dir HOME_DIR #新账户的主目录
-D, --defaults #显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE #新账户的过期日期
-f, --inactive INACTIVE #新账户的密码不活动期
-g, --gid GROUP #新账户主组的名称或 ID
-G, --groups GROUPS #新账户的附加组列表
-h, --help #显示此帮助信息并退出
-k, --skel SKEL_DIR #使用此目录作为骨架目录
-K, --key KEY=VALUE #不使用 /etc/login.defs 中的默认值
-l, --no-log-init #不要将此用户添加到最近登录和登录失败数据库
-m, --create-home #创建用户的主目录
-M, --no-create-home #不创建用户的主目录
-N, --no-user-group #不创建同名的组
-o, --non-unique #允许使用重复的 UID 创建用户
-p, --password PASSWORD #加密后的新账户密码
-r, --system #创建一个系统账户
-R, --root CHROOT_DIR #chroot 到的目录
-P, --prefix PREFIX_DIR #prefix directory where are located the /etc/* files
-s, --shell SHELL #新账户的登录 shell
-u, --uid UID #新账户的用户 ID
-U, --user-group #创建与用户同名的组
-Z, --selinux-user SEUSER #为 SELinux 用户映射使用指定 SEUSER
useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
默认创建
[root@Rocky /]# useradd tom [root@Rocky /]# getent passwd tom tom:x:1001:1001::/home/tom:/bin/bash [root@Rocky /]# getent shadow tom tom:!!:19963:0:99999:7::: [root@Rocky /]# getent group tom tom:x:1001: [root@Rocky /]# getent gshadow tom tom:!:: [root@Rocky /]# ls /home/tom [root@Rocky /]# cd /home [root@Rocky home]# ls allove tom [root@Rocky home]# cd tom [root@Rocky tom]# ls -al 总用量 12 drwx------. 3 tom tom 78 8月 28 10:11 . drwxr-xr-x. 4 root root 31 8月 28 10:11 .. -rw-r--r--. 1 tom tom 18 4月 30 19:28 .bash_logout -rw-r--r--. 1 tom tom 141 4月 30 19:28 .bash_profile -rw-r--r--. 1 tom tom 492 4月 30 19:28 .bashrc drwxr-xr-x. 4 tom tom 39 8月 13 15:02 .mozilla
11.1.2、新建用户的相关文件
/etc/default/useradd #useradd命令默认值设定
/etc/skel/* #家目录模板
/etc/login.defs
11.1.2.1、/etc/default/useradd
useradd命令默认值设定由/etc/default/useradd定义
[root@Rocky default]# ls
grub useradd
[root@Rocky default]# cat useradd
# useradd defaults file
GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group 为100
HOME=/home #默认家目录父目录
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期后的帐号锁定的宽限期,-1表示不锁定
EXPIRE= #对应/etc/shadow文件第8列,即用户帐号的有效期
SHELL=/bin/bash #默认bash
SKEL=/etc/skel #用于生成新建用户家目录的模版文件
CREATE_MAIL_SPOOL=yes #默认创建收件箱
显示/修改默认设置
useradd -D #显示默认设置 useradd -D -s SHELL #修改默认shell useradd -D -b BASE_DIR #修改默认家目录 useradd -D -g GROUP #修改默认组 # 查看默认文件命令useradd -D [root@Rocky default]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes #更改默认 shell [root@Rocky default]# useradd -D -s /bin/sh [root@Rocky default]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/sh SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
11.1.2.2、家目录模板
/etc/skel
修改此目录内容后,新创建的用户家目录的内容会发生改变
# rocky9.4系统 [root@Rocky default]# ls -al /etc/skel 总用量 24 drwxr-xr-x. 3 root root 78 8月 13 15:02 . drwxr-xr-x. 130 root root 8192 8月 28 10:11 .. -rw-r--r--. 1 root root 18 4月 30 19:28 .bash_logout -rw-r--r--. 1 root root 141 4月 30 19:28 .bash_profile -rw-r--r--. 1 root root 492 4月 30 19:28 .bashrc drwxr-xr-x. 4 root root 39 8月 13 15:02 .mozilla # ubuntu2404系统 allove@Ubuntu2404:~$ ls -al /etc/skel total 20 drwxr-xr-x 2 root root 4096 Apr 23 09:37 . drwxr-xr-x 108 root root 4096 Aug 27 10:04 .. -rw-r--r-- 1 root root 220 Mar 31 08:41 .bash_logout -rw-r--r-- 1 root root 3771 Mar 31 08:41 .bashrc -rw-r--r-- 1 root root 807 Mar 31 08:41 .profile
3、/etc/login.defs
/etc/login.defs 是设置用户帐号限制的文件。该文件里的配置对root用户无效。/etc/login.defs 文件用于在Linux创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。
需要注意的是,该文件的用户默认配置对 root 用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs
11.1.3、批量操作newusers/chpasswd
11.1.3.1、批量创建用户newusers
[root@Rocky ~]# cat user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash
[root@Rocky ~]# newusers user.txt
[root@Rocky ~]# id u1
用户id=1024(u1) 组id=1024(u1) 组=1024(u1)
[root@Rocky ~]# id u2
用户id=1025(u2) 组id=1025(u2) 组=1025(u2)
11.1.3.2、批量修改用户口令chpasswd
[root@Rocky ~]# cat passwd.txt
u1:u1@123
u2:u2@123
[root@Rocky ~]# cat passwd.txt | chpasswd
# chpasswd交互式
[root@s152 ~]# chpasswd
username1:123456
username2:123456
11.2、用户属性修改-usermod
usermod命令可以修改用户属性
# 常用选项 -c|--comment COMMENT #修改注释 -d|--home HOME_DIR #修改家目录 -e|--expiredate EXPIRE_DATE #修改过期的日期,YYYY-MM-DD 格式 -f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不使用此功能 -g|--gid GROUP #修改组 -G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项 -a|--append GROUP #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户 -l|--login LOGIN #新的登录名称 -L|--lock #锁定用户帐号,在/etc/shadow 密码栏的增加 ! -m|--move-home #将家目录内容移至新位置,和 -d 一起使用 -o|--non-unique #允许使用重复的(非唯一的) UID -p|--password PASSWORD #修改密码,这里是明文,如果要在此处修改密码,则要用加密后的字符串 -s|--shell SHELL #修改 shell -u|--uid UID #修改 UID -U|--unlock #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉
修改用户信息
# 修改用户名
[root@Rocky ~]# id tom
用户id=1001(tom) 组id=1001(tom) 组=1001(tom)
[root@Rocky ~]# usermod -c "tom 2 jerry" -l jerry tom
[root@Rocky ~]# id jerry
用户id=1001(jerry) 组id=1001(tom) 组=1001(tom)
# 锁定用户(密码字段前会加!号,用户被锁定之后将无法登录)
[root@Rocky ~]# getent shadow jerry
jerry:$6$5dEadHrAR1dn.DBv$uAkbXE4krQfb81qXOqZAcZ6hAkaN69kt7UYugesTvGLCrlmnEJVWlBHweXufKbxaU1o8JtzkyE64zQuq62pKh.:19964:0:99999:7:::
[root@Rocky ~]# usermod -L jerry
[root@Rocky ~]# getent shadow jerry
jerry:!$6$5dEadHrAR1dn.DBv$uAkbXE4krQfb81qXOqZAcZ6hAkaN69kt7UYugesTvGLCrlmnEJVWlBHweXufKbxaU1o8JtzkyE64zQuq62pKh.:19964:0:99999:7:::
# 解锁用户
# 所谓解锁,只针对于有密码的用户来说,但是,可以直接修改/etc/shadow 文件,将密码栏置空产生空密码用户
[root@Rocky ~]# usermod -U jerry
[root@Rocky ~]# getent shadow jerry
jerry:$6$5dEadHrAR1dn.DBv$uAkbXE4krQfb81qXOqZAcZ6hAkaN69kt7UYugesTvGLCrlmnEJVWlBHweXufKbxaU1o8JtzkyE64zQuq62pKh.:19964:0:99999:7:::
11.3、删除用户-userdel
userdel可删除Linux用户
常见选项: -f|–-force #强制删除,哪怕用户正在登录状态 -r|--remove #删除家目录和邮件目录
[root@Rocky ~]# userdel -r jerry
[root@Rocky ~]# cd /home
[root@Rocky home]# ls
allove u1 u2
# 用户被删除后,其名下的文件无法显示属主属组,只能显示UID
[u1@Rocky ~]$ ll
总用量 0
drwxr-xr-x. 2 u1 u1 6 8月 29 11:26 u1_dir
-rw-r--r--. 1 u1 u1 0 8月 29 11:27 u1.txt
[u1@Rocky ~]$ exit
注销
[root@Rocky home]# userdel u1
[root@Rocky home]# ls
allove u1 u2
[root@Rocky home]# cd u1
[root@Rocky u1]# ll
总用量 0
drwxr-xr-x. 2 1024 1024 6 8月 29 11:26 u1_dir
-rw-r--r--. 1 1024 1024 0 8月 29 11:27 u1.txt
# 如果新建用户,使用了原用户的UID,则可以继承原用户文件
[root@Rocky u1]# useradd -m -u 1024 lisa
[root@Rocky u1]# ll
总用量 0
drwxr-xr-x. 2 lisa lisa 6 8月 29 11:26 u1_dir
-rw-r--r--. 1 lisa lisa 0 8月 29 11:27 u1.txt
[root@Rocky home]# ls -al
总用量 4
drwxr-xr-x. 6 root root 52 8月 29 11:34 .
dr-xr-xr-x. 18 root root 235 8月 13 15:02 ..
drwx------. 14 allove allove 4096 8月 24 11:56 allove
drwx------. 3 lisa lisa 78 8月 29 11:34 lisa
drwx------. 4 lisa lisa 69 8月 29 11:27 u1
drwx------. 13 u2 u2 161 8月 28 17:53 u2
# 删除用户文件
/var/mail/用户名
/home/用户名
11.4、查看用户相关信息-id
id命令查看用户的uid、gid等相关信息
# 常见选项 -a #显示详细信息,默认选项 -Z|--context #仅显示安全上下文信息,要开启selinux配置才有 -g|--group #仅显示GID,就是只显示主组ID -G|--groups #显示主组和附加组ID,就是所有组ID -n|--name #显示用户名或组名,要组合使用 -nu -ng -nG -u|--user #仅显示UID
[root@Rocky allove]# id
用户id=0(root) 组id=0(root) 组=0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@Rocky allove]# id -u u2
1025
[root@Rocky allove]# id -g u2
1025
11.5、切换用户或以其他用户执行命令-su
如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;
则在此种情况下,我们可以:
- 让有权限的用户登录终端,再执行相应的操作;
- 在当前终端终,临时切换,以有权限的用户的身份去执行命令;
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
su [options...] [-] [user [args...]] #常见选项 -m|-p|--preserve-environment #不重置环境变量 -g|--group group #指定主组,只有root 切普通用户才能指定此参数 -|-l|--login #完全切换 -c|--command command #不切换用户,而是临时使用该用户权限和环境执行命令 --session-command command #使用上同 -c 选项,但不会创建会话 -f|--fast #向shell 传递 -f 选项(csh 或 tcsh) -s|--shell shell #切换用户后,指定新环境的shell环境,必须在/etc/shells中存在 -P|--pty #开一个新的终端切换用户的方式:
- su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
- su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
- 注:
- root su至其他用户无需密码,非root用户切换时需要输入密码
- su切换新用户后,使用exit退回至旧的用户身份,不需要再用su切换至旧用户,否则会生成很多的bash子进程,环境可能混乱
- 使用 /sbin/nologin shell的用户无法切换,ubnutn 中使用/bin/false shell 的用户同样无法切换
不完全切换与完全切换的区别
[u2@Rocky ~]$ pwd
/home/u2
[u2@Rocky ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
# 不完全切换
[u2@Rocky ~]$ su root
密码:
[root@Rocky u2]# pwd
/home/u2
[root@Rocky u2]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
# 完全切换
[u2@Rocky ~]$ su - root
密码:
[root@Rocky ~]# pwd
/root
[root@Rocky ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
# 区别:
# 不完全切换,切换后还是在原用户的家目录里,完全切换,切换后是在切换后的用户家目录里。
# PATH不同
不切换用户临时执行命令
[u2@Rocky ~]$ su - root -c "id"
密码:
用户id=0(root) 组id=0(root) 组=0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
11.6、设置密码-passwd
passwd可以修改用户密码
#常用选项 -k|--keep-tokens #保持身份验证令牌不过期 -d|--delete #删除用户密码,也删除密码锁,仅root有权限操作 -l|--lock #锁定用户密码,仅root有权限操作 -u|--unlock #解锁用户密码,仅root有权限操作 -e|--expire #终止用户密码,此操作完成后,用户下次登录成功后要立马修改,仅root有权限操作 -f|--force #强制执行操作 -x|--maximum=DAYS #指定用户密码最长有效期,仅root有权限操作 -n|--minimum=DAYS #指定用户密码最短有效期,仅root有权限操作 -w|--warning=DAYS #在密码过期前多少天开始提醒用户,仅root有权限操作 -i|--inactive=DAYS #当密码过期后经过多少天该用户账号会被禁用,仅root有权限操作 -S|--status #查询用户的密码状态,仅root有权限操作 --stdin #从标准输入接收密码,Ubuntu无此选项
普通用户修改自己密码,要先验证当前使用的密码
root修改其它用户密码
修改密码其实就是更新 /etc/shadow 文件
非交互式修改密码
[root@Rocky allove]# echo "u2@123" | passwd --stdin u2
更改用户 u2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@Rocky allove]# passwd --stdin u2 <<<123456
更改用户 u2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
设置用户下次必须更改密码
[root@Rocky allove]# passwd -e u2
正在终止用户 u2 的密码。
passwd: 操作成功
[allove@Rocky ~]$ su - u2
密码:
您必须立即更改密码(管理员强制)。
当前的密码:
新的密码:
重新输入新的密码:
11.7、修改用户密码策略-chage
chage可以修改用户密码策略
chage [options] LOGIN #常见选项 -d LAST_DAY #更改密码的时间 -m|--mindays MIN_DAYS -M|--maxdays MAX_DAYS -W|--warndays WARN_DAYS -I|--inactive INACTIVE #密码过期后的宽限期 -E|--expiredate EXPIRE_DATE #用户的有效期 -l #显示密码策略
查看用户密码策略
[root@Rocky ~]# chage -l u2
最近一次密码修改时间 :8月 29, 2024
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
allove@Ubuntu2404:~$ chage -l allove
Last password change : Aug 13, 2024
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
修改用户密码策略
[root@Rocky ~]# chage u2
正在为 u2 修改年龄信息
请输入新值,或直接敲回车键以使用默认值
最小密码年龄 [0]:
密码文件中各时间字段的表示:
11.8、创建组-groupadd
groupadd 创建组
#常见选项 -f|--force #如果组已经存在则成功退出 -g|--gid GID #新建组时指定组ID,默认是系统分配,指定值不要超过[GID_MIN,GID_MAX] -K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如 -K GID_MIN=100 -o|--non-unique #允许创建有重复 GID 的组 -p|--password PASSWORD #为新组使用此加密过的密码,这里要用加密后的密文,不然就是直接是明文在/etc/gshadow 里面 -r|--system #创建一个系统组 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
# 创建组,-g:指定GID -r:创建系统组
[root@Rocky ~]# groupadd -g 48 -r apache
[root@Rocky ~]# getent group apache
apache:x:48:
[root@Rocky ~]# groupadd apache
groupadd:“apache”组已存在
[root@Rocky ~]# groupadd -f apache
11.9、修改组-groupmod
groupmod 组属性修改
groupmod [options] GROUP #常见选项 -g|--gid GID #修改GID -n|--new-name NEW_GROUP #改名为 NEW_GROUP -o|--non-unique #允许使用重复的 GID -p|--password PASSWORD #将密码更改为(加密过的) PASSWORD
[root@Rocky ~]# groupmod -g 123 apache
[root@Rocky ~]# getent group apache
apache:x:123:
[root@Rocky ~]# groupmod -n apacheuser apache
[root@Rocky ~]# getent group apacheuser
apacheuser:x:123:
11.10、组删除-groupdel
groupdel 删除组
groupdel [options] GROUP #常见选项 -f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录 #强制删除之后,显示该组名的地方,只能显示该组ID,如果此时新建与组ID相同的新组,则被删除的组的数据会被新组关联
- 删除组:如果该组下有用户将组作为主组,则不能删除
- 删除用户:会把与其同ID的主组也给删了,前提是该组下没有其它用户
11.11、更改组成员和密码-gpasswd
gpasswd命令,可以更改组密码,也可以修改附加组的成员关系
组没有密码的情况下,加组只能由root来操作
gpasswd [option] GROUP #常见选项 -a|--add USER #向组中添加用户 -d|--delete USER #从组中移除用户 -r|--delete-password #删除组密码 -R|--restrict #向其成员限制访问组 GROUP -M|--members USER,... #批量加组 -A|--administrators ADMIN,... #批量设组管理员
# 将u2添加到apacheuser组里
[root@Rocky ~]# gpasswd -a u2 apacheuser
正在将用户“u2”加入到“apacheuser”组中
[root@Rocky ~]# id u2
用户id=1025(u2) 组id=1025(u2) 组=1025(u2),123(apacheuser)
[root@Rocky ~]# getent gshadow apacheuser
apacheuser:!::u2
#设置组密码
[root@Rocky ~]# gpasswd u2
正在修改 u2 组的密码
新密码:
请重新输入新密码:
[root@Rocky ~]# getent gshadow u2
u2:$6$G9mtoDqeecITnW7u$1EIiQoxWJgXF3c6XOKpICEfrKYc1okDHxjx6UETi5hFpdixz5XBobjOD.2rD8r.MbvitvZ7zHR8JmJOs1Sz0u0::
#移除组成员
[root@Rocky ~]# gpasswd -d u2 apacheuser
正在将用户“u2”从“apacheuser”组中删除
[root@Rocky ~]# id u2
用户id=1025(u2) 组id=1025(u2) 组=1025(u2)
11.12、更改和查看组成员-groupsmems
groupmems 可以管理附加组的成员关系
groupmems [options] [action] #常见选项 -g|--group groupname #更改为指定组 (只有root) -a|--add username #指定用户加入组 -d|--delete username #从组中删除用户 -p|--purge #从组中清除所有成员 -l|--list #显示组成员列表
# 列出apacheuser组为附加组的用户
[root@Rocky ~]# gpasswd -a u2 apacheuser
正在将用户“u2”加入到“apacheuser”组中
[root@Rocky ~]# gpasswd -a allove apacheuser
正在将用户“allove”加入到“apacheuser”组中
[root@Rocky ~]# groupmems -g apacheuser -l
u2 allove
# 将u2加到附加组allove组中
[root@Rocky ~]# groupmems -g allove -a u2
[root@Rocky ~]# id u2
用户id=1025(u2) 组id=1025(u2) 组=1025(u2),1000(allove),123(apacheuser)
11.13、查看用户组关系-groups
groups 可查看用户组关系
#查看用户所属组列表 groups [OPTION].[USERNAME]... [root@Rocky ~]# groups u2 u2 : u2 allove apacheuser
11.14、临时切换组-newgrp
临时切换组-newgrp
#newgrp [-] [group] #临时切换用户组,这里就要用到上面gpasswd 给组设置的密码 #普通用户切组需要密码,root用户切组不需要密码 newprp mage #切换之后创建的文件属组就是mage [root@Rocky ~]# id 用户id=0(root) 组id=0(root) 组=0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@Rocky ~]# newgrp - allove [root@Rocky ~]# id 用户id=0(root) 组id=1000(allove) 组=1000(allove),0(root) 上下文=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
12、文件权限
12.1、Linux权限体系介绍
在Linux系统中,一切皆文件;
对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;
而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;
- 三种角色
- 属主(owner\user):符号代表-u
- 属组(group):符号代表-g
- 其他用户(other):符号代表-o
- 三种权限:
- 读:r-4
- 写:w-2
- 执行:x-1
- 程序访问文件时的权限,取决于此程序的发起者
- 进程的发起者,同文件的属主:则应用文件属主权限
- 进程的发起者,属于文件属组;则应用文件属组权限
- 应用文件“其它”权限
12.2、文件所有者和属组属性操作-chown\chgrp
chown命令可以修改文件的属性,也可以修改文件属组
chgrp命令只能修改文件属组
chown命令格式: chown [OPTION]... [OWNER][:[GROUP]] FILE... chown [OPTION]... --reference=RFILE FILE... #用法说明 OWNER #只修改所有者 OWNER:GROUP #同时修改所有者和属组 :GROUP #只修改属组,冒号也可用 . 替换 #常用选项 -c|--changes #同-v选项,但只显示更新成功的信息 -f|--silent|--quiet #不显示错误信息 -v|--verbose #显示过程 --dereference #修改的是符号链接指向的文件,而不是链接文件本身 -h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号链接文件属性时,此项才有效) --from=user:group #根据原属主属组来修改,相当于一个查询条件 --no-preserve-root #不特别对待“/”,意思就是将根目录当成普通目录来执行,默认如此,所以不要对根目录进行操作 --preserve-root #不允许在"/"上递归操作 --reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件 -R|--recursive #递归操作 #下列选项配合 -R 使用 -H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组 -L #更改所有遇到的符号链接指向的目录 -P #不更改符号链接指向的目录# chgrp命令格式: chgrp [OPTION]... GROUP FILE... chgrp [OPTION]... --reference=RFILE FILE... #常用选项 -c|--changes #同-v选项,但只显示更新成功的信息 -f|--silent|--quiet #不显示错误信息 -v|--verbose #显示过程 --dereference #修改的是符号链接指向的文件,而不是链接文件本身 -h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号链接文件属性时,此项才有效) --no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要对根目录进行操作 --preserve-root #不允许在"/"上递归操作 --reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件 -R|--recursive #递归操作 #下列选项配合 -R 使用, -H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组 -L #更改所有遇到的符号链接指向的目录 -P #不更改符号链接指向的目录
12.2.1、设置文件所有者-chown
[root@Rocky a]# ll
总用量 12
-rw-r--r--. 1 root root 0 9月 2 08:47 test1.txt
-rw-r--r--. 1 root root 0 9月 2 08:47 test2.txt
-rw-r--r--. 1 root root 0 9月 2 08:47 test3.txt
-rw-r--r--. 1 root root 0 9月 2 08:47 test4.txt
-rw-r--r--. 1 root root 0 9月 2 08:47 test5.txt
# 修改属主或属组
[root@Rocky a]# chown u2 test1.txt #只修改属主
[root@Rocky a]# chown .u2 test4.txt #只修改属组
[root@Rocky a]# chown :u2 test5.txt #只修改属组
[root@Rocky a]# ll
-rw-r--r--. 1 u2 root 0 9月 2 08:47 test1.txt
-rw-r--r--. 1 root u2 0 9月 2 08:47 test4.txt
-rw-r--r--. 1 root u2 0 9月 2 08:47 test5.txt
[root@Rocky a]# chown 1000 test6.txt #使用UID来修改属主,UID不支持省略写法
[root@Rocky a]# ll test6.txt
-rw-r--r--. 1 allove root 0 9月 2 08:58 test6.txt
[root@Rocky a]# chown :1000 test8.txt #使用GID修改属组
[root@Rocky a]# ll test8.txt
-rw-r--r--. 1 root allove 0 9月 2 08:59 test8.txt
# 同时修改属组属主
[root@Rocky b]# chown u2:u2 test1.txt
[root@Rocky b]# chown u2.u2 test2.txt
[root@Rocky b]# chown u2. test3.txt
[root@Rocky b]# chown u2: test4.txt
[root@Rocky b]# chown 1000:1000 test5.txt
[root@Rocky b]# chown 1000:u2 test6.txt
[root@Rocky b]# chown u2:1000 test7.txt
[root@Rocky b]# ll
总用量 0
-rw-r--r--. 1 u2 u2 0 9月 2 09:09 test1.txt
-rw-r--r--. 1 u2 u2 0 9月 2 09:09 test2.txt
-rw-r--r--. 1 u2 u2 0 9月 2 09:09 test3.txt
-rw-r--r--. 1 u2 u2 0 9月 2 09:09 test4.txt
-rw-r--r--. 1 allove allove 0 9月 2 09:09 test5.txt
-rw-r--r--. 1 allove u2 0 9月 2 09:09 test6.txt
-rw-r--r--. 1 u2 allove 0 9月 2 09:09 test7.txt
# 根据文件修改属主属组
[root@Rocky b]# ll test7.txt test8.txt
-rw-r--r--. 1 u2 allove 0 9月 2 09:09 test7.txt
-rw-r--r--. 1 root root 0 9月 2 09:09 test8.txt
[root@Rocky b]# chown --reference=test7.txt test8.txt
[root@Rocky b]# ll test7.txt test8.txt
-rw-r--r--. 1 u2 allove 0 9月 2 09:09 test7.txt
-rw-r--r--. 1 u2 allove 0 9月 2 09:09 test8.txt
#递归修改属组属主
[root@Rocky ~]# chown -R allove:u2 a/
12.2.2、设置文件属组信息-chgrp
[root@Rocky a]# chgrp allove test1.txt
[root@Rocky a]# ll test1.txt
-rw-r--r--. 1 root allove 0 9月 2 08:47 test1.txt
# 递归修改文件属组
[root@Rocky a]# chgrp -R u2 b/
[root@Rocky a]# ls -al b
总用量 0
drwxr-xr-x. 2 root u2 159 9月 2 09:09 .
drwxr-xr-x. 3 root root 186 9月 2 09:09 ..
-rw-r--r--. 1 root u2 0 9月 2 09:09 test1.txt
-rw-r--r--. 1 root u2 0 9月 2 09:09 test2.txt
-rw-r--r--. 1 root u2 0 9月 2 09:09 test3.txt
# 修改zz指向的文件的属组
[root@Rocky a]# ll
-rw-r--r--. 1 root root 0 9月 2 08:47 test2.txt
lrwxrwxrwx. 1 root root 9 9月 2 09:30 zz -> test2.txt
[root@Rocky a]# chgrp u2 --dereference zz
[root@Rocky a]# ll
-rw-r--r--. 1 root u2 0 9月 2 08:47 test2.txt
lrwxrwxrwx. 1 root root 9 9月 2 09:30 zz -> test2.txt
# 修改zz文件本身属组
[root@Rocky a]# chgrp allove --no-dereference zz
[root@Rocky a]# ll
-rw-r--r--. 1 root root 0 9月 2 08:47 test2.txt
lrwxrwxrwx. 1 root allove 9 9月 2 09:30 zz -> test2.txt
12.3、文件权限-chmod
文件权限说明:
- 角色定义:
- owner(u):属主
- group(g):属组
- other(o):其他用户
- all(a):所有人,包括属组属主和其他人
- 赋值写法
- + :增加某些权限
- - : 删除某些权限
- = :只保留某些权限,覆盖写法
- 权限表示方法:
- 读: r 4
- 写: w 2
- 执行:x 1
常见写法: u+r #属主加读权限 g-x #属组去掉执行权限 ug=rx #属主属组权限改为读和执行 o= #other用户无任何权限 a=rwx #所有用户都有读写执行权限 #注意: 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限 r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写 只要所有者,所属组或other三者之一有x权限,root就可以执行
权限 对文件 对目录 r 可查看文件内容 可读取目录中的文件名,但文件元数据无法查看 w 可修改文件内容 可在目录中创建、删除文件 x 可执行,发起为一个进程 可进入目录,可查看文件元数据,可查看文件内容属于目录最小权限

修改文件权限-chmod
格式:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以
不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件
-R|--recursive #递归操作
#MODE
who opt permisson
who # u|g|o|a
opt # +|-|=
permission # r|w|x
[root@ubuntu2204 0509]# chmod a= f1
[root@ubuntu2204 0509]# chmod u=r,g=w,o=x f2
[root@ubuntu2204 0509]# chmod u+w,g-x,o-r f3
[root@ubuntu2204 0509]# chmod a=rwx f4
[root@ubuntu2204 0509]# chmod 644 a1
[root@ubuntu2204 0509]# chmod 0 a2
[root@ubuntu2204 0509]#chmod 777 a3
# 递归操作
[root@ubuntu2204 0509]# chmod o+rwx -R dir1/
# 大写X,只会给子目录加x权限
[root@ubuntu2204 0509]# chmod o+X -R dir1/
[allove@Rocky ~]$ chmod a= a/
[allove@Rocky ~]$ ll
d---------. 3 allove allove 15 9月 2 10:36 a
[allove@Rocky ~]$ cd a
-bash: cd: a: 权限不够
[allove@Rocky ~]$ ll a
ls: 无法打开目录 'a': 权限不够
[allove@Rocky ~]$ rm -rf a
rm: 无法删除 'a': 权限不够
[allove@Rocky ~]$ stat a/b
stat: cannot statx 'a/b': 权限不够
# 目录权限
+r权限
[allove@Rocky ~]$ chmod u+r a/
[allove@Rocky ~]$ ll
dr--------. 3 allove allove 15 9月 2 10:36 a
[allove@Rocky ~]$ ll a
ls: 无法访问 'a/b': 权限不够
总用量 0
d????????? ? ? ? ? ? b
[allove@Rocky ~]$ stat a/b
stat: cannot statx 'a/b': 权限不够
[allove@Rocky ~]$ rm -rf a/b
rm: 无法删除 'a/b': 权限不够
[allove@Rocky ~]$ cd a
-bash: cd: a: 权限不够
+w权限
[allove@Rocky ~]$ chmod u+w a
[allove@Rocky ~]$ ll
drw-------. 3 allove allove 15 9月 2 10:36 a
[allove@Rocky ~]$ ls a
ls: 无法访问 'a/b': 权限不够
b
[allove@Rocky ~]$ cd a
-bash: cd: a: 权限不够
[allove@Rocky ~]$ rm -rf a/b
rm: 无法删除 'a/b': 权限不够
[allove@Rocky ~]$ rm -rf a
rm: 无法删除 'a/b': 权限不够
[allove@Rocky ~]$ touch a/a.txt
touch: 无法创建 'a/a.txt': 权限不够
+x权限
[allove@Rocky ~]$ chmod u+x a
[allove@Rocky ~]$ ll
drwx------. 3 allove allove 15 9月 2 10:36 a
############
执行 cp /etc/issue /data/dir/ 所需要的最小权限?
/bin/cp 需要x权限
/etc/ 需要x权限
/etc/issue 需要r权限
/data 需要x权限
/data/dir 需要w,x权限
12.4、新建文件和目录的默认权限
在linux 系统中,新建文件或目录,都有一个默认权限;
umask 值间接影响新建文件和新建目录的权限:
- 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
- 新建目录:777-umask;
umask [-p] [-S] [mode] #显示或设定文件模式掩码。 -p #如果省略 MODE 模式,以可重用为输入的格式输入 -S #以字符显示 # 查看umask值 [root@Rocky a]# umask 0022 [root@Rocky a]# umask -p umask 0022 [root@Rocky a]# umask -S u=rwx,g=rx,o=rx # 修改umask值 [root@ubuntu2204 ~]# umask 123 #临时生效,重启系统还原 [root@ubuntu2204 ~]# umask 0123 [root@ubuntu2204 ~]# umask u=rw,g=r,o= [root@ubuntu2204 ~]# umask 0137非特权用户umask默认是 002
root的umask 默认是 0022持久保存umask
全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
用户设置:~/.bashrc
对新建用户生效:vi /etc/profile最后添加umask 022(使配置立即生效,source /etc/profile)
对所有用户生效:vi /etc/bashrc最后添加umask 022(使配置立即生效,source /etc/bashrc)
[u2@Rocky ~]$ (umask 666; touch 1.txt) [u2@Rocky ~]$ ll 总用量 0 ----------. 1 u2 u2 0 9月 2 14:29 1.txt
12.5、linux文件系统上的特殊权限
在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;这三个特殊权限独⽴于rwx权限体系;
特殊权限:
SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限;
SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;
作用于目录上,此目录中新建的文件的所属组将自动从此目录继承;
- STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;
权限 字符表示 八进制表示 备注 SUID s 4 如果原属主没有可执行权限,再加SUID权限,则显示为S SGID s 2 如果原属组没有可执行权限,再加SGID权限,则显示为S STICKY t 1 如果other没有可执行权限,再加STICKY权限,则显示为T
12.5.1、特殊权限SUID
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置再目录上无意义
# SUID权限设定
chmod u+s file
chmod 4xxx file
chmod u-s file
# 案例:
spike@ubuntu2204:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1676 May 9 22:19 /etc/shadow
#普通用户无法打开 /etc/shadow文件,因为没有任何权限,根据前面的学习,我们知道,此文件存放的是用
户密码
spike@ubuntu2204:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
#但是可以通过passwd 命令来修改密码,也就是说,普通用户可以通过 passwd 命令来修改
/etc/shadow 文件
spike@ubuntu2204:~$ passwd
Changing password for user jose.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[u2@Rocky ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 5月 15 2022 /usr/bin/passwd
# 案例:
[u2@Rocky ~]$ cat /etc/shadow # 没有权限
cat: /etc/shadow: 权限不够
[u2@Rocky ~]$ exit
注销
[root@Rocky a]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@Rocky a]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[root@Rocky a]# chmod u+s /usr/bin/cat
[root@Rocky a]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 36440 4月 21 02:43 /usr/bin/cat
[root@Rocky a]# su - u2
[u2@Rocky ~]$ cat /etc/shadow # 有权限了
root:$6$ROj9G2959N61NPLs$6WlXQAfGTIQPQQdpFuX7G7uYCtZIdvQFfmhFsHeHVrm58WwELQupSqJjaqqIf9snC2gr6/2TQ7zHE/NOmVTYR1::0:99999:7:::
bin:*:19820:0:99999:7:::
12.5.2、特殊权限SGID
二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组
# SGID设定: chmod g+s file chmod g-s file chmod 2xxx file目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
# SGID设定 chmod g+s DIR chmod g-s DIR chmod 2xxx DIR
# 普通用户u2在/tmp/test下创建目录
[u2@Rocky test]$ mkdir dir-u1
# root用户u2在/tmp/test下创建目录
[root@Rocky test]# mkdir dir-root
[root@Rocky test]# ll
总用量 0
drwxr-xr-x. 2 root root 6 9月 2 16:26 dir-root
drwxr-xr-x. 2 u2 u2 6 9月 2 16:25 dir-u1
[root@Rocky test]# touch test-root.txt
# u2、root用户创建文件
[u2@Rocky test]$ touch test-u2.txt
[root@Rocky test]# touch test-root.txt
[u2@Rocky test]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 9月 2 16:26 dir-root
drwxr-xr-x. 2 u2 u2 6 9月 2 16:25 dir-u1
-rw-r--r--. 1 root root 0 9月 2 16:27 test-root.txt
-rw-r--r--. 1 u2 u2 0 9月 2 16:27 test-u2.txt
#目录添加权限
[root@Rocky test]# chmod g+s /tmp/test/
[root@Rocky test]# ll -d /tmp/test/
drwxr-sr-x. 4 u2 u2 76 9月 2 16:27 /tmp/test/
[root@Rocky test]# touch test-root2.txt
[root@Rocky test]# ll
-rw-r--r--. 1 root u2 0 9月 2 16:30 test-root2.txt #u2属组
[u2@Rocky test]$ touch test-u22.txt
[u2@Rocky test]$ ll
-rw-r--r--. 1 u2 u2 0 9月 2 16:31 test-u22.txt
[root@Rocky test]# mkdir dir-root2
[root@Rocky test]# ll
总用量 0
drwxr-xr-x. 2 root root 6 9月 2 16:26 dir-root
drwxr-sr-x. 2 root u2 6 9月 2 16:37 dir-root2 #u2属组
12.5.3、特殊权限sticky位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置sticy位,只有文件的所有者或root可以删除改文件
sticky设置在文件上无意义
# sticky权限设定: chmod o+t dir chmod o-t dir chmod 1xxx dir
# 范例:
[root@Rocky /]# mkdir testdir
[root@Rocky /]# ls -d testdir/
testdir/
[root@Rocky /]# ll -d testdir/
drwxr-xr-x. 2 root root 6 9月 2 16:59 testdir/
[root@Rocky /]# chmod a=rwx testdir/
[root@Rocky /]# ll -d testdir/
drwxrwxrwx. 2 root root 6 9月 2 16:59 testdir/
[root@Rocky /]# su - tom
[tom@Rocky ~]$ cd /testdir/
[tom@Rocky testdir]$ touch test-tom
[root@Rocky /]# su - u2
[u2@Rocky ~]$ cd /testdir/
[u2@Rocky testdir]$ touch test-u2.txt
[root@Rocky testdir]# ll
总用量 0
-rw-r--r--. 1 tom tom 0 9月 2 17:01 test-tom
-rw-r--r--. 1 u2 u2 0 9月 2 17:04 test-u2.txt
# 普通用户可以删除其他用户的文件
[u2@Rocky testdir]$ ls
test-tom test-u2.txt
[u2@Rocky testdir]$ rm -rf test-tom
# 添加sticky权限
[root@Rocky testdir]# chmod o+t /testdir/
[root@Rocky testdir]# ll -d /testdir/
drwxrwxrwt. 2 root root 25 9月 2 17:08 /testdir/
# 普通用户无法删除该文件
[tom@Rocky testdir]$ rm -rf test-u2.txt
rm: 无法删除 'test-u2.txt': 不允许的操作
# 查看目录中的sticky权限
[root@Rocky /]# ll -d /testdir/
drwxrwxrwt. 2 root root 45 9月 2 17:11 /testdir/
[root@Rocky /]# file /testdir/
/testdir/: sticky, directory
12.5.4、特殊权限数字法
| 字符表示 | 二进制表示 | 八进制表示 | 备注 |
|---|---|---|---|
| --------- | 000 | 0 | 无任何特殊权限 |
| --------t | 001 | 1 | sticky |
| -----s--- | 010 | 2 | SGID |
| -----s–t | 011 | 3 | SGID、sticky |
| –s------ | 100 | 4 | SUID |
| –s-----t | 101 | 5 | SUID、sticky |
| –s—s— | 110 | 6 | SUID、SGID |
| –s–s–t | 111 | 7 | SUID、SGID、sticky |
权限位映射
- SUID: user,占据属主的执行权限位
- s:属主拥有x权限
- S:属主没有x权限
- SGID: group,占据属组的执行权限位
- s: group拥有x权限
- S:group没有x权限
- Sticky: other,占据other的执行权限位
- t:other拥有x权限
- T:other没有x权限
12.5.5、设定文件特殊属性-chattr/lsattr
chattr命令:改变文件或目录的属性
chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files... #常用选项 -p project #设置文件项目编号 -R #递归执行 -V #显示过程,并输出chattr 版本 -f #不输出错误信息 -v version #设置版本 #操作符 +attribute #添加该属性 -attribute #去掉该属性 =attribute #仅有该属性 #常用属性 a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件 A #不更新atime,节省IO c #文件会被压缩保存 i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可新建文件,不可删除文件 s #彻底删除文件,用0填充原来的数据块 u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖 b #不更新文件或目录的最后存取时间。
# 实例:
#用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/resolv.conf
lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf
让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
chattr +a /var/log/messages
lsattr命令:显示文件特殊属性
lsattr命令 语法 lsattr [-adlRvV][文件或目录...] 参数: -a # 显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。 -d # 显示,目录名称,而非其内容。 -l # 此参数目前没有任何作用。 -R # 递归处理,将指定目录下的所有文件及子目录一并处理。 -v # 显示文件或目录版本。 -V # 显示版本信息。
# 范例:+i防止误删除
1、用chattr命令防止系统中某个关键文件被修改:
# chattr +i /etc/resolv.conf
然后用mv /etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。
vim编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉:
#chattr -i /etc/resolv.conf
使用 lsattr 命令来显示文件属性:
# lsattr /etc/resolv.conf
输出结果为:
----i-------- /etc/resolv.conf
2、让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
# chattr +a /var/log/messages #+a 一般用于日志文件
12.6、访问控制列表ACL
rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;
而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1 /mnt/test #挂载文件系统并启用ACLACL生效顺序:
所有者→自定义用户→所属组→自定义组→其他人
# ACL相关命令
setfacl 可设置ACL权限
getfacl 可查看设置的ACL权限
# 格式:
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
#常用选项
-m|--modify=acl #修改acl权限
-M|--modify-file=file #从文件读取规则
-x|--remove=acl #删除文件acl 权限
-X|--remove-file=file #从文件读取规则并删除权限
-b|--remove-all #删除文件所有acl权限
-k|--remove-default #删除默认acl规则
--set=acl #用新规则替换旧规则,会删除原有ACL项,用新的替代,一定要包含UGO的设置,不能象 -m一样只有 ACL
--set-file=file #从文件读取新规则
--mask #重新计算mask值
-n|--no-mask #不重新计算mask值
-d|--default #在目录上设置默认acl
-R|--recursive #递归执行
-L|--logical #将acl 应用在软链接指向的目标文件上,与-R一起使用
-P|--physical #将acl 不应用在软链接指向的目标文件上,与-R一起使用
# 设置用户权限
[root@Rocky tmp]# echo "12334565">file1
[root@Rocky tmp]# ll file1
-rw-r--r--. 1 root root 9 9月 2 17:54 file1
[root@Rocky tmp]# su - tom -c "cat /tmp/file1"
12334565
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
# 设置tom无任何权限
[root@Rocky tmp]# setfacl -m u:tom:- file1
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:tom:---
group::r--
mask::r--
other::r--
[root@Rocky tmp]# ll file1 # 查看文件,多了一个+号
-rw-r--r--+ 1 root root 9 9月 2 17:54 file1
[root@Rocky tmp]# su - tom -c "cat /tmp/file1" #tom已经不可读
cat: /tmp/file1: 权限不够
# 给组加ACL
[root@Rocky tmp]# setfacl -m g:allove:rw file1
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
# 从文件复制ACL(读取file1的acl给file2)
[root@Rocky tmp]# getfacl file1 file2
# file: file1
# owner: root
# group: root
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
# file: file2
# owner: u2
# group: u2
user::rw-
group::r--
other::r--
[root@Rocky tmp]# getfacl file1 |setfacl --set-file=- file2
[root@Rocky tmp]# getfacl file1 file2
# file: file1
# owner: root
# group: root
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
# file: file2
# owner: u2
# group: u2
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
# 移除ACL(移除tom的权限)
[root@Rocky tmp]#
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
[root@Rocky tmp]# setfacl -x u:tom file1
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
group:allove:rw-
mask::rw-
other::r--
# 移除文件上所有ACL权限
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
group:allove:rw-
mask::rw-
other::r--
[root@Rocky tmp]# setfacl -b file1
[root@Rocky tmp]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
# --set 替换acl
[root@Rocky tmp]# getfacl file2
# file: file2
# owner: u2
# group: u2
user::rw-
user:tom:---
group::r--
group:allove:rw-
mask::rw-
other::r--
[root@Rocky tmp]# setfacl --set u::-,u:u2:r,g::-,g:u2:w file2 (ugo不能缺)
setfacl: file2: Malformed access ACL `user::---,user:u2:r--,group::---,group:u2:-w-,mask::rw-': Missing or wrong entry at entry 6
[root@Rocky tmp]# setfacl --set u::-,u:u2:r,g::-,g:u2:w,o::- file2
[root@Rocky tmp]# getfacl file2
# file: file2
# owner: u2
# group: u2
user::---
user:u2:r--
group::---
group:u2:-w-
mask::rw-
other::---
mask权限
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要和用户的权限进行逻辑与运算后,才能变成有限的权限
- 用户或组的设置必须存在于mask权限设定范围内才会生效。
setfacl -m mask::rx file(待补充)


3983

被折叠的 条评论
为什么被折叠?



