首页 文章 精选 留言 我的

精选列表

搜索[集群],共10000篇文章
优秀的个人博客,低调大师

Linux云计算集群架构师->第十一章 重定向和文件的查找

# 第十一章 重定向和文件的查找 (上课时间2021-07-01,笔记整理时间2021-07-04) 本节所讲内容: **11.1 文件描述符 0、1、2** **11.2 重定向的含义-管道的使用-tee 命令** **11.3 which-whereis-locate-grep-find 查找命令** **11.4 命令判断** LINUX 下一切皆文件 文件又可分为:普通文件、目录文件、链接文件、设备文件 LINUX 系统使用文件来描述各种硬件设备资源,如:/dev/sda /dev/sdb /dev/sr0 ## 11.1 文件描述符 用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器) | Number | Channel name | Description | Default connection | Usage | | ------ | ------------ | -------------- | ------------------ | ----------------- | | 0 | stdin | Standard input | keyboard | read only | | 1 | stdout | Standard input | Terminal | Write only | | 2 | stderr | Standard error | Terminal | Write only | | 3+ | filename | Other files | none | read and/or Write | ### 11.1.1 输入输出标准说明 STDIN 标准输入 默认的设备是键盘 文件编号为:0 STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件 STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件 ![image-20210703192904491](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210703192904491.png) 查看一个进程打开了哪些文件? 语法: ll /proc/进程 ID/fd ```sh [root@Centos83 ~]# ps -aux | grep vim root 18728 0.1 0.8 49588 8484 pts/1 S+ 19:37 0:00 vim /etc/shadow root 18738 0.0 0.1 12344 1072 pts/0 S+ 19:37 0:00 grep --color=auto vim [root@Centos83 ~]# ll /proc/18728/fd #查看打开的文件 总用量 0 lrwx------ 1 root root 64 7月 3 19:37 0 -> /dev/pts/1 #0 文件描述符 lrwx------ 1 root root 64 7月 3 19:37 1 -> /dev/pts/1 #1 文件描述符 lrwx------ 1 root root 64 7月 3 19:37 2 -> /dev/pts/1 #2 文件描述符 lr-x------ 1 root root 64 7月 3 19:37 3 -> /var/lib/sss/mc/passwd lrwx------ 1 root root 64 7月 3 19:37 4 -> 'socket:[197579]' ``` 注: 这些 0,1,2,4 就是文件的描述符。一个进程启动时,都会打开 3 个文件:标准输入、标准输出和标准出错处理。 这 3 个文件分别对应文件描述符为 0、1 和 2 也就是宏替换 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO。 /proc/进程 ID/fd #这个 fd 目录下,专门存文件描述符 注:对文件描述符的操作就是对文件本身的操作。 我可以直接通过操作文件描述来修改文件。 例 2:查看和临时设置一个进程最多可以打开几个文件,即:一个进程可以打开的文件描述符限制 ```sh [root@Centos83 ~]# ulimit -n # 查看一个进程最多可以同时打开的文件数 1024 [root@Centos83 ~]# ulimit -n 2048 # 修改一个进程最多可以同时打开的文件数为 2048 [root@Centos83 ~]# ulimit -n 2048 ``` ## 11.2 重定向的含义-管道的使用-tee 命令 ### 11.2.1 输出重定向 定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上重定向输出使用”>” “>>” 操作符号 语法: > 文件名 #表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件中的内容 >> 文件名 #表示将标准输出的内容,追加到后面的文件中。若重定向的输出的文件不存在,则会新建该文件 查看当前主机的 CPU 的类型保存到 cpu.txt 文件中(而不是直接显示到屏幕上) ```sh [root@Centos83 ~]# cat /proc/cpuinfo > cpu.txt #将内核的版本信息追加到 cpu.txt [root@Centos83 ~]# uname -a >> cpu.txt #将计算机名和操作系统的信息追加到cpu.txt [root@Centos83 ~]# cat cpu.txt [root@Centos83 ~]# uname -a > cpu.txt #清空cpu.txt 将uname 信息写入到cpu.txt ``` ### 11.2.2 输入重定向 将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入 ```sh [root@Centos83 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@Centos83 ~]# grep root < /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ``` ### 11.2.3 EOF EOF 本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“< eof.txt < abc > def > ghi > 123 > 345 > 789 > 1011 > EOF #只输入红色文字部分,>为 EOF 的交互输入提示符。 [root@Centos83 ~]# cat eof.txt ``` **以 abc 作为分界符** ```sh [root@Centos83 ~]# cat abc.txt < eof > EOF > abc ``` 在脚本中我们可以通过重定向输入来打印消息菜单 在使用的时候需要在”<< “右边跟一对终止符。终止符是可以自定义 ```sh [root@Centos83 ~]# vim eof.sh #!/bin/bash cat < 2 指的是标准错误输出的文件描述符 在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于 shell 脚本还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁 例 1: 将错误显示的内容和正确显示的内容分开 ```sh [root@Centos83 ~]# ls /etc/passwc 2> err.txt #将错误的结果输入到err.txt [root@Centos83 ~]# cat err.txt ``` 注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符 ### 11.2.5 null 黑洞和 zero 空文件 1、把/dev/null 看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null 对命令行和脚本都非常的有用. ```sh [root@Centos83 ~]# echo test > /dev/null [root@Centos83 ~]# cat /dev/null #什么信息也看不到 ``` 2、/dev/zero 在类 UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。典型用法是用它来产生一个特定大小的空白文件。 使用 dd 命令产生一个 50M 的文件 参数: if 代表输入文件。如果不指定 if,默认就会从 stdin 中读取输入。 of 代表输出文件。如果不指定 of,默认就会将 stdout 作为默认输出。 bs 代表字节为单位的块大小。 count 代表被复制的块数。 ```sh [root@Centos83 ~]# dd if=/dev/zero of=zero.txt bs=2M count=100 记录了100+0 的读入记录了100+0 的写出209715200 bytes (210 MB, 200 MiB) copied, 0.29557 s, 710 MB/s [root@Centos83 ~]# du -sh zero.txt 200M zero.txt [root@Centos83 ~]# cat zero.txt #什么也不显示 ``` 正确的内容写入一个文件,错误的写入一个文件 ```sh [root@Centos83 ~]# ls /tmp abcd >ok.txt 2>err.txt ``` ### 11.2.6 >&符号 &表示等同于的意思 例 1:把正确和错误的消息输入到相同的位置 1>&2 把标准输出重定向到标准错误 2>&1 把标准错误重定向到标准输出,如图: ![image-20210703202746484](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210703202746484.png) 例 2:把正确和错误的消息输入到相同的位置 ![image-20210703203011968](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210703203011968.png) ```sh [root@Centos83 ~]# ls /tmp abcd >1.txt 2>&1 [root@Centos83 ~]# ls /tmp abcd 2>1.txt 2>&1 [root@Centos83 ~]# cat /etc/passwd abc > /dev/null 2>&1 #将标准输出和错误输出全部重定向到/dev/null 中,也就是将产生的所有信息丢弃. ``` ### 11.2.7 管道 | 的使用 语法:command-a | command-b | command-c | ...... ![image-20210703215106547](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210703215106547.png) 上图可以简单理解为:管道符左边命令的结果作为管道符右边命令的标准输入 注意: 1、管道命令只处理前一个命令正确输出,不处理错误输出 2、管道右边的命令,必须能够接收标准输入的数据流命令才行 3、管道符可以把两条命令连起来,它可以链接多个命令使用 ### 11.2.8 tee 命令 **功能:读取标准输入的数据,并将其内容输出成文件。** **语法:tee [-a][--help][--version][文件...]** **参数:** **-a, --append 内容追加到给定的文件而非覆盖** **--help 在线帮助** **tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件** ```sh [root@Centos83 ~]# df -h | tee disk.log # 将磁盘使用的信息写入文件 [root@Centos83 ~]# df -h | tee -a disk.log # 将文件系统使用的信息追加到文件 ``` ## 11.3 文件查找常用命令 ### 11.3.2 which-whereis-locate-grep find 命令使用 **查找文件一般有以下几个命令:** **which 查看可执行文件的位置** **whereis 查看可执行文件的位置及相关文件** **locate 配合数据库缓存,快速查看文件位置** **grep 过滤匹配,它是一个文件搜索工具** **find 查找相关文件** ```sh [root@Centos83 ~]# which cd/usr/bin/cd [root@Centos83 ~]# whereis cd cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz [root@Centos83 ~]# whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz ``` locate 命令和 find -name 功能差不多,是它的另外一种写法,但是这个要比 find 搜索快的多,因为 find 命令查找的是具体目录文件,而 locate 它搜索的是一个数据库 /var/lib/mlocate/mlocate.db,这个数据库中存有本地所有的文件信息;这个数据库是 Linux 自动创建并每天自动更新维护。相关的配置信息在/etc/updatedb.conf,查看定时任务信息在/etc/cron.daily/mlocate ```sh [root@Centos83 ~]# yum -y install mlocate [root@Centos83 ~]# touch /opt/xuegod.txt [root@Centos83 ~]# locate mygod.txt #发现找不到文件[root@Centos83 ~]# updatedb #如果对当天文件查找,需要手动更新数据库updatedb [root@Centos83 ~]# locate mygod /opt/mygod.txt/opt/mygod_dump1/var/test/mygod/var/test/mygod/abc ``` **grep 查找使用** **作用:过滤,它能够使用正则表达式来搜索文本,并把结果打印出来** **参数:** **-v 取反** **-i 忽略大小写** **^# 以#开头** **#$ 以#结尾** **^$ 空行** **-n 对过滤的内容加上行号** **| 或者的意思** ```sh [root@Centos83 ~]# ps -aux | grep sshd | grep -v greproot 1084 0.0 0.2 94436 2140 ? Ss 7月02 0:00 /usr/ [root@Centos83 ~]# cat /etc/passwd | grep ^a #以 a 开头 [root@Centos83 ~]# grep bash$ /etc/passwd #以 bash 结尾 [root@Centos83 ~]# grep "nologin\|root" /etc/passwd | wc -l #\ 表示转义符46 [root@Centos83 ~]# egrep "nologin|root" /etc/passwd | wc -l #查看包括 nologin 或 root 的行46 ``` **egrep 是 grep 加强版本** ### 11.3.3 find 命令使用 格式:find pathname -options [-print] 命令字 路径名称 选项 输出 参数: pathname: find 命令所查找的目录路径,不输入代表当前目录例如用 . 来表示当前目录,用 / 来表示系统根目录。 find 命令选项: -name 按照文件名查找文件。 “名称” -perm 按照文件权限来查找文件。666 777 等 -user 按照文件属主来查找文件 -group 按照文件所属的组来查找文件 -mtime -n / +n 按照文件的更改时间来查找文件, - n 表示文件更改时间距现在 n 天以内 + n表示文件更改时间距现在 n 天以前 + -type 查找某一类型的文件 + b - 块设备文件 + d - 目录 + c - 字符设备文件 + p - 管道文件 + l- 符号链接文件 + f - 普通文件 -size n 查找符合指定的文件大小的文件 -exec 对匹配的文件执行该参数所给出的其他 linux 命令, 相应命令的形式为' 命令 {} \;,注意{ }和 \;之间的空格,{}代表查到的内容 ```sh [root@Centos83 ~]# find . -name "*.txt" #查看当前目录下所有的 TXT 格式的文件 ``` 2、按照更改时间或访问时间等查找文件 如果希望按照更改时间来查找文件,可以使用 mtime,atime 或 ctime 选项 mtime: 文件最后一次修改的时间 atime: 最后一次访问时间 ctime: 文件的最后一次变化时间,也就是修改时间 ```sh [root@Centos83 ~]# find /root/ -mtime -1 #查找更改时间在 1 天以内,被***修改的文件 ``` 对查找内容执行相应命令 -exec 这个选项参数后面可以跟自定义的 SHELL 命令,格式如下: ![image-20210704092047738](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210704092047738.png) ```sh [root@Centos83 ~]# find /root -name "*.txt" -exec cp {} /opt/ \; #把查找到的文件复制到一个指定的目录 ``` **xargs 和 find 命令结合 复制文件 -i 表示 find 传递给 xargs 的结果 由{}来代替** **查找多个类型文件** 比较符的使用: -a and 并且 -o or 或者 +超过 -低于 **按权限查找:-perm** ```sh [root@Centos83 ~]# find /bin/ -perm 755 # 等于 0755 权限的文件或目录 [root@Centos83 ~]# find /bin/ -perm -644 # -表示至少,至少有 644 权限的文件或目录 [root@Centos83 ~]# find /bin/ -perm -777 #至少有 777 权限 [root@Centos83 ~]# find / -type f -perm -777 #把系统中权限不低于 777 的危险文件查找出来 ``` 查找的目录深度: -maxdepth 1 #只查找目录第一层的文件和目录 查找/bin 目录下权限等于 644 的文件 ```sh [root@Centos83 ~]# find /bin/ -maxdepth 1 -perm 755 #/bin 后面要有/ [root@Centos83 ~]# find /bin -maxdepth 1 -perm 755 #没加/无法满足我们的需求 ``` ## 11.4 命令判断 ### 11.4.1 常用的三个特殊符号 1、 **;分号** 不考虑指令的相关性,连续执行, 分号; 不保证命令全部执行成功的 ```sh [root@Centos83 ~]# ofc ; echo aa ``` **&& 逻辑与**====》它是只有在前面的命令执行成功后,后面的命令才会去执行 如果/opt 目录存在,则在/opt 下面新建一个文件test.txt ``` [root@Centos83 ~]# cd /opt/ && touch /opt/test.txt && ls ``` 2、 **|| 逻辑或**===》如果前面的命令执行成功,后面的命令就不去执行了;或者如果前面的执行不成功,才会去执行后面的命令 ```sh [root@Centos83 mnt]# ls /etc/passwd || cd /etc/etc/passwd ``` 总结: 命令情况 说 明 命令 1 && 命令 2 如果命令 1 执行,且执行正确($? = 0),然后执行命令 2 如果命令 1 执行完成,但是执行错误($? ≠0),那么后面的命令是不会执行的 命令 1 || 命令 2如果命令 1 执行,且执行正确($? = 0),那么命令 2 不执行 如果命令 1 执行,但执行错误($? ≠ 0),那么命令 2 执行 运算顺序:LINUX 执行命令,是从左到右一个一个执行,从上到下执行 **总结:** **11.1 文件描述符 0、1、2** **11.2 重定向的含义-管道的使用-tee 命令** **11.3 which-whereis-locate-grep-find 查找命令** **11.4 命令判断**

优秀的个人博客,低调大师

Linux云计算集群架构师->第九章 文件的归档和压缩

# 第九章 文件的归档和压缩 (上课时间2021-06-26,笔记整理时间2021-07-2) **本节所讲内容:** **9.1 tar 命令进行文件的归档和压缩** **9.2 zip 管理压缩文件** **9.3 了解 gzip-bzip2- xz 管理压缩文件-file-sort 查看文件** ## 9.1 tar 命令进行文件的归档和压缩 ### 9.1.1 归档和压缩文件 **归档和压缩文件的好处:节约硬盘的资源 ,加快文件传输速率** **tar 命令 作用:打包、压缩文件** ![image-20210627132855636](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210627132855636.png) 这幅图的就是说 123456 这几个文件打包成了一个 a.tar 文件,但是这个 a.tar 还是很大,继续用gzip 进行压缩,变成了一个更小的压缩文件。 作用:打包、压缩文件;tar 文件是把几个文件和(或)目录集合在一个文件里,该存档文件可以通过使用 gzip、bzip2 或 xz 等压缩工具进行行压缩后传输 查看 man tar 这里 man 不是男人的意思,是 manual 手册的缩写 **用法:tar [OPTION...] [FILE]...** **参数:** **-c create 创建文件** **-x -extract [ˈekstrækt] 提取 解压还原文件** **-v --verbose 显示执行详细过程** **-f --file 指定备份文件** **-t --list 列出压缩包中包括哪些文件,不解包,查看包中的内容** **-C (大写)--directory 指定解压位置** ```sh [root@Centos83 ~]# tar -cvf grub.tar /boot/grub2/ # tar 的参数前可以不使用‘-’ [root@Centos83 ~]# tar cf grub.tar /boot/grub2/ tar: Removing leading `/' from member names ``` tar: 从成员名中删除开头的“/”(就是把/根路径删除掉了,就变成了 boot/grub2 相对路径了,解压时会解压到当前目录,如果不删除,那就是/boot/grub2,当解压的时候就是绝对路径了,就会覆盖系统中此路径的文件) ```sh [root@Centos83 ~]# tar -cf grub.tar /boot/grub2/ [root@Centos83 ~]# ls grub.tar [root@Centos83 ~]# tar xvf grub.tar #解压缩 boot/grub2/ boot/grub2/device.map [root@Centos83 ~]# ls boot/ #解压出来的boot目录 grub2 ``` **把两个目录或目录+文件打包成一个归档包:** ```sh [root@Centos83 ~]# mkdir ./back [root@Centos83 ~]# cp /etc/passwd ./back [root@Centos83 ~]# tar -cvf back.tar /boot/grub2/ root/back/ /etc/passwd tar: 从成员名中删除开头的“/” /boot/grub2/ /boot/grub2/device.map tar: 从硬连接目标中删除开头的“/” /boot/grub2/i386-pc/ /boot/grub2/i386-pc/gcry_md5.mod ``` **不解包,查看 tar 中的内容:** ```sh [root@Centos83 ~]# tar -tvf back.tar ``` **对比加 v 的效果**: ```sh [root@Centos83 ~]# tar -xvf back.tar [root@Centos83 ~]# tar -xf back.tar ``` ### 9.1.2 tar 归档+压缩 **语法:tar czvf newfile.tar.gz SOURCE** **语法:tar czvf 压缩后的文件名(tar.gz tar.bz2) 需要压缩的文件或目录** **常用参数:** **-z, --gzip 以 gzip 方式压缩 扩展名: tar.gz** **-j : 以 bz2 方式压缩的 扩展名:tar.bz2** **-J: 以 xz 方式压缩 扩展名:tar.xz** **创建.tar.gz 包** ```sh [root@Centos83 ~]# tar cvf /root/etc.tar /etc # 文件归档 [root@Centos83 ~]# tar zcvf /root/etc.tar.gz /etc # 文件压缩 [root@Centos83 ~]# du -sh /etc # etc源目录大小 30M /etc [root@Centos83 ~]# du -sh ./etc* # 压缩后文件大小对比 27M ./etc.tar 6.0M ./etc.tar.gz [root@Centos83 ~]# tar zxvf /root/etc.tar.gz #也可以用xf解压 ``` **创建.tar.bz2 包** ```sh [root@Centos83 ~]# tar -jcvf /root/etc.tar.bz2 /etc #创建bz2格式的压缩包 [root@Centos83 ~]# du -sh /root/etc* #压缩后文件大小对比 27M /root/etc.tar 4.4M /root/etc.tar.bz2 6.0M /root/etc.tar.gz [root@Centos83 ~]# tar -jxvf /root/etc.tar.bz2 #可以用-jxvf解压.bz2格式文件 [root@Centos83 ~]# tar -xvf /root/etc.tar.bz2 #也可以自动识别压缩格式并解压 ``` ```shell [root@Centos83 ~]# tar -jxvf /root/etc.tar.bz2 -C /opt/ #-C 可以指定解压路径 ``` **创建.tar.xz 包** ```sh [root@Centos83 ~]# tar -Jcvf /root/etc.tar.xz /etc #创建bz2格式的压缩包 [root@Centos83 ~]# du -sh /etc # etc源目录大小 30M /etc [root@Centos83 ~]# du -sh /root/etc* #压缩后文件大小对比 27M /root/etc.tar 4.4M /root/etc.tar.bz2 6.0M /root/etc.tar.gz 3.7M /root/etc.tar.xz #这个压缩比例最高,压缩的时间是最长 [root@Centos83 ~]# tar -Jxvf /root/etc.tar.xz #可以用-Jxvf解压.xz格式文件 [root@Centos83 ~]# tar -xvf /root/etc.tar.xz #也可以自动识别压缩格式并解压 ``` ## 9.2 zip 管理压缩文件 **zip 是压缩程序,unzip 是解压程序。** **压缩文件:** ```sh [root@Centos83 ~]# zip test.zip /etc/passwd #将/etc/passwd 创建test.zip压缩包 adding: etc/passwd (deflated 62%) [root@Centos83 ~]# ls *.zip test.zip [root@Centos83 ~]# touch {1..4}.png #创建1~4.png文件 [root@Centos83 ~]# ls *.png 1.png 2.png 3.png 4.png [root@Centos83 ~]# zip png.zip *.png #将所有.png文件压缩到png.zip adding: 1.png (stored 0%) adding: 2.png (stored 0%) adding: 3.png (stored 0%) adding: 4.png (stored 0%) [root@Centos83 ~]# zip -r ./grub.zip /boot/grub2/ [root@Centos83 ~]# ls *.zip grub.zip png.zip test.zip [root@Centos83 ~]# unzip ./grub.zip #解压zip文件 [root@Centos83 ~]# unzip ./grub.zip -d /opt/ #解压zip文件 -d 参数指定解压目录 ``` ## 9.3 了解gzip-bzip2- xz 管理压缩文件-file-sort 查看文件 Linux 中有gzip bzip2 xz 等单独的命令,linux 中一件事可能有很多种方法能实现,下面的几种方法,tar 都能做到,所以必须记住tar 的方法,其他方法了解下就可以。 我们创建压缩的TAR 存档,TAR 命令它支持三种不同的压缩方式。 **gzip 压缩速度最快;** **bzip2 压缩生成的文件比gzip 小,但使用不如gzip 快;** **xz 压缩工具相对较新,但是会提供最佳的压缩率(速度最慢)** ### 9.3.1 压缩工具 **压缩工具:gzip bzip2 zip xz** **常见的压缩格式: .gz .bz2 .xz .zip** 语法格式: 压缩 gzip 文件 -->> gzip a.txt -->> a.txt.gz bzip2 文件 -->> bzip2 b.txt -->> b.txt.bz2 xz 文件 -->> xz c.txt -->> c.txt.xz ```sh [root@Centos83 test]# ls test.txt [root@Centos83 test]# gzip test.gz test.txt gzip: test.gz: No such file or directory [root@Centos83 test]# ll #压缩完后源文件被删除掉了 总用量 4 -rw-r--r--. 1 root bin 29 6月 26 17:17 test.txt.gz ``` 注:只能对文件进行压缩,且压缩后源文件会消失,我们很少希望源文件会消失,所以我们一般不用(**了解**)。 bzip2,xz 这两个工具可以通过添加参数-k 来保留下源文件 解压: gzip -d 文件 bzip2 -d 文件 -k 保留源文件 xz -d 文件 -k 保留源文件 ```sh [root@Centos83 ~]# cd passwd [root@Centos83 passwd]# ls passwd shadow [root@Centos83 passwd]# bzip2 -k passwd shadow # 以bz2方式压缩 passwd 和 shadow 文件 [root@Centos83 passwd]# ls passwd passwd.bz2 shadow shadow.bz2 [root@Centos83 passwd]# xz -k passwd #以 xz 方式压缩 passwd 文件 [root@Centos83 passwd]# ls passwd passwd.bz2 passwd.xz shadow shadow.bz2 [root@Centos83 passwd]# bzip2 -d passwd.bz2 #解压 passwd.bz2 文件 [root@Centos83 passwd]# xz -d passwd.xz #解压 passwd.xz 文件 ``` ### 9.3.2 file 查看文件 **file 命令** **作用: file - determine file type #确定文件类型** **用法: file /etc/passwd** **注:linux 系统不根据后缀名识别文件类型** 用 file 命令查看文件的类型: ```sh [root@Centos83 ~]# vim music1.mp3 [root@Centos83 ~]# touch music2.mp3 [root@Centos83 ~]# file music1.mp3 music2.mp3 music1.mp3: ASCII text # ASCII码 (美国信息交换标准码) music2.mp3: empty # 空文件 [root@Centos83 ~]# file /dev/sda /dev/sda: block special (8/0) # 块特殊设备文件 [root@Centos83 ~]# file /etc/ /etc/: directory # 目录 [root@Centos83 ~]# file /dev/fd /dev/fd: symbolic link to /proc/self/fd # 符号链接 [root@Centos83 ~]# file /etc/passwd /etc/passwd: ASCII text # ASCII码 (美国信息交换标准码) ``` ```sh [root@Centos83 ~]# alias # 别名 alias ll='ls -l --color=auto' # ll = ls -l [root@Centos83 ~]# ls -l # -l 显示详细信息 [root@Centos83 ~]# ls -lt # -t 按时间排序 [root@Centos83 ~]# ls -r # -r 从小到大,不加 r 参数由大到小 [root@Centos83 ~]# ls -lSr # -l 显示详细信息 -S 按文件大小排序 -r 从小到大 [root@Centos83 ~]# ls -lSrh # -h 参数,看大小 ``` ```sh [root@Centos83 ~]# du -h /etc # –h 以人类可读的方式打印文件大小 [root@Centos83 ~]# du -sh /etc # 看某个目录大小 –s 只显示每个参数的总数 [root@Centos83 ~]# du -hd 1 /etc # -d 查看目录层及,0 级,1 级,2 级,3 级等 [root@Centos83 ~]# df -h # 可以快速查看磁盘大小的存储空间 [root@Centos83 ~]# lsblk # 查看磁盘及分区情况 ``` ### 9.3.4 排序:处理大量数据时会用到的命令 sort ```sh [root@Centos83 ~]# cat /etc/passwd | sort | more [root@Centos83 ~]# sort -n /etc/passwd #-n 默认从小到大(根据字符串数值比较) [root@Centos83 ~]# sort -r /etc/passwd #-r 反序排序(升序变成降序进行排序)从大到小 [root@Centos83 ~]# sort -nr /etc/passwd #-r 按字符串数值反序排序 从大到小 [root@Centos83 ~]# sort -t ":" -k3 -nr /etc/passwd | more #按:做分隔符,以第 3列,也就是用户 UID,按数值来从大到小排序 [root@Centos83 ~]# du /etc | sort -nr |more # 根据字符串大小反向排序 [root@Centos83 ~]# du -h /etc | sort -hr |more #把 etc 目录下所有文件,按由大到小排序 sort 其它参数: #-t 使用指定的分隔符 #-k 后面跟数字,指定按第几列进行排序 #-r 反序排序(升序变成降序进行排序)计算机编码排序 #-n 根据字符串数值比较排序 ``` **总结:** **9.1 tar 命令进行文件的归档和压缩** **9.2 zip 管理压缩文件** **9.3 了解 gzip-bzip2- xz 管理压缩文件-file-sort 查看文件**

优秀的个人博客,低调大师

Linux云计算集群架构师->第六章 Centos8 用户管理

# 第六章 Centos8 用户管理 (上课时间2021-6-21,笔记整理时间2021-06-25) **本节所讲内容:** **6.1 用户和组的相关配置文件** **6.2 管理用户和组** **6.3 实战:进入 centos8 紧急模式恢复 root 密码** ​ 用户一般来说是指系统的使用者,使用者可以使用这些名称来登录使用计算机,除了使用者之外,一些系统服务也需要含有部分特权的用户账户运行;因此出于安全考虑,用户管理应运而生,它加以明确限制各个用户账户的权限,root 在计算机中用拥有至高特权,所以一般只作管理用,非特权用户可以通过SU 或 SUDO 程序来临时获得特权。 ​ Linux 系统通过用户和用户组实现访问控制,包括对文件访问、设备使用的控制。 1 人可以拥有很多账户,只不是彼此名称不同,比如 root 名称已经占用就不能再用了,此外,任意用户可能从属某个用户组,此用户可以加入某些已经存在的组来获得该组的特权。 每 1 个文件的属性中都有一个文件拥有者和所属组。另外,还有三种类型的访问权限:读(read)、写(write)、运行(execute)。我们可以针对文件的属主、属组、而设置相应的访问权限。再次,我们可以通过 ll 或 stat 命令查询文件属主、属组和权限。 ```sh [root@Centos83 ~]# ll | tail -4 -rw-r--r--. 1 root root 2735 6月 20 15:36 a.txt -rw-r--r--. 1 root root 2742 6月 20 16:45 mini.txt -rw-------. 1 root root 4269 6月 20 15:45 sshd drwxr-xr-x. 2 root root 22 6月 20 17:08 test [root@Centos83 ~]# stat mini.txt # 查询文件属主、属组和权限 文件:mini.txt 大小:2742 块:8 IO 块:4096 普通文件 设备:fd00h/64768d Inode:134444908 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) ``` ## 6.1 用户账号 ### 6.1.1 用户的分类 Linux 用户三种角色:超级用户,普通用户,虚拟用户。 超级用户: root 拥有对系统的最高的管理权限,UID=0 普通用户: 系统用户 UID 范围:1-999(centos7/8 版本) 1-499(centos6 版本) 本地用户 UID 范围:1000+(centos7/8 版本) 500+(centos6 版本) UID:即每个用户的身份标示,类似于每个人的身份证号码. 虚拟用户:伪用户 一般不会用来登录系统的,它主要是用于维持某个服务的正常运行.如:ftp,apache 用户基本信息保存位置:/etc/passwd 下图是用户和组的关系: 一对一:一个用户可以存在一个组中; 一对多:一个用户可以存在多个组中 多对一:多个用户可以存在一个组中; 多对多:多个用户可以存在多个组中 ![image-20210624192200239](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624192200239.png) ### 6.1.2 配置文件 | 名 称 | 文件路径 | 说 明 | | ---------------- | ----------- | ------------------------------------------------------------ | | 用户配置文件 | /etc/passwd | 记录了每个用户的一些基本属性,并且对所有用户可读,每一行记录对应一个用户 | | 用户组文件 | /etc/group | 用户组信息存放文件,并且组名不能重复 | | 用户密码信息文件 | /etc/shadow | 因为 passwd 文件对所有用户是可读的,为安全起见把密码从 passwd 中分离出来放入这个单独的文件,该文件只有 root 用户拥有读权限,从而保证密码安全性 | ## 6.2 用户管理 ### 6.2.1 用户命令 命令:useradd useradd -d -u “UID” -g "初始组" -G "附加组" -s "登陆的 shell” 用户 -u: 指定 uid -d: -d 用户主目录路径, 可以指定用户家目录 -M: 不创建用户的家目录 -g:设置用户初始组的名称或数字 ID;该组必须是存在的;如果没有设置该选项,useradd 会根据/etc/login.defs 文件中的 USERGROUPS_ENAB 环境变量进行设置。默认 USERGROUPS_ENAB yes会用和用户名相同的名字创建群组. -G:用户要加入的附加组列表;使用逗号分隔多个组,不要添加空格;如果不设置,用户仅仅加入初始组。(一个用户只允许有一个主组,可以有多个附属组) -s:用户默认登录 shell 的路径;启动过程结束后,默认启动的登录 shell 在此处设定;请确保使用的 shell 已经安装,默认是 Bash。有时候需要禁止某些用户执行登录动作,例如用来执行系统服务的用户。将 shell 设置成 /sbin/nologin 就可以禁止用户登录。 ### 6.2.2 添加登录用户 例:添加一个名为 harry 的用户,并使用 bash 作为登录的 shell ```sh [root@Centos83 ~]# useradd harry # 创建用户harry [root@Centos83 ~]# tail -1 /etc/passwd # 查看/etc/passwd文件最后一行 harry:x:1001:1001::/home/harry:/bin/bash ``` ​ 说明:此命令会自动创建 harry 组,并成为 harry 用户的默认主组,同时默认的登录 shell 是 bash用户帐户的全部信息被保存在/etc/passwd 文件。这个文件以如下格式保存了每一个系统帐户的所有信息 (字段以“:”分割) ![image-20210624195444982](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624195444982.png) harry:x:1001:1001::/home/harry:/bin/bash #每行含意如下: harry:用户名 x:密码占位符 1001:用户的 UID,使用正整数表示,范围可以是 0-65535 1001:用户所属组的 GID,它都是用数字来表示的 用户描述信息:对用户的功能或其它来进行一个简要的描述,此字段会出现在登录用户界面,可以通过点击输入对应密码进行登录,却并不能手动输入此字段代替用户名。 /home/harry:用户主目录(shell 命令提示符中用“~”表示) /bin/bash:用户登录系统后使用的 shell ```sh [root@Centos83 ~]# cat /etc/shells # 查看系统中,支持哪些 shell /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash [root@Centos83 ~]# yum install zsh -y # yum安装 zsh [root@Centos83 ~]# zsh # 执行 zsh [root@Centos83]~# cd /etc/sysconfig/network-scripts [root@Centos83]/etc/sysconfig/network-scripts# # zsh运行结果,zsh会显示绝对路径的 ``` ### 6.2.3 指定用户 UID : **useradd -u 用户 ID** ```sh [root@Centos83]~# useradd -u 2000 oracle # 创建用户 oracle 指定uid为2000 [root@Centos83]~# id oracle # 查看 oracle 用户UID和GID 组ID uid=2000(oracle) gid=2000(oracle) 组=2000(oracle) [root@Centos83]~# tail -1 /etc/passwd # 查看/etc/passwd最后一行内容 oracle:x:2000:2000::/home/oracle:/bin/bash [root@Centos83]~# ls -a /home/oracle . .. .bash_logout .bash_profile .bashrc .mozilla .zshrc ``` ### 6.2.4 指定用户主目录 ```sh [root@Centos83]~# useradd -d /opt/ftp ftpuser # 创建用户 oracle 指定uid为2000 [root@Centos83]~# ls -a /opt/ftp # 查看 /opt/ftp 文件及隐藏文件 . .. .bash_logout .bash_profile .bashrc .mozilla .zshrc [root@Centos83]~# tail -1 /etc/passwd # 查看/etc/passwd最后一行内容 ftpuser:x:2001:2001::/opt/ftp:/bin/bash # ftpuser主目录已经被指定为/opt/ftp ``` ### 6.2.6 指定用户的附加组 我们也可以把这个附属组称为补充组,用户可以有 0 个或多个附加组的成员 如果一个组有多个成员,我们是可以在/etc/group 文件中最后一个字段看到的 ```sh [root@Centos83]~# useradd -G lenovo,oracle,root think # 创建think用户并让lenovo,oracle,root加入think组 [root@Centos83]~# id think uid=2003(think) gid=2003(think) 组=2003(think),2000(oracle),2002(lenovo),0(root) [root@Centos83]~# cat /etc/group # 查看用户组文件内容 root:x:0:think ………………中间部分内容省略……………… harry:x:1001: oracle:x:2000:think ftpuser:x:2001: lenovo:x:2002:think think:x:2003: ``` ### 6.2.7 创建用户的另外一个命令 ```sh [root@Centos83]~# adduser thinkplus # 创建thinkplus用户并让 [root@Centos83]~# id thinkplus # 查看thinkplus用户UID和GID 组ID uid=2004(thinkplus) gid=2004(thinkplus) 组=2004(thinkplus) [root@Centos83]~# which adduser # 会在环境变量$PATH设置的目录里查找符合条件的文件 /usr/sbin/adduser [root@Centos83]~# ll /usr/sbin/adduser # adduser 是 useradd 的软链接 lrwxrwxrwx. 1 root root 7 8月 13 2020 /usr/sbin/adduser -> useradd ``` ### 6.2.8 删除用户 **语法: userdel [options] 用户名** **选项:-r 删除的时候,会同时删除用户的家目录和/var/mail 下的目录** ```sh [root@Centos83]~# userdel harry # 删除用户harry ``` ### 6.2.9 密码的文件 ```sh [root@Centos83]~# head -1 /etc/shadow root:$6$mhuZmOQJAtrnoSfk$b52wXamQu2NE0bpEbZ9pcP.wkZLwAWD5tjG4LNqF/u3lMMaoPP85mMqcftjk1/u42yyyfNzvr/3PfcKDfZcKB0::0:99999:7::: ``` ![image-20210624205109262](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624205109262.png) 格式如下: name 登录名称,这个必须是系统中的有效账户名 password 已加密密码,分为三个部分,第一部分是表示使用哪种哈希算法;第二部分是用于加密哈希的 salt;第三部分是已加密的哈希 哈希算法:$1 表示 MD5 ; $6 表示 SHA512 ; $5 表示 SHA256 查看帮助说明: man 5 查看文件格式,man 3 查看库函数 man 5 passwd man 5 shadow man 5 group lastchange 最近一次更改密码的日期,以距离 1970/1/1 的天数表示 min-age 不能更改密码的最少天数,最近更改过后几天才可以更改;如果为 0 表示“最短期限要求” maxage 密码过期时间,必须更改密码前的最多天数 warning 密码即将到期的警告期,以天数表示,0 表示“不提供警告” inactive 宽限天数,密码到期后 expire 账号过期时间,以距离 1970/1/1 的天数计算 (千年虫) blank 预留字段 **给用户添加密码:** ```sh [root@Centos83]~# passwd oracle #交互式修改密码 Changing password for user oracle. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@Centos83]~# echo lenovo | passwd --stdin lenovo passwd: all authentication tokens updated successfully. ``` 互动: 两个用户的密码都是 123456 一样的, 那么 shadow 中加密的 hash 值一样吗? 答: 不一样。 因为 salt(撒盐加密)不一样 把 2 段加密的互换还能登陆吗?salt 什么时候指定的? 答:可以登录,salt 在加密过程中随机生成,保护了加密密码的机密性。 ### 6.2.10 添加用户规则 **控制添加用户规则文件的两个文件:/etc/default/useradd 和 /etc/login.defs** ```sh [root@Centos83]~# egrep -v "^$|^#" /etc/login.defs MAIL_DIR /var/spool/mail UMASK 022 HOME_MODE 0700 PASS_MAX_DAYS 99999 #用户密码最长使用时间,多少天后会有提醒 PASS_MIN_DAYS 0 #用户密码最短使用时间,意思是多少天内不能修改密码,0 为不限制 PASS_MIN_LEN 5 #用户密码最小长度 PASS_WARN_AGE 7 #密码过期后会提醒多少天,这些天内还没有修改密码的用户,账户会被冻结 UID_MIN 1000 #用户 ID 开始的数字 UID_MAX 60000 #用户 ID 结束的数字 SYS_UID_MIN 201 SYS_UID_MAX 999 GID_MIN 1000 GID_MAX 60000 #组 ID 结束的数字 SYS_GID_MIN 201 SYS_GID_MAX 999 CREATE_HOME yes #是否为用户建立 home 目录 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512 #shadow 文件的加密算法 [root@Centos83]~# cat /etc/default/useradd # useradd defaults file GROUP=100 #新创建用户时默认初始组的 GID 号(公共组),现在使用的都是私有组机制(根据创建用户名称创建组) HOME=/home # /home 表示用户家目录的位置 INACTIVE=-1 #是否启用帐号过期。passwd 文件中第7列,-1 表示不启用 EXPIRE= #帐号终止日期 shadow 中第 8 字段,你可以直接设定账号在哪个日期后就直接失效,而不理会密码的问题。 SHELL=/bin/bash #默认 shell 使用哪个 SKEL=/etc/skel #模板目录 CREATE_MAIL_SPOOL=yes #是否创建邮箱文件 ``` 命令:chage 了解一下, 后期记不住时,可以直接 vim 修改 shadow 文件 -m:密码可更改的最小天数。为 0 时代表任何时候都可以更改密码 -M:密码保持有效的最大天数 -W:用户密码到期前,提前收到警告信息的天数 -E:帐号到期的日期。过了这天,此帐号将不可用 -d:上一次更改的日期,为 0 表示强制在下次登录时更新密码 例:修改用户 lenovo密码信息:让这个用户 lenovo首次登录系统时必须更改其密码 ```sh [root@Centos83]~# chage -d 0 lenovo [root@Centos83]~#ssh lenovo@10.170.80.180 ... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.170.80.180' (ECDSA) to the list of known hosts. lenovo@10.170.80.180's password: 123456 You must change your password now and login again! #提示必须改密码 更改用户lenovo的密码 。 ``` **互动: 两个用户的 UID 可以一样吗?** ```sh [root@Centos83]~# vim /etc/passwd # 把 lenovo 的 UID 改成 0 [root@Centos83]~# id lenovo uid=0(root) gid=0(root) 组=0(root) # 用户 lenovo 已经变成超级用户了 [root@Centos83]~# su lenovo [root@Centos83 root]# id lenovo uid=0(root) gid=0(root) 组=0(root) ``` **查看用户相关命令:** ```sh [root@Centos83 ~]# id #用户和组的信息 uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@Centos83 ~]# whoami #查看当前有效用户名 root [root@Centos83 ~]# who #显示目前登入系统的用户信息。 root pts/0 2021-06-25 10:30 (10.170.80.200) root pts/1 2021-06-25 10:47 (10.170.80.200) [root@Centos83 ~]# w # w 命令用于显示已经登陆系统的用户列表 11:25:12 up 59 min, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.170.80.200 10:30 43:52 0.15s 0.15s -bash root pts/1 10.170.80.200 10:47 0.00s 0.64s 0.05s w [root@Centos83 ~]# users #用于显示当前登录系统的所有用户的用户列表 root root ``` ​ ### 6.2.11 修改用户信息 **语法:usermod 【参数】用户名** **常用参数:** **-u UID** **-d 宿主目录** **-m 选项会自动创建新目录并且移内容到新目录里面** **-g 起始组 #只能有一个** **-G 附加组 #可以有多个** **-s 登录 shell** **-L 锁定** ```sh 修改uid: [root@Centos83]~# id oracle uid=2000(oracle) gid=2000(oracle) 组=2000(oracle) [root@Centos83]~# usermod -u 1111 oracle [root@Centos83]~# id oracle uid=1111(oracle) gid=2000(oracle) 组=2000(oracle) 修改shell: [root@Centos83]~# usermod -s /sbin/nologin oracle [root@Centos83]~# grep oracle /etc/passwd oracle:x:1111:2000::/home/oracle:/sbin/nologin 更改用户主目录: [root@Centos83]~# usermod -m -d /opt/think think #-m 选项会自动创建新目录并且移内容到新目录里面 添加用户描述信息: [root@Centos83]~# usermod -c "hell Linux" lenovo [root@Centos83]~# grep lenovo /etc/passwd lenovo:x:0:2002:hell Linux:/home/lenovo:/bin/bash ``` 总结:如果你记不住命令, 那么直接改 vim /etc/passwd 一样的 ### 6.2.12 解决模板文件被删之后显示不正常的问题 ```sh [root@Centos83]~# useradd plume && echo 123456 | passwd --stdin plume #创建用户plume,成功后给plume创建密码 [root@Centos83]~# echo 123456 |passwd --stdin plume #给plume创建密码 [root@Centos83]~# ls -a /home/plume . .. .bash_logout .bash_profile .bashrc .mozilla .zshrc [root@Centos83]~# rm -rf /home/plume/.bash* #删除模板文件 [root@Centos83]~# ls -a /home/plume [root@Centos83]~# su plume bash-4.4$ #在 centos6 或 7 会出现这个不完整的 shell 提示符,如何处理? bash-4.4$exit [root@Centos83]~# cp /etc/skel/.bash* /home/plume/ # 拷贝模版文件到用户目录下 [root@Centos83]~# chown plume:plume /home/plume/.bash* # 给权限 [root@Centos83]~# su plume # 再次切换用户 [plume@Centos83 root]$ #正常 [plume@Centos83 root]$ ``` ## 6.3 实战:进入紧急模式恢复 root 密码 ### 6.3.1 实战场景找回 centos8 系统中 root 密码 公司一台 Centos Stream系统,忘记 root 密码了,需要你快速把 root 密码修改为 dba@root,找回root 身份。 实验环境:开启一台 Centos Stream 系统 ![image-20210624214705889](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624214705889.png) #开机时按任意键,即可进入此界面,光标选择第一条,`e`表示进入编辑模式 #在 linux 行尾添加 rd.break #进入编辑模式后会看到这些信息,默认情况,都是以 ro 只读方式引导系统进入 改完之后,按下 Ctrl+X 进入紧急模式 ![image-20210624215333628](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624215333628.png) 原理:打断系统正常启动,然后进一个 bash 环境,系统并没有真正的启动 ![image-20210624215548857](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624215548857.png) emergency [iˈmɜ:dʒənsi] 紧急 ![image-20210624220244943](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624220244943.png) 发现是只读的。需要重新以 rw 方式挂载/sysroot 。 mount -o remount,rw /sysroot #重新挂载,使其拥有读写权限 ![image-20210625082638077](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625082638077.png) 换根,修改密码 chroot 命令用来在指定的根目录下运行指令 chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置 在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件。 ![image-20210624220524275](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624220524275.png) 如果系统安装的中文版显示乱码,输入:LANG=en_US.UTF-8 #修改语言环境为英文,这样显示乱码。 passwd #开始修改密码 ![image-20210624220747007](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624220747007.png) 注:如果系统的 selinux 开启着,则需要执行命令: touch /.autorelabel 以更新系统信息,否 则重启之后密码修改不会生效,先退出当前根,reboot 重启系统。我们已经关闭 selinux,不需要创建 /.autorelabel 。 ![image-20210624220939593](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210624220939593.png) 扩展:创建此文件:开启 selinux 的情况下需要创建此文件,因为在 rd.break 环境下 SELinux 是不生效的。在不生效的情况下我们修改了用户的密码,也就是修改了/etc/shadow 文件,所以密码文件的安全上下文的特性会被取消。如果没有让系统在启动时自动恢复 SELinux 的安全上下文,系统会报错“无法登录”,所以 SELinux 在 Enforcing 模式下的时候(如在 disabled 模式下则不用),在根目录下touch 隐藏文件 autorelabel 会让系统在重启时以 SELinux 默认类型重新写入 SELinux 安全上下文。 ### 6.3.2 实战场景找回 centos7 系统中 root 密码 公司一台 Centos7 系统,忘记 root 密码了,需要你快速把 root 密码修改为 dba@root,找回 root身份。 实验环境:开启一台 Centos7 系统 首先重启,按↑↓键,进入如下界面,选择第一项,按下 e 键进行编辑 ![image-20210625075234355](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625075234355.png) #进入编辑模式后会看到这些信息。找到“Linux16”开头的行,在 Linux16 的行尾空格后添加“rd.break“ ![image-20210625075441365](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625075441365.png) ![image-20210625080513825](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625080513825.png) 这里改成 rw,则不需要重新挂载,直接以读写挂载 改完之后,按下 Ctrl+X 进入紧急模式 原理:打断系统正常启动,然后进一个 bash 环境,系统并没有真正的启动 ![image-20210625080754796](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625080754796.png) emergency [iˈmɜ:dʒənsi] 紧急 查看系统根挂载情况: ![image-20210625080947682](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625080947682.png) 如果是只读的。需要重新以 rw 方式挂载/sysroot ,刚才进入添加rd.break,时已经修改了rw,就不用重新挂载了。 如果是只读,用 mount -o remount,rw /sysroot #重新挂载,使其拥有读写权限 ![image-20210625081143563](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625081143563.png) 换根,修改密码 chroot 命令用来在指定的根目录下运行指令 chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置 在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件。 若安装操作系统时选择的是中文版,输入:LANG=en_US.UTF-8 #修改语言环境为英文,就可以解决显示乱码。 ![image-20210625081543980](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625081543980.png) passwd #开始修改密码 ![image-20210625081749393](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625081749393.png) 如果系统的 selinux 开启着,则需要执行命令: touch /.autorelabel 以更新系统信息让SELinux 生效,否则重启之后密码修改不会生效,先退出当前根,reboot 重启系统。我们已经关闭selinux,不需要创建/.autorelabel 。 ![image-20210625081945495](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625081945495.png) ​ 创建此文件:开启 selinux 的情况下需要创建此文件,因为在 rd.break 环境下 SELinux 是不生效的。在不生效的情况下我们修改了用户的密码,也就是修改了/etc/shadow 文件,所以密码文件的安全上下文的特性会被取消。如果没有让系统在启动时自动恢复 SELinux 的安全上下文,系统会报错“无法登录”,所以 SELinux 在 Enforcing 模式下的时候(如在 disabled 模式下则不用),在根目录下touch 隐藏文件 autorelabel 会让系统在重启时以 SELinux 默认类型重新写入 SELinux 安全上下文。 ### 6.4扩展内容(了解即可):SELinux SELinux( Security Enhanced Linux 安全性增强的 Linux),由美国国家安全局 NSA(National Security Agency)开发,构建与 Kernel 之上,拥有灵活的强制性访问控制结构,主要用在提高Linux 的安全性,提供强健的安全保证,可以防御未知***。 SELinux 是用于确定哪个进程可以访问哪些文件、目录和端口的一组安全规则。每个文件、进程、目录和端口都具有专门的安全标签,称为 SELinux 上下文。 SELinux 标签具有多种上下文:User 用户、Role 角色、Type 类型和 Level 敏感度级别。目标策略会根据第三个上下文(即 Type 类型上下文)来制定自己的规则,通常以_t 结尾 ls -Z ![image-20210625111055030](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625111055030.png) 传统的 Linux 在没有 Selinux 保护的时候,倘若运行于之上的服务器被骇客攻陷,其服务器最高权限就可能随之丧失,但是倘若有了 SElinux 的保护,***的也只有服务本身,整个服务器的最高权限依然还健在! 一句话熟悉 Selinux 的作用:增强 Linux 系统安全性,一个例子:那么是我运行的 Apache 服务器被***,也只是***到了我 httpd 这个服务,可以把它禁锢到这里(相当于整个服务器运行了httpd,***了 httpd 而已),而系统的整个权限依然正常! SELinux 模式 enforcing 强制模式,只要 selinux 不允许,就无法执行; permissive 警告模式,你可以执行,但你所做事件全部记录; disabled 关闭 selinux ![image-20210625104648307](https://gitee.com/caoyonghui/Typora/raw/master/Img/image-20210625104648307.png) selinux 控制的文件类型权限非常细,httpd 无权限访问其他文件类型,***即使***了 httpd,也没有权限访问其他类型文件,不管你是不是属组属主有 rwx 权限,都没用。 ```sh [root@Centos83 ~]# mkdir /abc [root@Centos83 ~]# touch /abc/index.html [root@Centos83 ~]# ls -Z /abc unconfined_u:object_r:default_t:s0 index.html [root@Centos83 ~]# semanage fcontext -a -t httpd_sys_content_t '/abc(/.*)?' ``` semanage 管理 fcontext 声明文件的默认标签 **-a 添加** **-t 类型** /abc(/.*)?是递归匹配/abc 目录下子文件和子目录 ```sh [root@Centos83 ~]# restorecon -RFvv /abc Relabeled /abc from unconfined_u:object_r:default_t:s0 to system_u:object_r:default_t:s0 Relabeled /abc/index.html from unconfined_u:object_r:default_t:s0 to system_u:object_r:default_t:s0 ``` restorecon 应用 fcontext 所声明的文件的标签 **-R 递归** **-F 强制** **-vv 显示详细信息** ```sh [root@Centos83 ~]# ls -Z /abc/ system_u:object_r:default_t:s0 index.html [root@Centos83 ~]# semanage fcontext -d -t httpd_sys_content_t '/abc(/.*)?' ``` **-d 删除** **-t 类型** ```sh [root@Centos83 ~]# restorecon -RFvv /abc [root@Centos83 ~]# ls -Z /abc/ system_u:object_r:default_t:s0 index.html [root@Centos83 ~]# semanage fcontext -l ``` **-l 查看类型** **实验 httpd 服务没有权限访问其他类型的文件** ```sh [root@Centos83 ~]# yum -y install httpd [root@Centos83 ~]# systemctl start httpd [root@Centos83 ~]# echo hello httpd >>/var/www/html/hell.txt [root@Centos83 ~]# ls -Z /var/www/html/hell.txt unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/hell.txt [root@Centos83 ~]# curl 10.170.80.180/hell.txt hello httpd # 打开网页可以访问这个 hell.txt 的内容 [root@Centos83 ~]# semanage fcontext -a -t default_t '/var/www/html/hell.txt' [root@Centos83 ~]# restorecon '/var/www/html/hell.txt' [root@Centos83 ~]# ls -Z '/var/www/html/hell.txt' unconfined_u:object_r:default_t:s0 /var/www/html/hell.txt [root@Centos83 ~]# curl 10.170.80.180/hell.txt 403 Forbidden Forbidden You don't have permission to access this resource. # 打开网页没有权限访问这个 hell.txt 的内容 [root@Centos83 ~]# semanage fcontext -d -t default_t '/var/www/html/hell.txt' [root@Centos83 ~]# restorecon '/var/www/html/hell.txt' [root@Centos83 ~]# curl 10.170.80.180/hell.txt hello httpd # 打开网页可以访问这个 hell.txt 的内容 ``` **总结:** **6.1 用户和组的相关配置文件** **6.2 管理用户和组** **6.3 实战:进入 centos8 紧急模式恢复 root 密码** **6.3 扩展内容(了解即可):SELinux**

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册