kaixin
Published on 2023-07-15 / 46 Visits
0

Linux基础篇二

Linux的文件操作

1.文件文件夹命名规范

注意:

  1. 创建文件夹或者文件时不能添加特殊符号 <、>、?、* 等,如果非要使用请使用单引号(不会对特殊符号转义)。
  2. 文件名使用小写,大写都是系统内部使用的(名称区分大小写)。
  3. 文件名可以使用_下划线进行分割。
  4. 文件名/文件最大程度 255字符。
  5. 文件夹名称不能重复创建,文件名见名知意。
  6. 文件名的后缀没有什么意义,但是为了运维人员好管理,需要针对设置。

2.文件文件夹操作

2-1.创建

1.文件夹创建
    命令:
        mkdir
    参数:
        -p 递归创建文件夹(如果创建多级文件夹都不存在的情况下)
    使用:
        mkdir -p /opt/abc/ccc
        mkdir -p /opt/abc/{ccc,bbb,ddd} # 利用花括号的特性创建多个文件夹
    
2.文件创建
    命令:
        touch
    使用:
        touch 123.log
        touch {1..10}.log # 利用花括号特性可以快速创建多个文件
         
# 其他的创建文件操作
    vi or vim or echo 等都可以创建文件

image-20241105223207963


2-2.删除

删除操作一般使用 rm 命令,命令支持通配符,但是 rm 命令 存在风险。
注意:
    加 * 与不加 *的区别,一定要想清楚时删除文件夹还是删除文件夹的内容。
    rm -rf abc/task/n/ # 不加*,那么就会删除递归删除整个n目录
    rm -rf abc/task/n/* # 加*,只删除n目录下的全部文件内容。

命令:
    rm 

参数:
    -f  强制删除,不会出现提示信息
    -r	递归删除

删除文件夹
    rm -rf /opt/文件夹

删除文件
    rm -rf /opt/文件
    

补充:另一种删除"文件夹"命令 rmdir
    如果文件夹存在嵌套,那么是无法删除的。
    rmdir 文件夹 (文件夹不能有嵌套)

image-20241105223811559


2-3.查看文件-cat

作用:
    查看文件内容,不适合大文件查看

命令:
    cat

参数:
    -n 显示行号
    -b 不对空白行进显示行号
    -E 显示尾部的 $

使用:
    cat 123.log # 查看文件
    cat 123.log > 456.log # 结合重定向符号,将123.log写入到456.log
    # 写入文件
    cat >> 文件.txt << EOF
        所写的数据
    EOF 

2-4.查看文件-tac

作用:
    倒序查看文件内容,与cat相反

命令:
    tac

参数:
    -b 在非行结个尾添加分割标识
    -r 将分割标识作为正则进行解析
    -s 使用指定字符串作为代替换行分割符

2-5.查看文件-more

作用:
    进行分屏查看,但是与cat一样都是将全部的数据读入内存中,不使用大型的文件使用。

命令:
    more 文件

指令:
    空格  翻篇
    回车  下一行
    q  退出	

image-20241105224957437


2-6.查看文件-less

作用:
    查看文件内容,不会将全部的数据加载到内存中,看多少显示多少,适用于大文件查看。

命令:
    less 文件

指令:
    空格 翻篇
    回车 下一行
    q 退出

image-20241105225151883


2-6.查看文件-head

作用:
    查看文件的内容,无参数默认显示10行内容,可以显示固定的行数

命令:
    head 文件 

参数:
    -n 指定显示固定行数
    -c 显示文件的前K内容

使用:
    head -2 文件 # 显示2行

image-20241105225625420


2-7.查看文件-tail

作用:
    查看文件的内容,无参数默认显示后10行内容,可以显示固定的行数,与head相反

命令
    tail 行数 文件

参数:
    -f 阻塞文件,当文件被添加时,可以实时输出
    -F 对文件实时的刷新读取[文件不存在也是可以监听]
    # 用与访问日志记录最为方便

使用:
    tail -f 文件

image-20241105230406957


2-8.拷贝

注意:

  1. 拷贝可以拷贝文件或者文件夹(需要使用-r参数)。
  2. 当拷贝文件或者文件夹时,是可以对拷贝的新文件或者新文件夹进行重命名的。
  3. 如果拷贝不进行重命名,就会引用原来的拷贝的文件或者文件夹名称。

问题:如果拷贝的文件或文件夹不存在,那么新的文件夹就会使用这个文件或者文件名称。

  • 这种情况就是对文件夹或者文件进行重命名操作。所以在拷贝时请注意拷贝的位置是否存在,不然就会莫名奇妙的修改文件或者文件夹名称。
命令:
    cp

参数:
    -r 递归拷贝,对文件拷贝时使用。recursion,递归,用于复制目录。

使用:
    cp 参数 文件/文件夹	
1.拷贝文件:
    cp nginx.log ./file_cp/  # 将nginx.log拷贝到当前的file_cp 目录下
    
2.拷贝文件夹:
    cp -r log/ ./file_cp/ # 将log/文件夹拷贝到当前的file_cp 目录下

3.拷贝文件,对新的文件进行重命名:
    cp nginx.log  ./file_cp/new_nginx.log # 将nginx.log拷贝到当前的file_cp 目录下,并且重命名为new_nginx.log
    
4.拷贝文件夹,对新的文件夹进行重命名:
    cp -r log/  ./file_cp/new_log  # 将log/文件夹拷贝到当前的file_cp 目录下,并重命名为new_log

image-20241106221935238


2-9.移动剪切-修改重命名

注意:命令与cp命令相似

  1. 相似:将文件移动到新目录并且可以修改文件名。
  2. 不同: cp命令是拷贝过去,原文件还在当前目录,mv是将原文件移动至新目录。
作用:
    可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。

命令:
    mv

参数:
    -n 不覆盖已存在文件
    -i 覆盖前进行询问

使用:
    mv 参数 文件/文件夹 新位置或者重命名为其他名称
1.将文件移动到
    mv nginx.log ./file_mv/ # 将nginx.log 移动到 file_mv 文件夹下

2.将文件夹移动
    mv log ./file_mv/ # 将log 移动到 file_mv 文件夹下

3.将文件移动并重命名
    mv nginx.log ./file_mv/new_nginx.log # 将nginx.log 移动到 file_mv 文件夹下 修改为new_nginx.log
    
4.将文件夹移动并重命名
     mv log/ ./file_mv/new_log # 将log 移动到 file_mv 文件夹下 重名为 new_log

image-20241106223832284


2-10.获取文件和文件名称

1.获取文件的名称
    basename 文件的路径
    
    basename /etc/sysconfig/network-scripts/ifcfg-ens33  # 获取 ifcfg-ens33
    
2.获取文件目录的路径
    dirname 文件路径
    
    dirname /etc/sysconfig/network-scripts/ifcfg-ens33  # 获取  /etc/sysconfig/network-scripts/

image-20241113220653855


3.文件压缩

注意:解压时需要注意文件的类型(请使用file命令查看)。

3-1.tar命令

概念:

  1. 指的是一个文件或者目录集合,将这个集合存储到一个文件中。没有压缩功能,不节省空间。
  2. 归档文件没有经过压缩,占用的空间是所有文件和目录的总和。
  3. 将一堆小文件或者目录存储到一个文件夹内。

命令规范:

  1. *.tar :打包
  2. *.tar.gz:打包 + 压缩
  3. *.tgz:打包 + 压缩

命令与参数

命令:
    tar 

参数:
    -c 创建包
    -v 查看打包的过程或者解包的过程
    -u 更新原来打包的中的文件
    -t 查看包中的文件有哪些
    -f 指定打包的文件名称 # 必须添加,且在参数的最后一位
    -x 解包,解压缩(自适应解压格式)
    -z 压缩命令,tar调用gzip命令的过程,压缩参数,需要确认是归档文件还是gzip类型的压缩文件,如果不是就会报错不是gzip格式。
    -C 解压到那个指定目录下

使用:
    tar 参数 名称 被打包文件1 被打包的文件2 ... 被打包的文件N
    tar 参数 解包文件

3-1-1.打包

# 注意:打包不是压缩,所以文件不会变小。

参数:
    -c 创建包
    -f 指定包的文件
    -v 查看打包过程

使用:
    tar -cvf 打包的名称 被打包的文件1 被打包的文件2 ... 被打包的文件N

比如:
    tar -cvf 111.tar 123.log 456.log 

image-20241105232950910


3-1-2.查看包中得内容

可以查看打包的内的文件都有哪些

参数:
    -t 查看包的内容
    -f 指定看那个打包文件

使用:
    tar -tf 打包名称

例如:
    tar -tf 111.tar

image-20241105233236537


3-1-3.包中追加内容

对打包文件追加一个或者多个文件

参数:
    -u 添加
    -f 指定打包文件

使用:
    tar -uf 打包文件名 追加文件1 追加文件2 追加文件3 ... 追加文件N

例如:
    tar -uf 111.tar 789.log

image-20241105233537412


3-1-4.解包

将打包的文件进行解包

参数:
    -x 解包
    -f 指定包文件

使用:
    tar -xf 包文件

例如:
    tar -xf 111.tar 

image-20241105233746066


3-1-5.压缩文件

压缩后文件会变小

参数:
    -c 创建包
    -z 调用gize压缩
    -f 指定包文件名称

使用:
    tar -cxf 包名称 文件1 文件2 ... 文件N

例如:
    tar -cxf 111.tar.gz 123.log 456.log 789.log

image-20241105234319791


3-1-6.解压缩文件

对压缩文件进行解压

参数:
    -x 解压
    -z 调用解压gzip
    -f 指定压缩包文件名称

使用:
    tar -xzf 压缩名称

例如:
    tar -xzf 111.tar.gz 

image-20241105234524837


3-1-7.总结补充

打包: 
    是不会压缩包的大小,还是原来文件的大小总和
压缩:
    会压缩包的大小

打包/解包命令:
    tar -cf 包名 文件1 .. 文件N
    tar -xf 包名

压缩/解压命令:
    tar -czf 包名 文件1 .. 文件N
    tar -xzf 包名 文件1 .. 文件N

打包与压缩的文件区别如下图:

image-20241105235120781


3-2.zip压缩

解压时请使用file命令查看文件类型。

命令与参数:

zip 需要进行安装:
    yum install -y zip # 压缩
    yum install -y unzip # 解压缩

作用:
    兼容类unix与windows,可以压缩多个文件或目录

参数:
 -r 递归压缩(压缩文件夹),对文件夹以及内部子文件夹进行递归压缩
 -d 指定文件解压缩文件存储的目录

使用:
    zip 参数 压缩生成文件名称 被压缩文件1 ... 被压缩文件N
    unzip 压缩生成文件名称

3-2-1.压缩

压缩文件

使用:
    zip 参数 压缩生成文件名称 被压缩文件1 ... 被压缩文件N

例如:
    zip -r 111.zip 123.log 456.log test/

# 注意:
    如果需要压缩文件夹,那么需要添加-r参数,不然只会压缩文件不会压缩文件夹中的内容

image-20241106000005824


3-2-2.解压缩

使用:
    zip 参数 压缩生成文件名称

例如:
    unzip -d /tmp 111.zip 

image-20241106000532178


3-3.gzip压缩

命令与参数:

命令需要安装:
    yum install -y gizp
命令:
    gizp 参数 文件

参数:
    -d 解压缩,将gzip解压缩为归档文件

使用:
    gzip -d 文件(gzip类型) # 解压缩
    gzip 文件 # 压缩

3-3-1.压缩

使用:
    gzip 文件

例如:
    gizp 123.log

# 可以使用tar 先进行打包
    tar -cf 123.tar 
# 在使用gzip压缩
    gzip 123.tar 

image-20241106001114106


3-3-2.解压

参数:
    -d 指定解压的文件

使用:
    gzip -d 解压文件

例如:
    gzip -d 123.gz

image-20241106001403379


4.vim编辑器

作用:

  • 对文件进行编辑使用。
  • vim filename,打开filename文件进行编辑,如果没有这个文件,当编辑完成后保存就会创建这个文件。
  • 如果只输入 vim 就会启动一个空的缓冲区。

模式:

  1. 命令行模式,当使用vim打开文件时,就进入了命令行模式,输入快捷键指令,对文件进行编辑,如插入字符,复制,粘贴,删除等操作。
  2. 输入模式,可以对文件内容进行编辑。
  3. 底线模式,进行一些特殊操作,如文本信息的查找,替换,保存,退出等。

image-20230610001239234

注意:

  • vim时需要进行安装的,yum install vim -y

4-1.命令模式

  • 当使用 vim 打开文件时,就会进行命令模式。

image-20241106230226324

指令:

1.使用"上下左右"键
    光标进行上下左右,可以使用键盘的上下左右按钮。
    h:左移。
    j:下移。
    k:上移。
    l:右移。
    b:选中特殊符号。
    
2.光标移动开头行与结尾行位置
    gg :光标到文件开头(第一行第一个字符)
    G:光标到文件结尾(最后一个第一个字符)
    : number :光标到达数字number指定行。
    number + G :光标到达数字number指定行。
    
3.光标移动"当前行"的开头与结尾
    0:数字0会将光标移动到"当前行"的第一个字符
    shift + 4:光标会移动到"当前行"的最后一个字符
    
    # 注意:光标需要再当前行的位置才生效。

4.复制
    yy :复制当前光标所在的行
    numbre yy:复制number数量的行(从光标的位置向下number行)
    
    p:将复制的行进行输出到光标所在的位置

5.剪切
    dd:对光标所在的行进行剪切
    number dd: 剪切number数量的行(从光标的位置向下number行)
    
    p:将剪切的进行输出到光标所在的行
    
    # 注意:如果不进行输出剪切的内容,那么等同于删除操作。

5.撤销操作
    u:对删除还是复制等操作进行撤销到上一步。

6.恢复撤销:
    ctrl + r :针对撤销操作进行恢复
    
7.删除
    x :小写x删除光标所在的字符。
    X :大写的X删除当前光标的行。
    
    dG : 从光标所在的位置向下,全部进行删除。

4-2.输入模式

指令:
    i:在光标位置编辑
    a:在光标的后一个字符开始编辑
    o:在光标的下一行进行编辑(重新开一行)

image-20241106233208227


4-3.底线模式

进入底线模式指令:
    esc + :(英文的冒号) 进入底线模式  
    : # 在vim显示当前状态就是底线模式
    
1.退出指令:
    1.:w :保存文件但不退出[如果文件不存在就会创建文件]
    2.:w 文件名:将当前文件内容写入到指定的'文件中'[如果文件不存在就会创建文件]
    3.:w!:强制保存,不退出
    4.:q:不保存文件,退出vim
    5.:q!:文件发生变化,强制退出vim
    6.:wq:保存文件并退
    7.:wq!:强制写入文件,并退出vim
    8.:e!:放弃当前所有修改,回到文件打开的原始状态
    9.!:强制执行操作

2.显示行号
    set number # 显示行号
    set nonumber # 关闭行号

3.显示语法高亮
    syntax no # 开启
    syntax off # 关闭

4.搜索关键字
    /搜索内容 # 进行搜索需要的内容后点击回车,会对搜索的词进行标记高亮。
    noh # 关闭搜索词高亮
    n:查找下一个匹配的项
    N:查找上一个匹配项

5.进入粘贴模式
    set paste + i:进入粘贴模式,可以保持粘贴的格式。
    set nopaste:退出粘贴模式。

6.替换语法
    # 注意:
        如果替换行的语法,光标必须在字符。
        
    6.1.替换当前行
        :s/原内容/替换的内容/ # 光标当前行才会替换,替换一次
        :s/原内容/替换的内容/g # 光标当前行才会替换,替换多次
    
    6.2.全文替换
        : %s/原内容/替换的内容/ # 全文替换,逐行匹配第一个替换,只替换第一个匹配的
        : %s/原内容/替换的内容/g # 全文替换,匹配全部的进行替换

image-20241106233243666


4-4.可视化模式

ctrl + v # 进入可视化模式

确定光标的位置 可以通过上下左右进行选中(以光标为基点覆盖的范围)

指令:
    y:复制,光标选中的范围。
    d:删除,光标选中的范围。
    p:粘贴,光标选中的范围。

操作:批量在选中的位置添加"#"号。
    1.进入可视化模式。
        ctrl + v 
    2.使用光标选中需要添加"#"号的范围行。
    3.此时按I(大写的i),就会进入编辑模式。
        I
    4.输出"#"号。
    5.按两次esc,即可将"#"输出到指定的光标选中的范围。

操作:批量删除"#"号
    1.进入可视化模式。
        ctrl + v 
    2.使用光标选中需要删除"#"号的范围行。
    3.此时按d即可删除。

image-20241106234624828


4-5.vim故障处理swp错误

出现原因:

  • swp错误:是linux为了保护文件中得数据出现的。
  • 你编辑文件时没有正常的保存退出,或者ssh链接终端等情况,简单来说就是没有正常退出vim导致的。

image-20241107000246423

注意:

  • 不要在异常状态下新添加内容,建议恢复后,在进行添加。因为恢复是恢复到出现异常状态前的文本内容,那在后面新添加的内容就在会恢复后消失。

解决方式:

提示的几种模式:
    [O]pen Read-Only: 只读
    (E)dit anyway: 继续编辑
    (R)ecover:修复
    (Q)uit :退出
    (A)bort :终止

# 当出现这种情况时,会在文件当前所做的目录下产生一个隐藏文件 xxx.swp 的文件。
    1.vim打开文件后进入 R 模式进行修复
    2.在将当前目录下, xxx.swp文件进行删除。

4-6.补充内容

1.不指定打开文件而进行vim保存
    # 场景:vim不打开指定的文件,而直接使用vim。
    
    wq /路径/文件名称 # 存储文件

2.vim打开多个文件操作
    vim /opt/123.log /opt/456.log ....
    
3.vim打开了一个文件,怎么打开第二个文件 # 打开多个文件
    :opt 第二个文件路径 # 打开第三个也是这样...

4.vim多文件切换
     ctrl + 6 # 切换文件,前提操作文件后保存后才能切换
     :bn # 切换打开的下一个文件
     :bp # 切换打开的上一个文件
     :ls # 显示使用vim打开了多少个文件
     :b n # n是数字 按照索引切换文件
    :vs # 垂直分屏显示,将文件分开两块显示,如果是多文件可以使用ctrl + 6 实现两块区域显示不同的文件
    :sp # 水平分屏显示,将文件分开两块显示,如果是多文件可以使用ctrl + 6 实现两块区域显示不同的文件

5.文件的inode与block

5-1.inode

inode是什么:

  1. 文件系统的核心,能是文件系统管理文件的属性和数据,不依赖文件名称,及时文件名称被修改不会影响内容和属性。
  2. 可以理解为数据库中的ID值,在一行数据中除了ID,其他的字段都可以变化。
  3. inode不仅仅是一个编号(数据库的ID),同时它也是数据结构,文件的元数据包含文件大小,权限等等数据。

inode理解:

  • 可以将它理解为一本书的章节名称,但是不会对内容记录,那么对内容在怎么修改不会影响到章节名称。

inode意义:

  • inode可以让linux支持硬链接,多个文件名称指向这个inode,共享相同的文件数据,提供了一种共享的机制。

inode关键点:

  1. 具有唯一性,相同的文件系统下不可能出现两个相同的inode,就如数据库的ID字段一样不会出现两个一模一样的ID,所以使用硬链接时,不能夸文件系统就是这个原因。
  2. inode不可变化,当被创建后,这个inode值不会变化,但是其他的元数据会变化。
  3. 数量是有限的,取决于文件系统的大小和inode占据的空间,这个数量由文件系统的inode与数据块的比例决定。当inode用尽时,即使磁盘上还有未使用的数据块。
  4. inode的声明周期是与文件系统相关联,如果文件系统卸载,那么inode也会被销毁。
  5. inode不仅仅是唯一标识符号,同时还包含元数据(文件权限,大小,创建时间,修改时间等等)。
  6. 每个文件都有一个inode,但是一个inode可以对应多个文件名(硬链接概念),多个文件可以指向同一个inode。
  7. inode的回收,当文件被删除,inode被系统回收标记可用状态(前提是没有硬链接指向,如果有就是硬链接数量-1),这个文件的元数据彻底删除。

怎么查看:

怎么查看文件的indoe:
    stat 文件/文件夹 # 进行查看

# 123.html文件的inode
[root@shell ~]# stat 123.html 
  File: ‘123.html’
  Size: 38        	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33575004    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-10-25 11:31:17.924621688 -0400
Modify: 2024-10-25 11:30:36.556851837 -0400
Change: 2024-11-04 09:56:27.517495623 -0500
Birth: -

每个字段对应的作用:
    File: '123.html' - 这是你正在查看的文件名。
    Size: 38 - 文件的大小,以字节为单位。
    Blocks: 8 - 文件占用的数据块数量。
    Inode: 33575094 - 这是文件的inode号,是文件系统中唯一标识该文件的编号。
    Links: 1 - 指向该inode的硬链接数量。普通文件通常有1个链接,除非有硬链接指向它。
    Access: (0644/-rw-r--r--) - 文件的访问权限。这里的权限表示文件所有者有读写权限,而组用户和其他用户只有读权限。
    Uid: (0/root) - 文件所有者的用户ID和用户名。
    Gid: (0/root) - 文件所有者的组ID和组名。
    Access: 2024-10-25 11:31:17.924621688 - 文件的最后访问时间。
    Modify: 2024-10-25 11:30:36.556851837 - 文件的最后修改时间。
    Change: 2024-11-04 09:56:27.517495623 - 文件状态的最后改变时间,通常是inode信息(如权限、所有者等)的最后修改时间。

image-20241107225856947


总结:

1.inode就是文件系统中文件/文件夹的元数据,非常简单的理解就是,类似于数据表的一行数据,记录了各种内容除了ID(inode号)不变其他都会变化。

2.inode是占据磁盘空间,这个空间是根据文件系统来定的,XFS文件系统中,inode的大小可以是512字节,EXT4文件系统中,inode的大小通常是128字节或256字节。占据这么多空间就是为了记录文件的inode数据(元数据)。

3.inode数量有限根据文件系统与磁盘大小进行计算而定,可以通过命令 "df -i "进行查看。

image-20241107230907946


5-2.block

block是什么:

  • 文件数据在磁盘中存储的物理最小单元,根据文件系统而定,创建文件或者文件夹时没有数据的情况下占据的最小空间。
  • 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
  • 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

image-20241107231523598


5-3.文件与文件夹的关系

# 目录是一个特殊的文件,目录保存的是当前目录下的文件名字
简单说,文件夹就是方便人类记忆文件存在哪、然后通过这个文件名吗,找到对应的文件inode号
inode号里记录了文件数据所处的block位置,最终访问到数据
可以理解为:
    文件夹(文件夹的block)中存储的文件信息,在根据文件信息中inode编号找到block中的数据
    
文件夹记录 -> 文件夹内的文件的inode号
↓
根据文件inode号找到block的数据

6.软连接与硬链接

6-1.软连接

使用:
    ln -s 源文件或目录 目录/文件

特点:
    1.软连接的文件inode信息,只记录源文件的路径
    2.删除软连接不会影响源文件。
    3.如果删除源文件,软连接无法使用,因为找不到源文件。
    

源文件 = 家
软连接 = 传送门
传送门可以直接传送到家,如果家没了,那么传送门就没有意义了,传送门消失,不影响你回家。

6-2.硬链接

使用:
    ln 源文件 目标文件夹/文件

特定:
    1.只能对文件做硬链接,不能垮文件系统。
    2.创建的硬链接的inode信息相同的,硬链接inode信息 = 源文件的inode信息 共享。
    3.删除一个硬链接,不影响源文件与其他的硬链接。
    4.可以用任意一个硬链接作为入口,操作文件
    5.硬链接为0时,文件也就被删除,inode号被回收。
    6.文件夹的硬链接,默认是2个,以及是2+(第一层子目录总数)=文件夹的硬链接数量

删除源数据,那么硬链接在本质上就变为了唯一路径也就变为源数据。只有在删除硬链接,那么数据才会真正的消失。
使用书本进行描述这个概念。
源数据 = (原书)
硬链接 = (原书分身)
无论哪个人来借来(分身还是原书)看,都是相同的内容。当归还这本书(无论是分身还是原书)(删除链接),那么就会立刻被销毁,但是书的内容不会消失,因为还有其他的分身存在,直到全部归还后才会消失(删除所有的链接),因为不在有分身指向这些内容。

Linux文件属性

文件属性有什么:

  1. 文件类型文件的权限。
  2. 文件的链接属(文件的硬链接)。
  3. 文件的属主属组。
  4. 文件的大小。
  5. 文件最后的修改时间。
  6. 文件的名称。

怎么查看文件属性:

  • 使用:ls -la 命令进行查看,-l列表形式展开详情,-a查看隐藏文件。

image-20241112224839047

1.文件类型和权限:
    -:表示这是一个普通文件。
    rw-r--r--:表示文件的权限。从左到右,第一组rw-表示文件所有者(owner)的权限,可以读(r)和写(w);第二组r--表示与文件所有者同组的用户(group)的权限,可以读;第三 组r--表示其他用户(others)的权限,也可以读。

2.链接数:
    1:表示这个文件有1个硬链接。硬链接是文件系统中指向文件数据的路径,一个文件至少有一个硬链接,即其文件名。

3.所有者和组:
    root root:第一个root表示文件的所有者是root用户,第二个root表示文件属于root组。

4.文件大小:
    12:表示文件的大小是12字节。

5.修改日期和时间:
    Nov 12 09:47:表示文件最后一次被修改的日期和时间是11月12日的09:47。

6.文件名:
    123.log:这是文件的名称。

第一个字符代表文件类型:

  1. [d]:文件夹
  2. [-] :文件
  3. [l]:软连接
  4. [b]:设备文件,提供存储的设备接口。
  5. [c]:串行端口设备,键盘鼠标等等(一次性读取设备)。
  6. 其他...

1.文件权限

权限说明:

  1. linux是多任务,多用户的系统,A用户 B用户 在一起使用linux系统时,对机器上的文件操作,权限是怎么样的。
  2. 为了保护数据的安全性。 在linux中,一切皆文件,我们要对文件进行读取,执行(脚本),权限就非常重要。

为什么用权限:

  1. 保护系统的数据,文件,进程。
  2. 权限限制,审计作用。
  3. 针对不同的员工,不同的员工职责,分工不同,权限设置不同。
  4. 对于外来的攻击进行防御。

权限的分类(用户的角色分类):

  1. 属主:user(创建者)
  2. 属组:group(属组)
  3. 其他:other(其他人)

文件权限说明:

[-] [rwx] [r-x] [r--]
 1    2     3     4

1:代表是文件为目录还是文件
2:属主的权限
3:属组的权限
4:其他用户的权限

image-20241112231103861


1-1.权限字母代表的作用

字符 文件 目录
r 可以查看文件 可以查看文件夹下的内容
w 可以编辑修改文件 可以创建删除文件夹下的文件
x 文件可以被系统执行 可以进入文件夹内

1-2.权限字母数字表示

权限 对应数字 意义
r 4 可读
w 2 可写
x 1 可执行
- 0 无权限0表示
比如:-  rwx  r-x  --- 对应的数字权限
    rwx:421 
    r-x:401 
    ---:000

计算:
    rwx = 4 + 2 + 1 = 7
    r-x = 4 + 0 + 1 = 5
    --- = 0 + 0 + 0 = 0
   
-  rwx  r-x  --- 最后总体计算后: 750

1-3.chmod修改权限位

作用:
    修改(目录和文件)的权限位,权限包含属主属组其他的权限(包括 user group other对应的权限)
    这个命令


命令:
    chmod


参数:
    -R 递归进行修改,如果相对目录下的全部文件修改使用这个参数


命令使用:
    chmod 参数 权限设置 文件/文件夹
    
    
说明:
    u:属主 user
    g:属组 group
    o:其他 other
    a:代表了 属组属主其他 user+group+other


方式1:使用+ -设置权限
    +:设置权限
    -:取消权限
    
    命令书写方式:
        chmod u+x 123.log # 属主设置执行权限
        chmod a+x 123.log # user+group+other设置了执行权限

        chmod u-x 123.log # 属主取消执行权限
        chmod a-x 123.log # user+group+other取消了执行权限

        chmod u+x,u+w,u+r 123.log  # 属主设置读写执行权限
        chmod u+rwx 123.log # 属主设置读写执行权限
    
    
方式2:使用数字代表设置权限
    r = 4
    w = 2
    x = 1
    # 以数字的方式代表权限位进行设置。
    书写方式:
        chmod 777 123.log # 对user+group+other设置读写执行执行权限

        第一个7:属主的权限数字总和rwx
        第二个7:属组的权限数字总和rwx
        第三个7:其他的权限数字总和rwx
  
  
# 无论是文件还是文件夹都可以使用chmod +- 或者 数字的方式对 属主属组其他进行权限设置。

image-20241112233648383


1-4.chgrp修改属组

作用:
    修改(文件/目录)属组,改变文件或者文件夹的属组

参数:
    -R 递归进行修改,如果相对目录下的全部文件修改使用这个参数

用法:
    chown 参数 新属组 文件/文件夹

使用:
    
    chgrp wkx 123.log # 将 123.log的属组 修改为 wkx组
    
    chgrp -R wkx test # 将test 文件夹属组 修改为 wkx组

image-20241112234417904


1-5.chown修改属主

作用:
    修改(目录/文件)属主,改变文件夹的属组

参数:
    -R 递归进行修改,如果相对目录下的全部文件修改使用这个参数

用法:
    chown 参数 新属主 文件/文件夹

使用:
    chown wkx 123.log # 将文件 123.log的属主修改 wkx组
    chown wkx:wkx 123.log # 将文件的属主与数组一起修改为 wkx
    chown -R wkx test # 将文件夹以及内部的内容属主修改为 wkx组

image-20241113221549852


2.文件特殊权限

有哪些:

  1. SUID
  2. SGID
  3. SBIT

SUID是什么,作用:

  1. 仅对二进制命令有用,仅在当前执行过程中才有效。
  2. 执行者对该命令具有 x 执行权限,执行者用于owner的权限。
  3. 当用户执行某条命令时,如果SUID权限,那么会以命令的属主进行执行。

SUID是什么,作用:

  1. 仅对二进制命令有效,用户对二进制命令具执行权限x。
  2. 执行者在执行命令时,会获取该程序的用户组支持。

SBIT是什么,作用:

  1. 仅仅对目录产生效果。
  2. 当用户对目录有 wx权限,即可有写入权限。
  3. 当用户在该命令下创建文件时,只有root和当前用户可以进行删除。

对照表

类别 suid sgid sticky
字符表示 S S T
出现位置 用户权限位x 用户组权限位x 其他用户权限位x
基本权限位有x s s t
数字表示法 4 2 1
八进制表示法 4000 2000 1000
生效对象 用户位 用户组 其他用户

说明:

特殊权限表示:

suid:修改user权限
使用s表示出现在user权限为x位置
x存在:s表示 rwsrwxrwx
x不存在:S表示 rwSrwxrwx
数字表示:4 # 如果要设置权限 4777 4放在最前面



suid:group
使用s表示出现在group权限为x位置
x存在:s表示 rwx rws rwx
x不存在:S表示 rwx rwS rwx
数字表示:2 # 如果要设置权限 2777 2放在最前面



suid:other
使用s表示出现在other权限为x位置
x存在:t表示 rwx rwx rwt
x不存在:T表示 rwx rwx rwT
数字表示:1 # 如果要设置权限 1777 1放在最前面

2-1.SUID

基本原理:
    1.suid通过s标识,存在与用户权限为的x权限对应位置
    2.如果某文件,用户权限本身就有x,那么设置的suid时,用小写的s标识,否者就是大写S
    3.给文件设置s权限对应的数字表示4,八进制4000
    4.suid同样可以使使用chmod命令进行修改,可以使用字符或者数字表示
    
作用:
    1.suid特殊权限仅适用于可执行文件
        二进制命令。
        比如:/usr/bin/passwd  或者 /usr/bin/mount
    2.文件设置suid权限的文件,那么当用户执行文件时,是以文件属主的身份执行这个文件的 # 可以理解为什么passwd命令普通用户也可以使用
    3.一旦文件执行完毕,身份也就消失
    

1.怎么设置SUID
     字母表示: u+s 设置suid
     数字表示: 4777 设置ugid # 4就代表suid
     
     chmod u+s  123 # 设置 suid
     chmod 4777 123 # 设置uid
     
     # 显示时,如果有x权限,那么x位置显示小s,如果没有x权限,x位置显示大写S
     
2.实际用法
    suid可以让普通用户,暂时拥有root权限,进行操作。
    比如命令:passwd命令具有suid特殊权限,将这个特殊权限取消
    chmod u-s /usr/bin/passwd 
    那么普通用户虽然能执行命令(因为other是允许 r-x),命令输入的到最后,无法将新密码写入到/etc/shadow(root权限才能写入)中报错
    

总结:
    SUID位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。
    如果属主是root的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。

    1. suid功能是针对二进制可执行命令设置的,不能用在shell脚本上。
    2. 用户权限位的x权限位置处,如果有s或S,表示该命令存在suid权限。
    3. suid的作用就是,让普通用户在执行设置了suid权限的命令时,可以拥有其(属主)的权限(一般默认是root)。
    4. 二进制命令,如系统提供的ls,mkdir等命令,都需要有x权限才可以操作。
    5. suid是一个危险的命令,对系统有一定威胁,一般依然是用sudo命令代替suid等特殊权限操作。
    6. 系统安全优化时,会尽量去除所有设置suid的命令。

image-20241113234929232


2-2.SGIU

原理:
    1.对二进制命令来说,sgid的功能与suid基本相同,只不过一个是设置属主的权限,一个是设置属组的权限,和9位基本rwx那个理解概念一样。
    2.suid是获取文件属主的权限,sgid获取属组的权限
    3.sgid主要用于文件夹的设置,某个目录设置sgid之后,在该命令中创建文件,都是以(目录属组的)权限为准,'而不属于创建该文件的用户权限',以组的权限为准,实现了一个共享的文件夹


作用:
    一般直接和文件夹结合使用,给文件夹设置sgid,等同于设置了一个共享的文件夹操作
    当对文件夹设置的sgui时,那么文件内也会拥有这个sgui权限。
    
设置:
    字母表示: g+s 设置sgid
    数字表示: 2777 设置sgid # 2就代表sgid
    
    chmod g+s test/
    chmod 2777 test/

总结:
    1.当无论是访问或者执行,都会以属组的权限进行操作文件二进制命令或者文件夹
    2.sgiu与suid的性质类似。
    3.最好的用法就是设置一个共享文件夹的,A组创建一个test文件夹,设置sgui权限,那么除了A组成员外,B组,C组也可以进行到文件中进行操作,操作时不在是按照其他(O)角色进行操作,而是按照属组的形式操作。

image-20241113235714154


2-3.SBIT(sticky)粘滞位特殊权限

原理:
    在一个权限为777的文件目录下,所有用户,可以进行rwx的操作,也就意味着,随时删除其他人的资料!!(很危险)
    
作用:
    1.当目录有了粘滞位特殊权限,这个目录除了root用户特殊以外,任何用户都只能删除、移动自己的创建的文件,而不能影响到其他人
    
    2.粘滞位(Sticky bit),又称作粘着位,linux下另一个特殊权限
sbit粘滞位,用的已经很少了,但是对于系统特殊文件夹/tmp来说,是整个系统所有用户的临时文件存放地,谁都有任意的权限,你会发现该目录的权限巨大。


比如:
    tmp文件就是这样的,当A用户创建文件,B用户不能根据/tmp的权限对A创建的文件进行删除

# linux 中得 tmp / 但是看到了一个特殊权限t
[root@yuchao-tx-server ~]# ll -d /tmp/
drwxrwxrwt. 8 root root 4096 3月  16 18:54 /tmp/


设置:
    字母表示: o+t 设置sbit
    数字表示: 1777 设置sbit # 1就代表sbit
    
    chmod o+t test/
    chmod 1777 test/

image-20241114000510798


3.隐藏属性权限

隐藏属性:

  • 除了 r w x 权限外,ext2、ext3、ext4等扩展文件系统设计。
  • 重要的属性就是可以设置其不可修改的特性,让文件属主也不可以进行修改。
  • 可以提升系统的安全性。

命令使用:

  1. 设置:chattr
  2. 查看:lsattr

注意:

  • 普通用户只能进行查看,不能进行设置,设置由root设置。

3-1.chattr命令

命令:
    chattr

参数:
    + 添加某个特殊参数
    - 删除某个特殊参数
    a 文件只能增加数据,不能删除,只有root才能设置
    i 类似于文件锁定,什么都不能干,只有root才能设置
    -R 递归更改目录属性

使用:
    chattr 参数 文件
    
例如:
    chattr +i 123.log # 123.log设置i特殊属性
    chattr -i 123.log # 取消123.log设置i特殊属性

image-20241113225901621


3-2.lsattr命令

命令:
    lsattr

参数:
    -a 显示隐藏文件殊扩展权限 (显示全部)
    -R 递归列出目录特殊扩展权限(查看目录内部)
    -d 列出目录本身的扩展权限 (显示文件夹内部)

使用:
    lsattr 参数 文件/文件夹

例如:
    lsattr -a test/ # 查看全部特殊权限记录
    lsattr -R test/ # 显示文件夹内部的特殊权限
    lsattr -d test/ # 显示具有特殊权限的

image-20241113230321115


5.文件默认权限:umask

umask是什么:

  • 目前用户在新建文件或者目录时的权限默认值。

umask作用:

  • 用来设置限制新文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行,并自动设置掩码改变默认值,新的权限将会把旧的覆盖。

注意:

  • root用户与普通用户的umask是不同,可以通过/etc/profile文件中进行查看区分。
  • 在与其他的用户(同一台服务器)进行分享文件或者文件夹,注意权限问题,需要适当的修改相应的权限。

4-1.怎么查看umask

命令:
    umask # 默认以数字形式显示权限设置分数
    
参数:
    -S 查看以符号显示文件与文件夹权限

umask 数值默认显示: 0022
umask 符号显示:u=rwx,g=rx,o=rx

[root@linux01 ~]# umask
0022
[root@linux01 ~]# umask -S
u=rwx,g=rx,o=rx

image-20241113222745629


4-2.umask计算

在/ect/profile配置关于umask部分已经定义:
    root umask值: 022
    普通用户 umask值: 002

文件权限的数字:
    r = 4
    w = 2
    x = 1

怎么进行计算(使用符号进行计算,如果使用数字计算容易出现问题):
    1.文件:文件的默认最大权限(rw-rw-rw-)不具有执行权限,rw-rw-rw- = 666
        root用户的文件权限:
            (rw-rw-rw-) - (----w--w-) = rw-r--r--
            
        普通用户的文件权限:
            (rw-rw-rw-) - (-------w-) = rw-rw-r--
    
    2.文件夹:文件夹默认最大权限(rwxrwxrwx),rwxrwxrwx = 777
        root用户的文件权限:
            (rwxrwxrwx) - (----w--w-) = rwxr-xr-x
            
        普通用户的文件权限:
            (rwxrwxrwx) - (-------w-) = rwxrwxr-x

image-20241113223754822


4.ACL访问限制

场景:

  • 开发组中有用户 a1 a2 a3 三个成员,他们有自己的私人文件和自己的主文件,但是他们需要再一个目录下进行工作。
# 假设工作的文件是 /srv/project 目录下
1.创建目录
    mkdir -p /srv/project

2.修改文件权限
    chmod 770 /srv/project # 只对 project 文件修改权限

3.将当前目录的属组修改为 project
    chgrp  project /src/project # 只对project修改属组

    [root@shell ~]# ls -ld /srv/project/
    drwxrwx---. 2 root project 6 Nov 17 09:28 /srv/project/


4.将a1 a2 a3用户添加到project组中
    gpasswd -a a1 project # 将a1添加到project组中
    gpasswd -a a3 project # 将a3添加到project组中
    gpasswd -a a2 project # 将a2添加到project组中

那么 a1 a2 a3 就可以project组员的身份进行操作/srv(属主属组都是root,但是other权限 r-x 是允许进入到 srv文件中,srv文件权限不会影响到内部的srv下文件或者文件夹的权限) 下project文件夹

image-20241117223535446

  • 当有一天,公司安排一个审查人员 b1 需要监督审查project文件下的项目的情况,只能查看,不可以修改,那么权限怎么实现?

    是直接将 b1 添加到 project 用户组?如果添加到用户组中,那么b1就会拥有project文件rwx权限,如果修改project文件权限rw-那么也可以,但是不是最优方案。

ACL是什么:

  • ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限。这个功能可以解决上述的问题,ACL只针对用户设置对文件的权限,不设置 user group other 三类权限,单独给用户设置独有的权限使用。

4-1.怎么检查与安装

1.检查是否支持ACL
    dmesg |grep ACL

2.如果没有命令就需要单独安装
    yum install -y acl

3.命令就2个
    getfacl
    setfacl

4-2.查看命令

命令:
    getfacl

参数:
    -p 不去除路径前面的/ # 这个参数加与不加都无所谓,因为在查询是如果是从 跟路径开始,那么就会存在提示,如果不想有提示就添加这个参数
    
使用:
    getfacl 参数 文件/文件夹

例如:
    getfacl /srv/project # 查看 project 的acl访问限制

image-20241117225918582


4-3.设置命令

命令:
    setfacl

参数:
    -m 设置acl权限,
        用户设置权限:则使用"u:用户名:权限"格式赋予;
        组设置权限:则使用"g:组名:权限" 格式赋予
     -x:删除acl权限
     -b:删除所有的acl权限
     -d:设置默认的acl权限
         只对目录生效,指目录中新建立的文件拥有此默认权限;
     -k:删除默认的acl权限
     -R:递归设置acl权限
         不加-R的话,生成新子目录后,权限不继承。
         指设定的 ACL 权限会对目录下的所有子文件生效

使用:
    setfacl 参数 文件/文件夹
    setfacl -m u:用户名:权限(rwx) -R 文件/文件夹 # 对用户单独设置
    setfacl -m g:用户组:权限(rwx) -R 文件/文件夹 # 对用户组设置
    
例如:
    1.对用户设置
        setfacl -m u:b1:rx -R /srv/project # 对用户b1单独设置project的rx权限
    
    2.对组设置
        setfacl -m g:g123:rx -R /srv/project # 对用户组g123单独设置project的rx权限
    
    3.删除acl
        setfacl -bR /srv/project # 删除acl权限

image-20241117230819411


Linux用户与用户组

用户是什么:

  1. 用户是指拥有特定权限和身份标识的账户。每个用户都有自己的用户ID(UID)、主目录和一组权限,这些权限决定了用户可以执行哪些操作。
  2. 用户管理是Linux系统管理的一个重要方面,确保了系统的安全性和多用户环境下的有效资源管理。
  3. 而每个用户都有三重身份,主,组,其他。

用户的三重身份解释:

  1. 属主:文件或者文件夹的主用户,也就是所有者。
  2. 属组:文件或者文件夹的属于的用户组。
  3. 其他:除了上述的两种方式外的,也就是不包含属主与属组中的。

image-20241112223452229


用户角色划分:

  1. 管理员用户(root):用于执行较高的权限任务,按照软件,修改系统参数等等。
  2. 普通用户:用户日常使用,可以限时敏感的部分访问。
  3. 虚拟用户:也被称为服务用户,不能进行登录,只能用于启动某项服务,比如:nginx安装后就会创建nginx的用户用来启动。

用户组:

  1. 通过用户组的号码(GID) 可以把多个用户加入同一个组中,从而方便为组中得用户统一规划指定任务。
  2. 每当创建一个新的用户,那么当前的用户就拥有一个单独的组(角色),只要在这个组内的其他成员就会拥有这个权限。
  3. 其实可以理解,方便管理,进行权限的划分,用户在不同组中,那么就可以使用不同组的权限,比如:A组有test_A文件权限,B组有test_B的权限,如果将C用户加入AB两个组,那么他就有这两个文件的权限。

用户组与用户关系:

  • 一个用户可以存在一个组中,组中只有一个用户,也可以将用户添加的其他的组中,也就说用户与用户组是1对多的关系。

用户与用户组之间关系解释:

  • 好比一个租房子,ABC三个人同时租了一套三室一庭的房子,那么ABC各一个房间,公用一个客厅,每一个人就是一个用户,房子就是一个用户组,房间就是用户的私人空间,而客厅就是三人的共用空间。

image-20241112223750251

用户登录过程:

  1. 先从/etc/passwd(管理账户的)找到你登录的账户,从中读取UID与GIU,账户主目录和bash。
  2. 在进行校对密码/etc/shadow(密码相关的),成功后就会进入shell管控阶段。

1.root用户

linux系统特性就是可以满足多用户,同时工作,因此linux具有较好系统安全性。
root用户时系统中得超级管理员用户,它拥有最高的系统所有权,能够管理系统中得各项功能,如:添加用户,删除用户,启停,开启关闭硬件设备,由于root用户的权利较大,一个错误就会导致系统崩坏。


uid:用户的身份证
gid:就是当前用户的组id
groups:当前用户的除了自己的组(创建用户时,在不指定用户组的情况下会将用户名作为一个单独的组设置)还是添加的其他的组

# 补充:
    系统中用户uid为1~999 linux在安装的服务程序都会创建的独立的用户使用的uid账户,安装程序使用
    普通用户的uid是由1000开始,有管理员创建(centos 7 ), 最大的值1000-60000的范围,可以在 /etc/login.defs 文件中查看 UID_MAX 但是也可以超出这个 UID_MAX 创建用户,默认是允许的。
    centos6创建的用户uid是500开始的

image-20241111221103373


2.用户配置文件路径

1.用户目录,创建的用户都在这里
    /etc/passwd 

2.用户密码目录,创建用户的密码存放位置
    /etc/shadow 

3.用户组目录,用户存储的目录
    /etc/group
    
4.用户组密码目录
    /etc/gshadow

5.用户初始化目录,当用户创建时,就会将当前目录下的全部的文件复制到新创建的用户目录下,并且将用户属主与用户组调整为与此根目录相同(不指定单独的用户组)。
    /etc/skel # 就是用户家目录下的模版

6.普通用户家目录,当用创建时,就在当前目录下创建一个以用户名为目录,用户的专属目录
    /home

7.管理员目录
    /root

8.密码策略,用户UID,GID范围,账户资源限制,密码验证,账户信息,安全设置。
    /etc/login.defs

# 注意:/etc/skel 非常重要
    假设不小心删除了家目录的文件,就可以拷贝当前目录下的全部文件到自己的家目录下,就会恢复,如下图的情况。
    怎么修复,需要通过管理员用户:
        cp -rf /etc/skel/. /home/wkx/

image-20241111222919360


3./etc/passwd文件解读

image-20241111223541637

字段名 解释 序号
用户名 对应UID,是用户登录系统的名字,系统中唯一不得重复 1
用户密码 存放在/etc/shadow文件中进行保护密码 2
用户UID 用户ID号,由一个整数表示 3
用户组GID 范围、最大值和UID一样,默认创建用户会创建用户组 4
用户说明 对此用户描述 5
用户家目录 用户登录后默认进去的家目录,一般是【/home/用户名】 6
shell解释器 当前登录用户使用的解释器。centos/redhat系统中,默认的都是bash。若是禁止此用户登录机器,改为/sbin/nologin即可 7

4./etc/shadow文件解读

image-20241115232308836

字段名 解释 序号
用户名 用户名称 1
密码 加密的密码根据/etc/login.defs设置的密码加密算法获取 2
最近密码修改日期 最近密码修改日期 3
密码不可被更改天数 密码不可被更改天数 4
密码需要重新更改天数 密码需要重新更改天数 5
密码需要更改期限前的警告天数 密码需要更改期限前的警告天数 6
密码过期后账户宽限时间 密码过期后账户宽限时间 7
账户失效日期 账户的失效日期 8

5./etc/group文件解读

image-20241115232040263

字段名 解释 序号
组名称 用户的组的名称 1
组密码 用户组设置的密码,x表示 2
GUI 组id 3
用户组支持的账户 支持的账户名称,当前组中包含的哪些用户 4

6.用户管理命令

4-1.用户创建

命令:
    useradd

参数:
    -g 指定用户组(不指定情况下会按照用户名创建一个用户组) # 可以是组名或则组id
    -G 添加额外用户用户(在原有基础上添加一个新的用户组) # 可以是组名或则组id
    -u 设置用户uid
    -c 设置用户的注释
    -s 指定用户的登录的bash解释(登录 /bin/bash 不登录/sbin/nologin)
    -M 不创建家目录(一般给某个服务创建用户时使用的)

# 注意:
    在创建用户时,是没有密码的,需要进行设置密码。

使用:
    useradd -g user w12 # 创建用户w12并且指定用户组
        创建用户w12
        -g user:指定用户user
        
    useradd -g gg -G user w13
        创建用户w13
        -g gg:指定用户组 gg 
        -G user:指定额外用户组 user
        
    useradd -u 10086 w15 
        创建w15用户指定 
        uid 10086:uid设置为10086
        
    useradd -c '这是一个测试用户不能登录,并且没有家目录' -s /bin/nologin -M w18
        创建w18用户
        -M :不创建家目录
        -s /bin/nologin:不设置登录解释器 
        -c:设置用户注释信息

image-20241115222909529


4-2.用户修改

命令:
    usermod

参数:
    -u 修改用户uid
    -c 修改注释
    -s 修改登录解释器
    -G 指定新用户组 # 可以是组名或则组id,如果额外用户组是1个情况下就会添加,如果额外用户组是两个就会修改最后一个为指定的用户组
    -g 指定用户主组 # 可以是组名或则组id
    -L 对用户加锁 # 不能登录
    -U 对用户解锁 # 可以登录

使用:
    usermod -g gg w11 
        修改原w11用户组
        -g gg:修改为 gg
        
    usermod -c '666666' w18
        修改原 w18的注释信息
        -c '666666':修改为 666666
        
    usermod -G user w11
        为w11添加额外组
        -G user:添加额外user组
    
    usermod -L w11
        为w11设置锁
        -L:加锁,用户无法登录。

image-20241115224207425


4-3.用户删除添加额外组

命令:
    gpasswd

参数:
    -d 删除用户的某个组
    -a 将用户添加到某个组中
    -r 删除组的密码

使用:
    gpasswd -d w11 wkx
        将用户 w11 从 wkx 用户组删除
        
    gpasswd -a w11 user
        将用户 w11 添加到 user 用户组

image-20241115225017535


4-4.修改密码

命令:
    passwd
    # 注意:
        1.使用root用户修改密码,是可以指定相应用户的(因为是管理员)。
        2.如果使用不是root,那么只能修改当前用户密码,不能指定用户。

参数:
    --stdin 非交互式修改密码
    echo 新密码 | passwd --stdin 用户名


命令2:kv形式的修改密码
    chpasswd

    echo 用户名:密码 | chpasswd


使用:
    echo  123123 | passwd --stdin w11
        这种方式可以进行批量创建用户同时设置密码。
        
    echo w11:123123 | chpasswd 
        明文修改密码

image-20241115225314501


4-5.删除用户

命令:
    userdel 

参数:
    -r 删除用户和响应的配置文件(包括家目录登录)
    -f 强制删除,那怕登录

使用:
    userdel -rf 用户名

# 注意:
    删除用户时,如果创建用户的组(在未指定组的情况下),其他用户也在用户的组中,那么这个组不会被删除
    如果用户没有家目录,那么当使用-r删除时,就会存在提醒。

image-20241115225931853


4-6.其他命令

1.id
    参数:
        -u 显示用户id
        -g 显示用户组id
        -un 显示用户名
        -gn 显示组名
    使用:
        id 参数 用户名

2.显示当前的登录中段信息
    who
    tty:虚拟终端代称(登录了虚拟终端vmware才会有,没有登录就没有)
    pts:ssh远程终端的代称(使用了多少个ssh链接服务器就会显示多少个,并且显示宣传链接ip)
    
3.打印当前登录用户
    whoami

4.显示系统登录用户信息,以及负载信息
    w
    
5.最新的终端登录信息
    last
    
6.显示哪些用户正在登录
    lastlog

4-7.用户切换

用户切换命令
    su - 用户信息
    su - 将用户的环境变量以及信息进行切换(相当于重新登录当前用户)
    su [不加-] 不会加载用户的环境变量,日志信息与其他的资源还是用的上一个切换用户的资源。

加 - :切换环境变量
不加 : 使用切换之前的用户的环境变量

4-8.用户密码失效

# 管理员设置完毕用户的密码后,也可以对用户设置密码失效

命令:
    chage

参数:
    -l 查看用户密码设定情况
    -d '格式:日期 yyyy-mm-dd' 修改上一次修改的日期,对应/etc/shadow 第三个字段(最后更改密码的日期)
    -E '格式:日期 yyyy-mm-dd' 修改账户失效日期(账户失效后无法使用) 对应/etc/shadow第八个字段
    -I '格式:天数 d' 对应/etc/shadow第七个字段 密码失效日期
    -m  '格式:天数 d' 对应/etc/shadow第四个字段 密码保留最小天数(在这个时间段内无法修改密码) 为零时代表任何时候都可以更改密码
    -M '格式:天数 d' 对应/etc/shadow第五个字段 密码多久需要修改(密码需要保留多久后提示修改)
    -w '格式:天数 d' 对应/etc/shadow第六个字段 用户密码到期前,提前收到警告信息的天数。

使用格式:
    chage 参数 用户名

例如:
    chage -l wkx # 查看密码的详细参数
    chage -d 0 wkx # 强制用户登录时修改密码
    chage -M 90 wkx # 设置用户密码过期 90天

image-20241117220408015


7.用户提权

7-1.命令

作用:
    提升普通用户的使用root命令权限

命令:
    sudo 

参数:
    -u 根据用户名常见文件

例如:
    sudo -u a1 touch /opt/123 # 就会根据a1用户在/opt文件下创建123文件,属主与属组都是 a1
    
使用普通用户提权
    sudo 命令 # 普通用户大部分都没有权限,就可以sudo命令进行提权(拥有root权限)。

7-2.用户怎么提权

用户提权操作:
    1.打开/ect/sudoers文件
        vim /etc/sudoers 或者 visudo
    2.添加一条提权信息
        # 需要提供密码
        用户名	   ALL=(ALL)	   ALL(代表可以使用的指令) # 就可以当这个用户使用sudo命令提权
        # 不需要输入密码
        用户名	   ALL=(ALL)	   NOPASSWD:ALL
        
    3.可以将用户添加到wheel组中
        %wheel	ALL=(ALL)	ALL # 利用默认的提权用户组进行操作
        
        passwd -a 用户 wheel # 将用户添加到wheel组
        
# 注意:
    如果不在/etc/sudoers文件中添加用户的信息无法使用sudo 如下图

image-20241117233309309


7-3.命令限制操作

ALL 代表的是全部的命令,但是并不想让用户拥有这个些命令怎么处理?

1.以root用户打开文件
    vim /etc/sudoers

2.修改某个用户,不让这个用户使用passwd命令
    wkx	   ALL=(root)	!/usr/bin/passwd
    # 解释:
        用户wkx可以以root权限执行任何命令,除了/usr/bin/passwd这个命令
        
# 注意:
    因为 passwd命令有 suid设置,就算不使用 sudo为前缀也可以修改密码,在测试时,可以使用其他命令测试
    大部分的命令几乎都带有other权限r-x,如果强制用户使用sudo就可以将这些命令的other权限设置为---

# 设置多条命令限制:
    wkx	   ALL=(root)	!/usr/bin/passwd,!/usr/bin/ls,!/usr/bin/pwd
    # 解释:
        用户wkx可以使用sudo提权到root权限执行任何命令,除了/usr/bin/passwd or /usr/bin/ls or /usr/bin/pwd 这个命令


# 别名方式设置命令限制语法:支持多个用户以及复杂的命令
    1.设置用户别名:
        User_Alias 用户别名 = 用户1,用户2,...,用户N
    
    2.设置命令别名:
        Cmnd_Alias 命令别名 =  /sbin/fdisk, /sbin/sfdisk, .....,/bin/umount
    
    3.使用:
        用户别名 ALL=(root) 命令别名

image-20241118000500826


8.组管理命令

8-1.组添加

命令:
    groupadd 

参数
    -g 自定义组id

使用:
    group 参数 组名

例如:
    groupadd -g 12345 www # 创建一个www组
    group www333 # 创建一个www33组

image-20241117221542180


8-2.组修改

命令:
    groupmod

参数:
    -g 修改组id
    -n 修改组名称

使用:
    groupmod 参数 组名

例如:
    groupmod -g 789456 www # 将www组id修改为 789456
    groupmod -n xxxx www # 将www组名修改为 xxxx

image-20241117221726762


8-3.组删除

命令:
    groupdel

参数:
    -f 强制删除组,及时它是用户的主组
# 注意:
     如果有任何一个群组的使用者在线上的话就不能移除该群组。 最好先移除使用者后再移除群组。
    
例如:
    groupdel xxxx # 删除xxxx组

8-4.用户额外组添加修改

命令:
    gpasswd

参数:
    -d 删除用户的某个组
    -a 将用户添加到某个组中
    -r 删除组的密码

使用:
    gpasswd -d w11 wkx
        将用户 w11 从 wkx 用户组删除
        
    gpasswd -a w11 user
        将用户 w11 添加到 user 用户组

9.特殊shell /sbin/nologin

/sbin/nologin 作用:
    是用户无法使用bash获取其他的shell来登录系统,并不是让这个账户无法使用其他的系统资源。比如:nginx安装后,就会创建一个nginx的账户用来管理启动nginx服务,但是这个账户是无法进行登录的。
    
如果想要让某个具有/sbin/nologin的用户知道,无法登录怎么办?
    1.在etc创建nologin.txt
        touch /etc/nologin.txt
        
    2.在当前文件中写入你想要提示的信息
        echo "无法登录" > /etc/nologin.txt
    
    3.使用su 切换测试查看
        su - wkx

image-20241118222457767


10.用户配置文件读取流程

image-20241119230859340


Linux的shell

shell是什么:

  • 理解为一个与操作系统交互的一款软件程序,通过bash这个shell提交指令到操作系统,操作系统负责沟通内核,内核就实际的操作电脑硬件。
  • 只要能够操作程序接口都能被称为shell,狭义来说shell就是命令方面的软件,bash也包含在内。广义来说shell包含图形界面软件,因为图形界面也能操作应用程序来调度内核工作的。

为什么学习shell:

  1. 因为命令行操作的shell都是一样的或者说是类似的,一法通,万法通。虽然有可视化的界面进行操作,但是也会有不同的图形化操作系统,操作上可能不太一样增加学习成本。
  2. 远程管理,命令行界面操作比较快。不容易出现断线或者是信息外漏的情况。

1.系统合法的shell

通过 /etc/shells 文件中可以查看到系统中有哪些版本shell

/bin/sh # 已经被bash替代
/bin/bash # linux默认使用的shell
/bin/ksh # kornshell 由 at&bell lab 发展出来的 兼容于bash
/bin/tcsh # 整合C shell,提供更多功能 
/bin/csh # 已经被tcsh替代 
/bin/zsh # 给予 ksh发展出来的,功能更为强大

其实各家的shell都是大差不差的,可能在某种语法上有些差异,但是本质上还是相同的,一般情况下使用的就是linux自带的 /bin/bash
在/etc/passwd 用户文件中默认使用登录的shell使用的就是 /bin/bash

特殊shell,这种特殊的shell不具备登录的功能作用于特定的场景下(启动某些程序,触发磁盘同步等等)
    /sbin/nologin
    /bin/sync
    ...

image-20241119215342814


2.bash shell具备的功能

  • bash shell 是linux默认的shell,一般情况下都是使用这个shell进行操作。

功能:

  1. 具有命令历史记录功能history命令,可以查看历史输入的命令记录最大记录1000条,这个些命令记录在用户家目录.bash_history文件内,如果linux被黑客攻破,那么你输入的历史命令就会在这里,如果有关于数据库方面的,那么就危险了。
  2. 命令与文件自动补全功能Tab补全。
  3. 命令别名设置使用alias命令设置命令别名,如果命令特别长,那么就可以使用别名进行操作。
  4. 作业控制,前台,后台(job control,foreground,background)
  5. 程序脚本

内置命令type:

作用:
    可以通过type命令知道,使用的命令是外置的还是bash自带的。

命令:
    type

使用:
    type 命令
    
例如:
    type cd # 显示是内置命令
    type hostname # 显示这个命令具体在哪个位置

image-20241119220518426

3.环境变量

1.env

作用:
    显示当前环境下的环境变量情况

命令:
    evn

解释:

[root@shell ~]# env
XDG_SESSION_ID=102 # 会话 ID,用于区分不同的用户会话。
HOSTNAME=shell # 主机名称
SELINUX_ROLE_REQUESTED= # 安全增强型 Linux (SELinux) 角色请求,用于安全策略。
TERM=xterm # 终端机使用的环境是什么类型
SHELL=/bin/bash # 使用的bash的路径
HISTSIZE=1000 # 记录历史命令的条数,默认是1000
SSH_CLIENT=192.168.85.1 55372 22 # SSH 连接使用的终端设备
SELINUX_USE_CURRENT_RANGE= # SELinux 当前范围的使用。
SSH_TTY=/dev/pts/0 # SSH 连接使用的终端设备
USER=root # 用户名称
LS_COLORS=rs=0:di=01;34:ln=01;..... # 颜色显示
MAIL=/var/spool/mail/root # mailbox的位置
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 环境变量
PWD=/root # 当前用户所在的目录
LANG=en_US.UTF-8 # 语言类型
SELINUX_LEVEL_REQUESTED= # SELinux的策略级别
HISTCONTROL=ignoredups # 历史记录控制,这里设置为 ignoredups,表示忽略重复的命令。
SHLVL=1 # shell 层级,表示当前 shell 的嵌套深度。如果是存在嵌套的bash,那么就会根据嵌套的bash增加
HOME=/root # 主目录文件
LOGNAME=root # 登录用户
SSH_CONNECTION=192.168.85.1 55372 192.168.85.132 22 # ssh链接情况
LESSOPEN=||/usr/bin/lesspipe.sh %s # less 命令的预处理程序,用于查看文件内容。
XDG_RUNTIME_DIR=/run/user/0 # 运行时目录,用于存储临时文件和进程间通信。
_=/usr/bin/env # 上一次执行命令的最后一个参数(或者命令本身)

2.set

作用:
    查看所有的变量(包含环境变量和自定义的变量)

使用:
    set

例如:
    set name=123 # 设置变量,如果变量存在就是修改变量

3.stty

命令:
    stty
作用:
    帮助设置终端机的输出按键代表含义
    
参数:
    -a 累出所有的stty的参数

例如:
    stty -a

[root@template ~]# stty -a
speed 38400 baud; rows 56; columns 241; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

解释:
    intr = ^C; 代表利用 ctrl + c来完成,中断正在执行的进程
    eof = ^D;  代表结束输入
    erase = ^?; 向后删除字符
    kill = ^U; 删除目前命令上的所有文字
    quit = ^\; 发送一个quit信号给正在执行的进程
    start = ^Q; 对停止进程重启
    stop = ^S; 停止屏幕输出
    susp = ^Z; 送出一个 terminal stop的信号给运行的进程
    
使用命令:
    stty erase ^h  # 将原来的  ctrl + ? 修改为 ctrl + h

image-20241119220518426


4.语言区域设置

作用:
    语言区域设置,也就类似与windows中对语言进行设置。

名称:
    locale

参数:
    -a 列出全部支持的语言

默认的文件位置,不同的发行版位置不同。
    /etc/locale.conf

怎么修改:
    1.打开/etc/locale.conf
    
    2.修改后保存,需要重启服务器才会生效。
        LANG="zh_CN.UTF-8" 修改为 LANG="en_US.UTF-8"
    
    # 或者直接修改LANG变量
         LANG="en_US.UTF-8"

不是参数输出内容如下:
LANG=zh_CN.UTF-8 # 默认的区域设置
LC_CTYPE="zh_CN.UTF-8" # 控制字符分类和处理,如字符宽度、字符类别(字母、数字等)
LC_NUMERIC="zh_CN.UTF-8" #  控制数字的格式,例如小数点和千位分隔符。
LC_TIME="zh_CN.UTF-8" # 控制日期和时间的显示格式。
LC_COLLATE="zh_CN.UTF-8" # 控制字符串的排序规则。
LC_MONETARY="zh_CN.UTF-8" # 控制货币的显示格式。
LC_MESSAGES="zh_CN.UTF-8" # 控制系统消息和应用程序消息的本地化。
LC_PAPER="zh_CN.UTF-8" #  控制纸张大小和方向的本地化。
LC_NAME="zh_CN.UTF-8" # 控制姓名的格式化。
LC_ADDRESS="zh_CN.UTF-8" # 控制地址的格式化。
LC_TELEPHONE="zh_CN.UTF-8" # 控制电话号码的格式化。
LC_MEASUREMENT="zh_CN.UTF-8" # 控制测量单位(如英制或公制)。
LC_IDENTIFICATION="zh_CN.UTF-8" #  控制软件包标识信息的本地化。
LC_ALL=  # 变量如果被设置,它将覆盖其他所有 locale 相关的环境变量。

image-20241119222556237


5.标准输出重定向

什么是数据流:

  • 在 Linux 中,一切皆文件(everything is a file),包括硬件设备、进程间通信管道、网络套接字等。文件数据流指的是从文件读取或写入数据的过程。例如,使用 cat 命令读取文件内容时,文件内容就是以数据流的形式被读取并输出到终端。

分类:

  1. 标准输入(stdin)代码是0,使用< 或者 <<
  2. 标准输出(stdout)代码是1,使用> 或者 >>
  3. 标准错误输出(stderr)代码2,使用 2> 或者 2>>

画图理解:

image-20241119224212760

标准输入:
    就是在终端进行输入的命令指令等等。

标准输入:
    相应的结果,比如pwd,返回就是当前所在目录文件路径

标准错误输出:
    命令输入错误,提示的错误信息。

1.标准输出重定向

数据流区分:
    标准输入代表:0 
    标准输出代表:1 
    标准错误输出代表:2	

把命令(可执行程序)的`标准输出`与`错误输出`(程序不可能百分百正确)重定向到指定的文件,这样输出就不会再终端上进行显示,而是到指定的文件中。
    
> 作用:覆盖写入
    语法:
        echo '6666' > 123.log
        
    使用 ">" 符号将标准输出重定向覆盖写入到文件中。形式:命令 > 文件 # 有几次都覆盖几次,永远是最后一次结果

>>作用:追加写入
    语法:
        echo '6666' >> 123.log
        
    使用 ">>" 符号将标准输出`重定向`追加写入到文件中。形式:命令 >> 文件

2>作用:错误覆盖写入
    语法:
        llll 2> 123.log
        
    使用 "2>" 符号将标准错误输入重定向到覆盖写入入文件中。形式:命令 2> 文件 # 命令报错,重定向到文件中,错误信息不会打印到终端中

2>>作用:错误追加写入
    语法:
        llll 2>> 123.log
        
    使用 "2>>" 符号将标准错误输入重定向到追加写入入文件中。形式:命令 2>> 文件 # 命令报错,重定向追加到文件中,错误信息不会打印到终端中
    
2>&1作用:错误变为正常
    语法:
        llll > 123.log 2>&1

    使用 "2>&1" 符号 简写: "&>", 将标准错误输入stderror重定向到标准输入stdout。# 2> 是将命令标准错误写入文件,而 &1 则是将 变为标准输出处理,2>&1 就是将标准错误输出当做标准输出处理


/dev/null作用:
    使用 "> /dev/null" 将执行的结果重定向到空设备中,不会显示任何文件信息。形式:命令 > /dev/null # /dev/null 空设备文件,可以理解为黑洞文件,ll > /dev/null 写入到黑洞文件中,不会输出内容,不会存储文件

6.组合热键

组合按键 执行结果
ctrl + c 终止目前的命令
ctrl + d 解释eof,例如邮件结束后
ctrl + m 回车键
ctrl + s 暂停屏幕输出(屏幕会被锁死,无法操作)
ctrl + q 恢复屏幕输出
ctrl + u 在提示符下,将这个命令删除
ctrl + z 暂停目前命令

7.文件通配符

符号 含义
* 代表0个和N个任意字符
代表一个任意字符
[] 代表包含[]的任意一个字符,例如[abcd]匹配的一定会带有这个些字符
[-] 存在减号,代表在编码顺序内的所有字符。例如[0-9],代表0到9之间的数字
[^] 如果括号中第一个字符为^,匹配除了这个些字符外的所有字符。[^p-z]它表示匹配 除了字母 p 到 z 之间的所有字母。
例如:
    ls -d /etc/cron* # 输出/etc下以cron开头的全部的文件以及文件夹
    ls -d /etc/??? # 输出/etc/刚是3个字符的文件或者文件夹
    ls -d /etc/*[0-9]* # 输出/etc下包含0-9数字的文件或者文件夹
    ls -d /etc/[^a-b]* # 输出开头不是 a-b非小写文件名称

8.特殊符号

符号 含义
# 通常代表注释,例如shell语法,或者python。
\ 转义符号,将特殊符号或者通配符,转换为没有含义的符号。
| 管道符号,A命令 | B命令 将A命令的执行结果给到B命令处理
; 连续命令执行分割符号,连续性命令的界定。与管道符号不同。A命令 ; B命令,执行完毕A,在执行B
~ 用户主文件夹
$ 变量前导符号,需要通过这个符号打印变量。
& 作业控制符号,将执行的命令放入后台执行
! 逻辑符号,代表not,非的意思。
/ 路径符号
>,>> 数据重定向符号,将数据导出
<,<< 数据重定向符号,将数据导入
’‘ 单引号,不具备特殊符号或者变量的置换作用,在单引号内,输入是什么就是什么。
"" 双引号,须有特殊符号与变量的置换作用
`` 可以执行命令,与$()功能相同
() 在中间为shell的其实与结束
{} 在中间为命令块组合