admin管理员组

文章数量:1558102

1.grep

  • grep过滤相当于一个筛子,可能筛子里面的东西是要保留的,也可能筛出来的是要保留的
  • grep [选项] 内容 文件:
    • grep root psj.txt表示从psj.txt中找出包含root字符串的内容并按行输出(默认按行输出)
    • grep -v root psj.txt表示从psj.txt中找出不包含root字符串的内容并按行输出
    • grep -i root psj.txt表示从psj.txt中找出包含root字符串(包含大写)的内容并按行输出
    • grep -E "root | redis" psj.txt表示从psj.txt中找出包含root和redis两个字符串的内容并按行输出,也可以直接使用egrep命令,就不需要加上-E参数
    • grep -o root psj.txt表示从psj.txt中只输出包含root字符串的内容

2.序列

  • touch file{1..10}表示创建名称为file1、file2…file10的文件
  • seq 1 5表示输出序列1到5

3.别名

  • 直接输入alias表示查看已有别名
  • alias net='cat/etc/sysconfig/network-scripts/ifcfg-eth0'表示将查看网卡命令设置别名net,以后直接输入net即可完成该功能
  • 别名除了提高效率,还可以防止误删数据,比如使用alias rm='echo "不要使用rm命令,用mv替换"',之后再次输入rm命令就会输出提示信息
  • 别名优先于命令,如何不使用别名:
    • 使用命令的全路径,先使用which命令查看需要执行的命令的全路径,再输入该全路径
    • 命令开头加反斜线
    • 取消别名:unlias ls

tips:

  • 如何使别名永久生效?
  • 在全局环境变量文件中配置:/etc/profile/etc/bashrc
  • 在用户环境变量文件中配置:~/.bash_profile~/.bashrc

4.重定向*

  • 标准输出重定向:
  • 使用 > 或者 1>,使用时会将文件清空
    • echo psj > psj.txt表示清空psj文件并把输出的psj输入到文件中
    • ls > psj.txt表示将执行ls命令输出的内容输入到文件中`
    • > psj.txt表示清空文件内容
  • 使用>>追加输出
  • 标准错误输出重定向:
    • 使用2>,使用时会将文件清空
      • lss 2> psj.txt表示当执行lss时会出错,将出错的信息储存到文件中。如果命令没错就正常执行命令
    • 使用2>>追加输出
  • 标准输入重定向:使用 < 或者 0<(<<表示追加输入)
    • tr "o" "r" < psj.txt表示将先将文件读出,再将其中的o字符替换为r字符

tips:

  • 同时用一个文件收集错误和正确的输出信息:lss psj &>> psj.txt,lss是一个错误的命令

5.排序和去重

  • 去重使用uniq,比如uniq psj.txt表示将文件中相邻的相同行去重,uniq -c psj.txt表示将文件中相邻的相同行去重且计数
  • 排序使用sort,比如sort psj.txt表示将文件中相同的行排到一起

tips:

  • sort命令并不会改变原来文件的内容,要将排序后的内容输出可以使用sort psj.txt >> psj1.txt

  • 如果直接使用sort psj.txt >> psj.txt会直接将文件内容清空

  • 统计文件中重复IP地址,并按重复次数从小到大排列:

    • sort -rn -t. -k4 psj.txt > psj1.txt:-r表示倒序,-n表示按数字排序,-t表示指定分隔符,-k表示指定列
  • uniq -c psj1.txt > psj2.txt,此时统计了重复次数,但是没有按重复次数大小排序

  • sort -rn psj2.txt > psj3.txt

10.0.0.1
10.0.0.1
10.0.0.2
10.0.0.67
10.0.0.67
10.0.0.67
10.0.0.2
10.0.0.1
10.0.0.1
10.0.0.2
10.0.0.7
10.0.0.7
10.0.0.8

6.管道

  • 单个的命令不能直接获取到想要的结果,还需要进一步处理,此时需要使用到管道
  • 管道针对的是数据流,即把数据内容输入到管道中
  • 将第5节中的题目要求使用管道:sort -rn -k4 -t. psj.txt | uniq -c | sort -rn > psj1.txt

7.文件属性

  • 输入ls -li后输出922388 drwxr-xr-x 2 root root 4096 Dec 25 10:13 flask

    • 9922388表示索引节点Inode

    • drwxr-xr-x中d表示文件类型,后面9个字符代表文件权限

    • 2表示硬链接数

    • root root分别表示用户和用户组

    • 4096表示文件大小(如果是目录的话代表的不是目录下所有文件大小,而是目录本身)

    • Dec 25 10:13表示创建该文件的时间

    • flask表示文件名称

  • 文件类型:

    • Window根据扩展名确定文件类型
    • Linux有扩展名,但是系统不根据扩展名确定类型,只是方便用户查看,file xxx查看文件类型
      • -表示普通文件
      • d表示目录文件
      • l表示软链接文件(快捷方式)。ln -s /etc/hosts /tmp/a.hosts表示创建目录/etc/hosts的快捷方式/tmp/a.hosts
      • c表示字符设备
      • b表示块设备,如磁盘
      • s表示socket文件,进程通信使用

8.查看命令

  • which查看二进制命令所在路径(从PATH环境变量路径中查找)
  • whereis查看文件及文件的帮助等路径,whereis -b相当于which
  • find*
    • 按名字查找:find / -name "hosts"表示查找根路径下名字为hosts的文件
    • 按类型查找:find / -type d表示查找根路径下类型为目录的文件
    • 按大小查找:find /root -size +1024k表示查找root目录下大小大于1024k的文件
    • 按修改时间查找:find /root -mtime -7表示查找root目录下最近7天修改的文件
    • 同时按多个条件查找:find / -type d -name "hosts"默认取交集,-a表示and,-o表示or
    • 取反查找:find /data ! -name "file"表示查找data目录下名字不为file的文件
    • 对查找的内容处理:find / -name "psj" -exec rm -rf {} \;表示将查找到的内容进行删除,\;表示命令结束,不加则无法执行该命令

tips:

  • echo $PATH输出/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin,其中冒号为分隔符,越在前面的路径越先查找
  • find按名字查找时是按完整名称查找的,不是查找包含该字符串的文件
  • !for表示执行最近执行的以for开头的命令

9.tar命令

  • 参数:
  • -z通过gzip指令处理备份文件
  • -c创建
  • -v显示过程
  • -f针对文件
  • -x解压
  • --exclude打包时排除某内容
  • -X打包时从文件中排除内容
  • -h备份的软链接指向的文件一起拷贝
  • 压缩语法:tar -zcf [打包后存放的路径/压缩包的名称.tar.gz] [需要打包的东西],比如将etc目录打包并压缩到opt目录下使用tar -zcvf /opt/etc.tar.gz /etc/
  • 解压语法:tar -zxf [压缩包所在路径] -C [解压到的路径],不加参数-z会自动判断压缩类型并以相同类型解压
  • 查看压缩包的内容:tar -tf [压缩包所在路径]
  • 排除文件并打包:tar -zcf ./tmp/github.tar.gz ./GithubActions/ --exclude=./GithubActions/app.py
  • 从文件中排除打包:tar -zcfX ./tmp/github.tar.gz exclude.txt ./GithubActions/表示exclude文件中的路径就不进行打包
  • 打包压缩软链接文件:假设要打包/etc/rc.local文件,使用tar -zcf ./tmp/rc.tar.gz /etc/rc.local可以打包压缩该文件,但是解压查看该文件是没有内容的,因为/etc/rc.local只是一个软链接,真实路径为/etc/rc.d/rc.local,相当于把一个快捷方式备份到U盘,在U盘中打开该备份肯定是没有内容的,所以要使用tar -zcfh ./tmp/rc.tar.gz /etc/rc.local表示将软链接对应的真实路径打包压缩

tips:

  • tar是用来备份的程序,不加参数-z就不会将备份文档压缩,只是将文件打包备份为一个文档。比如tar -cf /opt/etc.tar.gz /etc/只是将etc目录打包到opt目录下
  • 硬链接是通过索引节点进行的链接;软链接(符号链接)与硬链接不同,存放的内容是另一文件的路径名的指向,软链接就是一个普通文件
  • $()和反引号里面存放命令,可以作为路径或文件的一部分:
    • 打包压缩/etc目录且命名中包含日期,可以使用\tar -zcf /tmp/etc_$(date +%F).tar.gz /etc​
    • 找到/etc下扩展名为.conf的所有文件并打包压缩,可以使用tar zcf /tmp/bak $(find /etc/ -name "*.conf")。如果使用管道命令为find /etc/ -name "*.conf" | xargs tar zcf /tmp/bak,xargs相当于把前面输出的内容放到后面命令相应的参数位置上

10.Inode 和 Block

  • Inode即索引节点,它是磁盘上的一块存储空间:

    • 用于存储文件的属性信息(ls -l的信息都在里面)以及指向文件真正实体的位置信息(指针)

    • 文件的唯一标识,即使用ls -l输出信息的第一列

  • Centos7中一个Inode节点大小默认为256字节

  • 在磁盘格式化创建文件系统的时候产生的

  • 一个文件只能有一个Inode,但是多个文件可以有相同的Inode(即指向同一个文件但是文件名不同,这样的文件称为硬链接文件)

  • block也是磁盘上的一块存储空间:

    • 存储数据的实体部分
  • 默认大小一般为1,2,4K

  • 一个block只能被一个文件占有(假设一个block为4K,但是文件只有0.1K,剩下3.9K会被浪费),一个文件可能占用多个block

  • block是文件系统存储大小的基本单位,磁盘读数据按block为单位读取,每读取一个block就会消耗一次磁盘I/O

  • 访问文件原理:假设要访问/etc/psj.txt,步骤如下:

    • 访问/文件(目录也是文件),找到其对应的Inode

    • 通过Inode知道访问权限、用户和用户组信息

    • 满足访问权限就找/的block(内容即/目录下文件或目录的名字)

    • 找到/etc目录后,找其对应的Inode

  • 命令:

    • df -i :查看所有文件系统的Inode的信息
  • df -h:查看所有文件系统的block的信息

tips:

  • 买回来磁盘后的四个步骤:

    • 分区(相当于新房子打隔断)

    • 格式化(相当于装修),创建文件系统(组织和存储数据的一种机制,可以视为装修风格)

    • 挂载(开个门)

    • 使用

  • Linux文件系统:ext4和xfs;Windows文件系统:ntfs,fat32

  • 元数据为数据的数据信息,所以它是存放在Inode中

  • 磁盘满有两个情况:Inode满(小文件过多时会导致该情况)和block满,其中一个满了就会提示空间不够用


11.软链接和硬链接

  • 概念:
    • 硬链接:具有相同索引节点号,且指向同一个文件实体的文件互相称之为硬链接文件(相同文件不同名称)。比如..和上一级目录互为硬链接文件
    • 软链接:也称符号链接,相当于Window中的快捷方式。软链接文件实际上是一个特殊的文件,这个文件中包含软链接,指向源文件的位置信息内容
  • 创建链接:
    • 软链接:ln -s 原始文件 硬链接文件(目标文件不能事先存在)
    • 硬链接:ln 原始文件 硬链接文件(目标文件不能事先存在)
  • 特点:
    • 硬链接:
      • 用于备份,防止误删文件,需要把全部的硬链接删除,数据才会丢失
      • 本质是相同文件不同文件名
      • 只能针对文件,不能针对目录-
      • 硬链接文件就是普通文件
    • 软链接:
      • 读取数据原理:软链接文件通过自身的Inode读到软链接信息(软链接没有block,但是有指针),指向了原始文件,从而读到原始文件名,进一步读到原始文件的Inode,再通过该Inode读到原始文件的block
      • 源文件和软链接的Inode不一致
      • 编译安装的软件升级时会使用软链接,比如使用软链接/application/nginx指向/application/nginx-1.19.1,一旦nginx升级后版本变为/application/nginx-1.20.0,但是代码中使用的都是/application/nginx,所以可以重新创建相同名字的软链接指向新的路径
      • 删除源文件时,软链接文件依旧存在,但是无法访问指向源文件路径的内容
      • 软链接文件不仅可以针对文件,还可以针对目录
  • 区别(面试题):
    • 在Linux中,链接分为硬链接和软链接
    • 硬链接和源文件的Inode节点号相同,软链接不同
    • 默认不带参数时,ln创建的是硬链接,带-s参数时创建软链接
    • 不能对目录创建硬链接,但是可以对目录创建软链接
    • 软链接可以跨文件系统,硬链接不可以(可以理解为不能跨越磁盘)
    • 删除软/硬链接都对源文件没有影响。删除源文件对硬链接文件没影响,但是会导致软链接失效
    • 硬链接防止误删,软链接常用于软件升级

12.文件删除原理

  • i_nlink=0表示硬链接数为0,i_count=0表示进程引用计数为0

  • 通过rm删除文件时,实际减少的是文件的磁盘引用计数i_nlink数。当用户执行删除操作再执行ls或者其他文件管理命令将无法找到该文件,但是调用删除文件的进程依旧在执行,还能从文件中正确读/写内容?

    尽管i_nlink数减少甚至为0,但是文件对应的i_count数不为0,所以执行删除操作后并没有真正删除文件,还是会占用磁盘,当i_nlink和i_count都为0时才会被真正删除

  • 如果文件没有被调用(即i_count=0),且i_nlink数减少到0,是否还能找回文件?

    文件的i_nlink数减少实际上是将文件名到Inode的链接删除,并没有删除文件的实体block数据块,及时停止机器是可以找回数据的。此时如果写入新数据,该数据可能会被分配到被删除数据的block,文件就被真正回收

tips:

  • 当把文件删除后磁盘还在被占用的原因可能是服务进程依旧在运行,此时重启服务器可能有效

13.用户和用户组

  • 用户:

    • 用户分类:
      • 超级用户:系统管理员,用户名为root,家目录为/root,UID为0,登录shell为/bin/bash
      • 普通用户:具有写的权限,家目录为/home/用户名,UID由系统分配(centos7在1000-60000,可以自定义)。使用普通用户管理系统有以下两种方式:
        • 切换到root用户:su -psj
        • 不切换到root用户,使用root的权限:sudo useradd psj
      • 虚拟用户:多数情况下装系统就存在,无法登录,UID由系统分配(1-499),登录shell为/sbin/nologin
  • 用户组:类似于某个人的家庭、学校等组织

    • 用户和用户组映射:
      • 一对一:一个用户可以存在一个组中,也可以是组中唯一成员
      • 一对多:一个用户可以存在多个用户组中,该用户就具有了多个组的共同权限
      • 多对一:多个用户可以存在一个组中
      • 多对多:多个用户可以存在多个组中,且几个用户可以归属相同的组
    • 用户组的产生:
      • 创建用户时默认产生,如创建psj用户,默认生成psj组(用户和组同名且UID和GID相同)
      • 由root用户直接创建
  • 相关配置文件:

    • /etc/passwd:用户配置文件,存放用户各种属性(UID、GID、家目录、登录SHELL等),以其中一行root:x:0:0:root:/root:/bin/bash为例:

      rootx00root/root/bin/bash
      用户名称用户密码(为了安全显示为x)UIDGID用户说明用户家目录shell解释器
    • /etc/shadow:用户密码文件,存放密码和密码的属性(失效时间、修改时间等)

    • /etc/group:组文件,存放用户组及属性,以root:x:0:为例:

      rootx0
      用户组名称用户组密码(为了安全显示为x)GID加入该组的成员
    • /etc/default/useradd:创建用户命令useradd的配置文件,比如为什么创建用户会从/etc/skel文件夹中复制文件是因为在该配置文件中预先设置了

    • /etc/skel:存放创建用户环境变量原始文件。每个用户的家目录都会有.bash_logout、.bash_profile、.bashrc,这是在创建用户时从该文件复制到用户家目录下的。如果修改了用户家目录后使用用户登录会出现~bash$是因为新的家目录没有上述文件

    • /etc/login.defs:创建用户的系统配置文件,比如创建用户是否要创建家目录、密码长度等

  • 相关命令:

    • useradd psj:添加用户,可以使用id psj查看,主要参数有-u、-g、-e、-d、-M、-s
    • usermod -u 10000 psj:修改用户属性,该命令为修改UID
    • userdel -r psj:删除用户,加上-r后把家目录也一起删除
    • passwd psj:给用户设置密码。给多个用户批量设置密码为echo 123456 | passwd --stdin psj psw
    • chapsswd:从文件中读出用户名和密码进行批量设置,比如user.list文件的内容为psj:123456使用cat user.list | chapsswd完成密码设置
    • chage:查看和更改密码属性
    • groupadd psj:添加名为psj的用户组
    • groupdel psj:删除名为psj的用户组
    • su - psj:切换到用户psj,并且环境变量也随着用户的切换做出改变,比如没有加上参数-则切换用户后家目录还是原来的/root
    • sudo useradd psj:使用su - root的前提是要知道root的密码,并且切换后就拥有了root所有权限。而sudo不需要切换到root可拥有root权限,操作完成权限就消失且不需要root密码
    • lastlog:查看用户登录日志
    • chown 用户:用户组 文件:更改文件的用户和用户组

tips:

  • 为什么虚拟用户无法登录还要存在?因为linux中文件创建、进程启动如果要存在就必须要有相应的用户和组,虚拟用户存在就可以满足这些操作对用户和组的要求。普通用户登录也可满足,但是为了安全选择虚拟用户即可(最小化原则)
  • 最小化原则:
    • 安装软件最小化
    • 登录安全最小化
    • 进程启动权限最小化
    • 权限最小化
  • 快速备份文件:cp /psj.txt{,.bak}等价于cp /psj.txt /psj.txt.bak

14.系统权限-基本权限位

  • 在第7节文件属性中提到rwxr-xr-x代表文件的权限,其中每三位为一组:

    • 用户位:前三位,如上面的rwx,表示文件所属用户可以对文件的操作权限
    • 用户组位:中间三位,如上面的r-x,表示文件所属用户的所属组可以对文件的操作权限
    • 其他用户位:后三位,如上面的r-x,表示除了文件所属用户和该用户所属组的其他用户可以对文件的操作权限
  • 符号含义:

    • r:表示可读,在三位中的第一位,使用数字4表示(即二进制位100)
    • w:表示可写,在三位中的第二位,使用数字2表示(即二进制位010)
    • x:表示可执行,在三位中的第三位,使用数字1表示(即二进制位001)
    • -:表示没有权限,三个位置都可以放置,使用数字0表示(即二进制位000)
  • 注意事项:

    • 针对文件:
      • r:可以读取文件内容(block中)
      • w:可以增/删/改文件内容(block中)
      • x:可以执行文件
        • 文件本身要可以执行
        • 如果是普通用户,还需要具备可读权限才能执行文件
        • 如果是root用户不需要可读权限即可执行
    • 针对目录:
      • r:可以浏览目录下的文件及子目录名的权限
      • w:具有增/删/改目录内文件的权限,但是需要x权限,否则无法删除或创建文件
      • x:具有进入目录的权限
  • 权限设置:

    • 数字权限设置:chmod 数字权限 文件,比如修改psj.txt的所有权限为rwx,即执行chmod 777 psj.txt(7为二进制111的转换),chmod -R 数字权限 目录可以对目录中的所有文件设置权限

    • 字母权限设置:

      • 操作字符:
        • +:添加权限
        • -:取消权限
        • =:取消其他所有权限,然后赋予给定的权限
      • 用户类型:
        • u:代表用户的三位权限
        • g:代表用户组的三位权限
        • o:代表其他用户的三位权限
        • a:同时代表ugo
      [root@VM-0-17-centos ~]# chmod u-r test.sh 
      [root@VM-0-17-centos ~]# ls -l test.sh 
      --wxrwxrwx 1 root root 244 Feb  9 15:40 test.sh
      [root@VM-0-17-centos ~]# chmod g=--- test.sh 
      [root@VM-0-17-centos ~]# ls -l test.sh 
      --wx---rwx 1 root root 244 Feb  9 15:40 test.sh
      [root@VM-0-17-centos ~]# chmod u+r,g=r test.sh 
      [root@VM-0-17-centos ~]# ls -l test.sh 
      -rwxr--rwx 1 root root 244 Feb  9 15:40 test.sh
      [root@VM-0-17-centos ~]# chmod -x test.sh 
      [root@VM-0-17-centos ~]# ls -l test.sh 
      -rw-r--rw- 1 root root 244 Feb  9 15:40 test.sh
      [root@VM-0-17-centos ~]# chmod +x test.sh // 给三个部分都加上x权限
      [root@VM-0-17-centos ~]# ls -l test.sh 
      -rwxr-xrwx 1 root root 244 Feb  9 15:40 test.sh
      

tips:

  • 能否删除文件本身和文件本身拥有什么属性无关,假设有文件/root/psj.txt(该文件具有所有基本权限rwx),但是能否执行rm -rf psj.txt删除文件和文件具有什么权限是没有关系的:
    • /root的block中存储的是该目录下的存储文件的文件名,而psj.txt的block中存储的是该文件的内容
    • 文件的执行权限针对的是当前文件block内容的操作权限,而删除文件相当于删除/root的block的内容,不是删除psj.txt的block中的内容,所以看的是文件所在目录的执行权限不是文件本身的执行权限,即如果root目录有w权限才可删除文件
  • dircd命令需要目录有x的权限,没有就无法切换到指定目录中
  • 为什么创建文件后默认权限为664,目录默认为755?这是由umask决定的,输入umask命令后可以看到其默认值为022
    • 文件的默认权限计算公式为666-022=644。假设umask改为021,文件权限计算为666-021=645,此时检查是否有奇数,5为奇数需要加1,最终的权限值为646
    • 目录的默认权限计算公式为777-022=755(计算后存在奇数计算方式也不会改变)
    • 普通用户和root用户的默认umask值不一样

15.系统权限-特殊权限位

  • suid(setuid)

    • 设置:通过S字符标识,存在于用户权限位的x权限位置(如果用户权限位上有x权限,就用小写s标识)
    [root@VM-0-17-centos ~]# ll test.sh 
    -rwxr-xrwx 1 root root 59 Feb 16 17:14 test.sh
    [root@VM-0-17-centos ~]# chmod u+s test.sh 
    [root@VM-0-17-centos ~]# ll test.sh 
    -rwsr-xrwx 1 root root 59 Feb 16 17:14 test.sh  # 在别的组添加该权限无效
    
    • 作用:绕过基本权限的限制,进而修改没有权限修改的文件
    # 作为一个普通用户可以使用passwd命令修改密码,密码的变动是在shadow文件中,但是该文件所属用户为root,普通用户作为其他用户对于该文件的权限为---,为什么不切换到root用户依旧可以修改密码?
    [root@VM-0-17-centos ~]# ll /etc/shadow
    ---------- 1 root root 658 Feb  9 15:24 /etc/shadow  
    # 在/usr/bin/passwd这个二进制的命令所属用户为root,但是在用户组权限有s标识,意味着所有使用该命令的用户可以拥有本命令所属用户(即root)的权限
    [root@VM-0-17-centos ~]# ll `which passwd`
    -rwsr-xr-x 1 root root 27856 Apr  1  2020 /usr/bin/passwd
    
    • 注意:

      • suid对应的权限和身份只在程序和命令执行过程中有效

      • 二进制命令和程序需要有执行权限x

      • suid是针对二进制命令或程序的,不能在shell等脚本上使用

  • sgid(setgroupid):和suid基本相同,但存在一定区别

    • suid区别:

      • sgid既可以针对文件(二进制命令和程序),也可以针对目录设置
    • suid是获得命令所属用户的身份和权限,sgid是获得命令所属用户组的身份和权限

  • sbit(sticky Bit)

    • 作用:把一个文件夹的权限全部打开,并且除了文件夹所属目录的宿主和root用户有权限删除该文件夹,其他用户无法删除
    • 设置:通过T字符标识

本文标签: 属性操作文件Linux