Linux基础学习

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手册一般有以下几个章节:

  1. 可执行程序或 shell 命令
  2. 系统调用
  3. 库调用
  4. 特殊文件
  5. 文件格式和规范,
  6. 游戏
  7. 杂项
  8. 系统管理命令(通常只针对 root 用户)
  9. 内核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  826 08:59 test.txt
[root@Rocky ~]# touch test.txt
[root@Rocky ~]# ll test.txt
-rw-r--r--. 1 root root 10  826 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  515  2022 /usr/bin/passwd
[root@Rocky a]# cp /usr/bin/passwd ./passwd     #权限发生了变化
[root@Rocky a]# ll passwd
-rwxr-xr-x. 1 root root 32656  826 10:19 passwd
[root@Rocky a]# cp -a /usr/bin/passwd ./passwd1     #权限和原来一样
[root@Rocky a]# ll passwd1
-rwsr-xr-x. 1 root root 32656  515  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  826 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  826 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/dir1rm -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  926 21:11 dir1 -> /var
lrwxrwxrwx. 1 root root 4  926 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  926 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  826 11:37 .
drwxr-xr-x. 20 root root  279  813 15:16 ..
drwxrwxrwx.  2 root root    6  826 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  826 09:44 b
# 匹配两个字符
[root@Rocky ~]# ll ??
-rw-r--r--. 1 root root 0  826 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  827 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  828 10:11 .
drwxr-xr-x. 4 root root  31  828 10:11 ..
-rw-r--r--. 1 tom  tom   18  430 19:28 .bash_logout
-rw-r--r--. 1 tom  tom  141  430 19:28 .bash_profile
-rw-r--r--. 1 tom  tom  492  430 19:28 .bashrc
drwxr-xr-x. 4 tom  tom   39  813 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  813 15:02 .
drwxr-xr-x. 130 root root 8192  828 10:11 ..
-rw-r--r--.   1 root root   18  430 19:28 .bash_logout
-rw-r--r--.   1 root root  141  430 19:28 .bash_profile
-rw-r--r--.   1 root root  492  430 19:28 .bashrc
drwxr-xr-x.   4 root root   39  813 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  829 11:26 u1_dir
-rw-r--r--. 1 u1 u1 0  829 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  829 11:26 u1_dir
-rw-r--r--. 1 1024 1024 0  829 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  829 11:26 u1_dir
-rw-r--r--. 1 lisa lisa 0  829 11:27 u1.txt
[root@Rocky home]# ls -al
总用量 4
drwxr-xr-x.  6 root   root     52  829 11:34 .
dr-xr-xr-x. 18 root   root    235  813 15:02 ..
drwx------. 14 allove allove 4096  824 11:56 allove
drwx------.  3 lisa   lisa     78  829 11:34 lisa
drwx------.  4 lisa   lisa     69  829 11:27 u1
drwx------. 13 u2     u2      161  828 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

如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;

则在此种情况下,我们可以:

  1. 让有权限的用户登录终端,再执行相应的操作;
  2. 在当前终端终,临时切换,以有权限的用户的身份去执行命令;

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]:

密码文件中各时间字段的表示:

image-20240829170542642

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  92 08:47 test1.txt
-rw-r--r--. 1 root   root  0  92 08:47 test2.txt
-rw-r--r--. 1 root   root  0  92 08:47 test3.txt
-rw-r--r--. 1 root   root  0  92 08:47 test4.txt
-rw-r--r--. 1 root   root  0  92 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  92 08:47 test1.txt
-rw-r--r--. 1 root u2   0  92 08:47 test4.txt
-rw-r--r--. 1 root u2   0  92 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  92 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  92 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  92 09:09 test1.txt
-rw-r--r--. 1 u2     u2     0  92 09:09 test2.txt
-rw-r--r--. 1 u2     u2     0  92 09:09 test3.txt
-rw-r--r--. 1 u2     u2     0  92 09:09 test4.txt
-rw-r--r--. 1 allove allove 0  92 09:09 test5.txt
-rw-r--r--. 1 allove u2     0  92 09:09 test6.txt
-rw-r--r--. 1 u2     allove 0  92 09:09 test7.txt

# 根据文件修改属主属组
[root@Rocky b]# ll test7.txt test8.txt
-rw-r--r--. 1 u2   allove 0  92 09:09 test7.txt
-rw-r--r--. 1 root root   0  92 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  92 09:09 test7.txt
-rw-r--r--. 1 u2 allove 0  92 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  92 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  92 09:09 .
drwxr-xr-x. 3 root root 186  92 09:09 ..
-rw-r--r--. 1 root u2     0  92 09:09 test1.txt
-rw-r--r--. 1 root u2     0  92 09:09 test2.txt
-rw-r--r--. 1 root u2     0  92 09:09 test3.txt

# 修改zz指向的文件的属组
[root@Rocky a]# ll
-rw-r--r--. 1 root root     0  92 08:47 test2.txt
lrwxrwxrwx. 1 root root     9  92 09:30 zz -> test2.txt
[root@Rocky a]# chgrp u2 --dereference zz
[root@Rocky a]# ll
-rw-r--r--. 1 root u2       0  92 08:47 test2.txt
lrwxrwxrwx. 1 root root     9  92 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  92 08:47 test2.txt
lrwxrwxrwx. 1 root allove   9  92 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  92 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  92 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  92 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  92 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  92 14:29 1.txt

12.5、linux文件系统上的特殊权限

在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;这三个特殊权限独⽴于rwx权限体系;

特殊权限:

  • SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限;

  • SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;

​ 作用于目录上,此目录中新建的文件的所属组将自动从此目录继承;

  • STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;
权限字符表示八进制表示备注
SUIDs4如果原属主没有可执行权限,再加SUID权限,则显示为S
SGIDs2如果原属组没有可执行权限,再加SGID权限,则显示为S
STICKYt1如果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  515  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  421 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  421 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  92 16:59 testdir/
[root@Rocky /]# chmod a=rwx testdir/
[root@Rocky /]# ll -d testdir/
drwxrwxrwx. 2 root root 6  92 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  92 17:01 test-tom
-rw-r--r--. 1 u2  u2  0  92 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  92 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  92 17:11 /testdir/
[root@Rocky /]# file /testdir/
/testdir/: sticky, directory

12.5.4、特殊权限数字法

字符表示二进制表示八进制表示备注
---------0000无任何特殊权限
--------t0011sticky
-----s---0102SGID
-----s–t0113SGID、sticky
–s------1004SUID
–s-----t1015SUID、sticky
–s—s—1106SUID、SGID
–s–s–t1117SUID、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   #挂载文件系统并启用ACL

ACL生效顺序:
所有者→自定义用户→所属组→自定义组→其他人

# 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  92 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  92 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(待补充)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值