zoukankan      html  css  js  c++  java
  • Linux从入门到入坑

    入门功法——Linux简介

    Linux操作系统

    Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debianarchlinux,和基于商业开发的[Red Hat Enterprise Linux](https://baike.baidu.com/item/Red Hat Enterprise Linux/10770503)、SUSE、[Oracle Linux](https://baike.baidu.com/item/Oracle Linux/6876458)等

    目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

    总结:

    • Windows 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些 -
    • Linux 免费的,开源的,主要用于服务器领域,性能稳定,安全
    • Unix 用于封闭的硬件环境,企业的应用依赖于定制化开发

    内核

    1. 什么是操作系统?
      操作系统是负责整个系统最基本功能和系统管理,包括内核、设备驱动程序、启动引导程序、命令行shell或其它种类的用户界面、基本的文件管理工具和系统工具。

    用户界面是操作系统的外在表象,内核是操作系统的内在核心。

    1. 什么是内核?
      内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。

    内核负责管理系统的硬件设备。

    1. 内核空间 VS 用户空间
      内核空间表示内核拥有的内存空间,用户空间表示用户程序执行时的内存空间。

    内核拥有直接访问硬件设备的所有权限,用户程序不能直接访问硬件设备,因此用户程序通过系统调用和内核通信来运行。

    Linux内核

    ​ 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

    主要的子程序

    • 系统调用接口
    • 进程管理
    • 内存管理
    • 虚拟文件系统

    Linux内核的功能

    1、进程管理

    内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)。不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。另外,调度器,控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU 之上的抽象。

    2、内存管理

    计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的。内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间。内核的不同部分与内存管理子系统通过一套函数调用交互,从简单的malloc/free对到更多更复杂的功能。

    3、文件系统

    Unix 在很大程度上基于文件系统的概念;几乎Unix中的任何东西都可看作一个文件。内核在非结构化的硬件之上建立了一个结构化的文件系统,结果是文件的抽象非常多地在整个系统中应用。另外,Linux 支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准Linux的ext3文件系统,普遍使用的FAT 文件系统,或者其他几个文件系统。

    4、设备控制

    几乎每个系统操作终都映射到一个物理设备上。除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行,这些代码称为设备驱动.。内核中必须嵌入系统中出现的每个外设的驱动,,从硬盘驱动到键盘和磁带驱动器。内核功能的这个方面是本书中的我们主要感兴趣的地方。

    5、网络

    网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件。报文在某一个进程接手之前必须被收集,识别,分发。系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行。另外,所有的路由和地址解析问题都在内核中实现。

    Linux的发展历程

    https://www.linuxprobe.com/origin-of-linux.html

    centos7 的安装

    见博客:http://101.37.172.180:8848/archives/vmware虚拟机安装centos7

    沟通丹田——初识Shell

    shell是系统的用户界面,提供了用户与内核进行交互的一种接口。它接收用户输入的命令并把它送到内核中去执行。实际上Shell是一个命令解释器,它解释用户输入的命令并把用户的意图传达给内核。(可以理解为用户和内核之间的翻译官角色)

    Shell 分类

    常见的Shell类型有sh, bash, csh, tcsh, ash,bash shell 是Linux默认的shell,

    Shell 语法

    命令:整条shell命令的主体部分

    选项:会影响会微调命令的行为,通常以-或者--开头

    参数: 命令作用的对象(长参数,短参数)

    bash的基本特性

    自动补全

    [root@localhost ~]# yum install -y bash-completion.noarch 
    

    快捷键

    • Ctrl + l - 清屏

    • Ctrl + A - 光标移到行首

    • Ctrl + E - 光标移到行尾

    • Ctrl + W - 清除光标之前一个单词

    • Ctrl + K - 清除光标到行尾的字符

    • Ctrl + T - 交换光标前两个字符

    • Ctrl + V - 输入控制字符 如Ctrl+v ,会输入^M

    • Ctrl + F - 光标后移一个字符

    • Ctrl + B - 光标前移一个字符

    • Ctrl + H - 删除光标前一个字符

    历史命令

    [root@localhost ~]# history 
    

    选项

    • -c:将目前shell中的所有history命令消除(只清空缓存,不清空文件)
    • -a:将目前新增的命令写入 histfiles , 默认写入 ~/.bash_history
    • -d:删除指定的历史命令
    • -r:将 histfiles 内容读入到目前shell的history记忆中
    • -w:将目前history记忆的内容写入到 histfiles
    • 使用 ! 执行历史命令
    # history [n] n为数字,列出最近的n条命令
    [root@localhost ~]# history -w histfiles.txt 1 
    [root@localhost ~]# history -c ! number 执行第几条命令 ! command 从最近的命令查到以 command 开头的命令执行 
    !! 执行上一条
    

    命令别名(alias)

    [root@localhost ~]# alias
    alias cp='cp -i'
    alias egrep='egrep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias grep='grep --color=auto'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    

    设置别名

    [root@localhost ~]# alias cathis='cat /root/.bash_history'
    [root@localhost ~]# cathis
    

    取消别名

    [root@localhost ~]# unalias cathis='cat /root/.bash_history'
    

    man手册

    查看某个命令的 man手册

    [root@localhost ~]# man ls
    

    下载安装中文版的man手册

    [root@localhost ~]# yum -y install man-pages-zh-CN.noarch
    [root@localhost ~]# echo alias cman='man -M /usr/share/man/zh_CN' >> /root/.bashrc	
    [root@localhost ~]# source .bashrc
    [root@localhost ~]# cman ls
    

    打通身体经脉——文件管理

    文件系统目录结构

    在Linux中,文件以树状图的形式表现出来。其中/ 为根目录 只有一个根目录 。所以也称之为单根文件系统

    • /bin:(Red Hat7以后,该目录被淘汰)
      bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

    • /boot:
      这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

    • /dev :
      dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

    • /etc:
      etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

    • /home:(普通用户家目录)
      用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

    • /root
      该目录为系统管理员,也称作超级权限者的用户主目录。

    • /lib
      lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

    • /lost+found
      这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

    • /media
      linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

    • /mnt
      系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

    • /opt
      opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

    • /proc
      proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
      这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

      echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
      
    • /sbin
      s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

    • /selinux
      这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

    • /srv
      该目录存放一些服务启动之后需要提取的数据。

    • /sys

      这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

      sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

      该文件系统是内核设备树的一个直观反映。

      当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

    • /tmp
      tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

    • /usr
      usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

    • /usr/bin:
      系统用户使用的应用程序。

    • /usr/sbin:
      超级用户使用的比较高级的管理程序和系统守护程序。

    • /usr/src:
      内核源代码默认的放置目录。

    • /var
      var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

    • /run
      是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

    文件定位 路径

    路径的作用:定位文件

    绝对路径:从根目录下出发的路径称为绝对路径

    相对路径:相对于当前目录下出发的路径称为相对路径

    [root@localhost ~]# cd [路径]
    #相对路径
    [root@localhost ~]# mkdir test
    [root@localhost ~]# cd test
    #绝对路径
    [root@localhost ~]# cd /root/test
    

    文件管理 (文件操作)

    文件(touch)

    [root@localhost ~]# touch [fiile-name] # 无则创建,有则修改时间
    [root@localhost ~]# touch file1 file2 file3
    [root@localhost ~]# touch /home/{file4,file4}
    [root@localhost ~]# touch test{1..1000}
    # 创建test1-test1000 文件
    [root@localhost ~]# touch test{1,10}
    # 创建test1 和 test10
    

    目录(mkdir)

    [root@localhost ~]# mkdir dir
    [root@localhost ~]# mkdir dir1 dir2 dir3
    [root@localhost ~]# mkdir dir{1..5}
    [root@localhost ~]# mkdir -p /dir/test/dir1
    # 递归创建
    选项:
    	-v:将创建的结果打印出来
    	-p:递归创建
    

    拷贝(cp)

    [root@localhost ~]# cp [目标file/目录] [目的file/目录]
    [root@localhost ~]# cp /root/dir/test test1
    参数
    -a:相当于 -pdr 的意思,至于 pdr 请参考下列说明;(常用)
    
    -d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
    
    -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
    
    -i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    
    -l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;
    
    -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
    
    -r:递归持续复制,用于目录的复制行为;(常用)
    
    -s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;
    
    

    移动(mv)

    [root@localhost ~]# mv file1 /root/dir	# 将file1移动到/root/dir
    [root@localhost ~]# mv file2 /root/dir/file20 
    # 将file2 移动到 /root/dir 目录下, 并改名为 file20
    [root@localhost ~]# mv file3 file4 
    # 将file3改名为file4
    

    删除(rm)

    [root@localhost ~]# rm -f(强制删除) [file_name]
    [root@localhost ~]# rm -r(递归删除) [file_name] # 删除目录
    [root@localhost ~]# rm -i [file_name] # 交互模式删除
    [root@localhost ~]# rm -rf [file_name]
    

    查看(cat)

    除此之外还有:tac less more tail tailf'

    cat:从上往下(正常顺序)打开

    tac:从下网上打开

    less:打开较大的文件时,不会一次性加载所有的文件,只会加载一部分,通过空格键向后继续查询

    more:跟less类似,只不过more查看完就退出了 显示进度 (空格翻页、q退出)

    head:默认从前面查看10行

    tail:从后面查看

    tailf:实时追踪

    下品功法——管道符、重定向与环境变量

    重定向

    • 输入输出

      • 标准输入
      • 标准正确输出1
      • 标准错误输出2
    • 输出重定向

      • '>' : 覆盖重定向
      • '>>' : 追加重定向
      • '2>' : 覆盖重定向错误输出数据流
      • '2>>' : 追加重定向错误输出数据流
    • 输入重定向

      • '<':覆盖输入重定向
      • '<<':追加输入重定向
    • 标准输出和错误输出各自重定向至不同位置

      [root@localhost ~]# commmand 1> /path/file.out 2> /path/error.out /dev/null
      
    • 合并标准输出和错误输出为同一个数据流进行重定向

      • '&>':覆盖重定向
      • '&>>': 追加重定向
      • '2>&1': 将错误流重定向到标准输出文件中
      • '1>&2': 将正确流重定向到标准错误输出文件中
    • 标准输入

    [root@localhost ~]# cat > output <<EOF
    > 123
    > 456
    > 678
    > EOF
    [root@localhost ~]# cat >> output <<EOF
    > 789
    > 456
    > 123
    > EOF
    [root@localhost ~]# cat output 
    

    管道符命令

    通俗来说,把前一个命令原本要输出到屏幕上的内容当成后一个命令的数据 两个命令用 " | " 分隔开

    [root@localhost ~]# 命令1 | 命令2 | 命令3
    
    [root@localhost ~]#  grep "/sbin/nologin" /etc/passwd | wc -l
    15
    

    通过管道符重置用户密码

    [root@localhost ~]# echo redhat | passwd --stdin root
    Changing password for user root. 
    passwd: all authentication tokens updated successfully. 
    

    命令行的通配符

    • '*': 代表匹配所有
    [root@localhost ~]# ls -l /dev/sda*
    brw-rw----. 1 root disk 8, 0 Oct 18 07:32 /dev/sda
    brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
    brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
    
    • '?': 代表匹配单个字符
    [root@localhost ~]# ls -l /dev/sda?
    brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
    brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
    
    • 除了使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这三个指定 数字中的一个,若没有匹配到,则不会显示出来:
    [root@localhost ~]# ls -l /dev/sda[0-9]
    brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
    brw-rw----. 1 root disk 8, 2 Oct 18 07:32 /dev/sda2
    
    [root@localhost ~]# ls -l /dev/sda[135]
    brw-rw----. 1 root disk 8, 1 Oct 18 07:32 /dev/sda1
    

    重要的环境变量

    ​ 变量是计算机系统用于保存可变值的数据类型。在 Linux 系统中,变量名称一般都是大 写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux 系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件 存放位置等。

    变量名 作用
    HOME 用户的主目录(及家目录)
    SHELL 用户在使用的Shell解释器的名称
    HISTSIZE 输出的历史命令条数
    HISTFILESIZE 保持的历史命令条数
    MAIL 邮件保存路径
    LANG 系统语言,语系名称
    RANDOM 生成一个随机数字
    PS1 Bash解释器的提示符
    PATH 定义解释器搜索用户执行命令的路径
    EDITOR 用户默认的文本编辑器

    我们可以自己定义变量,例如定义一个变量WORKDIR,方便直接到达用户工作的目录,如下:

    [root@localhost ~]# useradd user1
    [root@localhost ~]# echo 123 | passwd --stdin user1 
    Changing password for user user1.
    passwd: all authentication tokens updated successfully.
    [root@localhost ~]# mkdir /home/user1/test
    [root@localhost ~]# WORKDIR=/home/user1/test/
    [root@localhost ~]# cd $WORKDIR
    [root@localhost test]# pwd
    /home/user1/test
    

    但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户所使用。可以使用export命令将其提升为全局变量。

    [root@localhost ~]# export WORKDIR
    

    小工具

    tr命令

    [root@localhost ~]# tr [option] [set1] [set2]
    常用选项
    -d: 删除
    案例1:
    将/etc/passwd文件中的前5行的内容转换为大写后保存在/tmp/passwd.out中
    [root@localhost ~]# head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out
    [root@localhost ~]# cat /tmp/passwd.out 
    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
    BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
    DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
    ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
    LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
    
    案例2:
    [root@localhost ~]# who
    root     pts/0        2021-10-18 17:51 (192.168.88.1)
    [root@localhost ~]# who | tail -n 1 | tr 'a-z' 'A-Z' > /tmp/who.out
    [root@localhost ~]# cat /tmp/who.out 
    ROOT     PTS/0        2021-10-18 17:51 (192.168.88.1)
    

    wc命令(统计)

    常用选项:
    -l: 显示行数
    -w: 单词数
    -c: 字符数
    

    cut命令(切割命令)

    常用选项:
    -d: 指定分割符
    -f: 指定字段
    

    sort命令(排序文件)

    常用选项:
    -f: 忽略大小写
    -r: 逆序
    -t: 字段分割符
    -k #: 以指定字段为标准排序
    -n: 以数值进行排序
    -u: 排序后去重
    

    uniq命令(去重)

    常用选项:
    -c: 仅显示每行重复出现的次数
    -d: 仅显示重复过的行
    -u: 仅显示不曾重复的行
    案例:
    [root@localhost ~]# cut -d: -f6-10 /etc/passwd | cut -f3 | sort -n | uniq -c      1 /bin:/sbin/nologin
          1 /home/user1:/bin/bash
          1 /root:/bin/bash
          1 /root:/sbin/nologin
          1 /sbin:/bin/sync
          4 /:/sbin/nologin
          1 /sbin:/sbin/halt
          1 /sbin:/sbin/nologin
          1 /sbin:/sbin/shutdown
          1 /usr/games:/sbin/nologin
          1 /var/adm:/sbin/nologin
          1 /var/empty/sshd:/sbin/nologin
          1 /var/ftp:/sbin/nologin
          1 /var/lib/chrony:/sbin/nologin
          1 /var/spool/lpd:/sbin/nologin
          1 /var/spool/mail:/sbin/nologin
          1 /var/spool/postfix:/sbin/nologin
    

    气运丹田,重构身体——文本编辑器

    Linux上也有图形化的文本编辑器,类似windows的记事本,但是很多时候我们也只能用命令行来管理Linux操作系统,所以必须要掌握命令行的文本编辑器软件。

    目前常见的文本编辑器有:

    • nano: 在debain系列的系统上会比较常见,但是在其他的发行版中也可以安装
    • vi: 所有的Unix link 系统都会内置vi 文本编辑器,其他的文本编辑器则不一定会存在
    • vim: 具有程序编辑能力的文本编辑器,可以主动以字体颜色辨别语法的正确性,方便设计程序

    目前vim是使用最多的,也是比较推荐的Linux文本编辑器

    什么是vim

    ​ Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中 被广泛使用。

    ​ 简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是 程序开发者的一项很好用的工具。

    ​ 连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

    ​ vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常 用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用 的就可以了。

    vi/vim的使用

    基本上vi/vim共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式 (Last line mode)。 这三种模式的作用分别是:

    命令模式

    刚刚启动vim的时候就进入了命令模式

    此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下 i ,并不会输入一个字符, i 被当作了一个命令。

    以下是常用的几个命令:

    • i : 切换到命令模式(在当前字符的前面输入)
    • a : 切换命令模式(在当前字符后买你输入)
    • o : 切换命令模式(在当前行的下一行输入)
    • x : 删除当前光标所在位置的字符
    • ':' : 切换到末行模式,在最底下一行输入命令

    若想要编辑文本:启动Vim,进入了命令模式,按下 i、a、o ,切换到输入模式

    命令模式只有一些最基本的命令,因此需要末行模式在输入更多的命令。

    输入模式

    进入输入模式的命令上面讲到

    在输入模式中,可以使用以下按键:

    • 字符按键及Shift组合,输入字符
    • ENTER 回车键,换行
    • DEL 删除键,删除光标后面的一个字符
    • hjkl : 方向键,不过这个只能在命令模式中使用
    • ESC ,退出输入模式,切换到命令模式
    • HOME/END,移动光标到行首/行尾
    • Page Up/Page Down,上/下翻页

    末行模式

    在命令模式下按下:(英文冒号) 就可以进入末行模式,在末行模式下可用的命令非常多。基本命令有:

    • q :退出但不保存
    • w : 写入(保存)
    • x :保存并退出

    详细用法

    • 移动光标的方法
    h 或 向左 箭头键 (←) 光标向左移动一个字符
    j 或 向下 箭头键(↓) 光标向下移动一个字符
    k 或 向上 箭头键(↑) 光标向上移动一个字符
    l 或 向右 箭头键 (→) 光标向右移动一个字符
    [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
    [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
    [Ctrl] + [d] 屏幕『向下』移动半页
    [Ctrl] + [u] 屏幕『向上』移动半页
    + 光标移动到非空格符的下一行
    - 光标移动到非空格符的上一行
    n+空格 或者 nl/nh 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。 例如 20 则光标会向后面移动 20 个字符距离。
    0 或功能 键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
    $ 或功能 键[End] 移动到这一行的最后面字符处(常用)
    H 光标移动到这个屏幕的最上方那一行的第一个字符
    M 光标移动到这个屏幕的中央那一行的第一个字符
    L 光标移动到这个屏幕的最下方那一行的第一个字符
    G 移动到这个文件的最后一行(常用
    nG n 为数字。移动到这个文件的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)d
    gg 移动到这个文件的第一行,相当于 1G 啊! (常用)
    n n 为数字。光标向下移动 n 行(常用)
    • 文本的搜索与替换
    /word 向光标之下寻找一个名称为 word 的字符串。 (常用)
    ?word 向光标之上寻找一个字符串名称为 word 的字符串。
    n 这个 n 是英文按键。代表重复前一个搜寻的动作。
    N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。
    :n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串 取代为 word2 (常用)
    :1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
    :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取 代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
    • 删除/剪切、复制与粘贴
    x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
    nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』
    dd 删除/剪切光标所在的那一整行(常用)
    ndd n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
    d1G 删除光标所在到第一行的所有数据
    dG 删除光标所在到最后一行的所有数据
    d$ 删除游标所在处,到该行的最后一个字符
    d0 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符
    yy 复制游标所在的那一行(常用)
    nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
    y1G 复制游标所在行到第一行的所有数据
    yG 复制游标所在行到最后一行的所有数据
    y0 复制光标所在的那个字符到该行行首的所有数据
    y$ 复制光标所在的那个字符到该行行尾的所有数据
    p, P p为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行 开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
    J 将光标所在行与下一行的数据结合成同一行
    c 重复删除多个数据,例如向下删除 10 行,[ 10c ]
    u 复原前一个动作。(常用)
    [Ctrl]+r 重做上一个动作。(常用)
    . 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了 (常用)
    • 进入输入或者取代的编辑模式
    i, I 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格 符处开始输入』。 (常用)
    a, A 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在 行的最后一个字符处开始输入』。(常用)
    o, O 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一 行; O 为在目前光标所在的上一行处输入新的一行!(常用)
    r, R 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文 字,直到按下 ESC 为止;(常用)
    [Esc] 退出编辑模式,回到一般模式中(常用)
    • 保存退出,离开的指令
    :w 将编辑的数据写入硬盘中(常用)
    :w! 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权 限有关
    :q 离开 vi (常用)
    :q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。
    :wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
    ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
    :x 效果等同于(保存并退出)
    :X 大写的X,用于加密文件
    ZQ 不保存,强制退出。效果等同于:q!。
    :w [filename] 将编辑的数据储存成另一个文件(类似文件另存为)
    :r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在 行后面
    :n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。
    :! command 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中 察看 /home 底下以 ls 输出的文件信息!

    vim环境变量

    root@localhost ~]# vim .vimrc	# 当前用户生效
    root@localhost ~]# vim /etc/vimrc	# 全局生效
    # 行号
    显示:set number,简写为set nu
    取消显示:set nonumber,简写为set nonu
    # 括号匹配
    匹配:set showmatch,简写为set sm
    取消:set nosm
    # 自动缩进
    启用:set ai
    禁用:set noai
    # 高亮搜索
    启用:set hlsearch
    禁用:set nohlsearch
    # 语法高亮
    启用:syntax on
    禁用:syntax off
    # 忽略字符的大小写
    启用:set ic
    不忽略:set noic
    # 获取帮助
    : help
    

    文件基本属性与文件查找

    文件属性

    文件时间

    ​ 任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在Linux中, 可以使用stat查看Linux系统中文件的时间

    stat

    用于显示文件时间和inode内容

    stat [选项]... 文件...
    

    实例

    • stat查看文件时间,这边为了方便我们看的懂,建议改成英文系统环境
    root@localhost ~]# export LANG="en_US.UTF-8"
    # 改回中文是LANG="zh_CN.UTF-8"
    [root@localhost ~]# stat anaconda-ks.cfg
    File: ‘anaconda-ks.cfg’
    Size: 1241 Blocks: 8 IO Block: 4096 regular file
    Device: fd00h/64768d Inode: 33574979 Links: 1
    Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
    Context: system_u:object_r:admin_home_t:s0
    Access: 2021-04-04 17:54:09.700844151 +0800
    Modify: 2021-04-04 16:53:30.524854041 +0800
    Change: 2021-04-04 16:53:30.524854041 +0800
    Birth: -
    
    
    • Access:访问时间,也叫atime
      • 当文件被访问的时候。这个时间就会发生改变
      • Linux文件运行的时候查看文件又频繁数量又大,如果每次都刷新atime都要记入硬盘中,长期以来,会给硬盘带来很大的压力。RHEL6开始relatime,atime延迟修改,必须满足其中一个条件:
        • 自上次atime修改后,已达到86400秒
        • 发生写操作的时候
    • Modify:修改时间(内容),也叫mtime
      • 当文件内容发生变化的时候,这个时间就会变化
    • Change:改变时间(状态)
      • 当文件状态被改变的时候,这个时间就会发生变化

    文件类型

    ​ Linux系统和Windows系统有很大的区别,Windows系统查看文件的后缀名就可以知道这个是什么类型的文 件,比如: test.jpg 这个是一个图片,如果你在windows上双击打开,就会使用支持查看图片的软件打 开。

    Linux系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错 误,就会报错,看下面的案例

    root@localhost ~]# cat file
    cat: file: Is a directory
    

    ​ 当你以为file是个文件,使用cat命令查看的时候,cat会提示你这个是个文件夹,你才反应过来,应该使用cd 命令打开。 所以在Linux中,我们需要使用和windows不一样的方法来判断这个文件的类型。

    方法一:ls

    ​ 使用ls可以查看当前目录下有哪些文件,我们会发现文件夹和文件的颜色并不一样,所以我们可以简单的通过 颜色来进行判断,不过这种判断的方式并不准确,因为不同的Linux发行套件颜色的标准并不一样,不同的远 程管理工具对颜色的理解也有偏差,比如可能把蓝色显示为淡蓝色,而淡蓝色又显示成其他颜色。所以最推荐 的做法是通过 ls -l 查看第一个字母:

    • -普通文件(文本文档,二进制文件,压缩文件,电影,图片等等)
    • d目录文件(一般为蓝色)
    • b块设备文件(块设备)存储设备硬盘,U盘 /dev/sda,/dev/sda1
    • c字符设备文件(字符设备)如打印机,终端/dev/tty1,/dev/zero
    • s套接字文件
    • p管道文件
    • l链接文件(一般为淡蓝色)
    [root@localhost ~]# type ll
    ll 是 `ls -l --color=auto' 的别名
    [root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/sda /dev/tty1
    /etc/grub2.cfg /dev/log /run/dmeventd-client
    -rwxr-xr-x. 1 root root 117680 10月 31 2018 /bin/ls
    srw-rw-rw-. 1 root root 0 4月 4 16:54 /dev/log
    brw-rw----. 1 root disk 8, 0 4月 4 16:54 /dev/sda
    crw--w----. 1 root tty 4, 1 4月 4 16:56 /dev/tty1
    lrwxrwxrwx. 1 root root 22 4月 4 16:49 /etc/grub2.cfg ->
    ../boot/grub2/grub.cfg
    -rw-r--r--. 1 root root 158 6月 7 2013 /etc/hosts
    drwxr-xr-x. 2 root root 6 4月 11 2018 /home
    prw-------. 1 root root 0 4月 4 16:54 /run/dmeventd-client
    

    方法二:file

    file是专门用来查看文件类型的命令

    [root@localhost ~]# file /etc/hosts
    /etc/hosts: ASCII text
    [root@localhost ~]# file /bin/ls
    /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
    linked (uses shared libs), for GNU/Linux 2.6.32,
    BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
    [root@localhost ~]# file /dev/sda
    /dev/sda: block special
    [root@localhost ~]# file /dev/tty1
    /dev/tty1: character special
    [root@localhost ~]# file /etc/grub2.cfg
    /etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
    [root@localhost ~]# file /home
    /home: directory
    [root@localhost ~]# file /run/dmeventd-client
    /run/dmeventd-client: fifo (named pipe)
    
    

    文件查找

    which

    用于查找文件

    which命令会在环境变量$PATH设置的目录里查找符合条件的文件

    [root@localhost ~]# which [filename...]
    

    实例

    • 查看ls命令的可执行文件在哪个目录
    [root@localhost ~]# which ls
    lias ls='ls --color=auto'
    /usr/bin/ls
    # which会先告诉你ls其实是一个别名
    # 然后显示出来ls所在的具体位置
    

    小知识:我们在执行ls的时候,其实执行的是ls -color=auto 这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行ls本体,而不想执行别名,我们可以输入\ls就可以了,这样就不会就不同颜色的文件类型了。

    • 查看poweroff在什么目录
    [root@localhost ~]# which poweroff
    /usr/sbin/poweroff
    

    locate

    用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或者目录

    在centos7的最小安装中,并没有自带locate命令,需要输入如下命令进行安装

    [root@localhost ~]# yum -y install mlocate
    

    locate命令的使用方式如下

    [root@localhost ~]# locate [选项]...[范本样式]...
    

    在使用locate之前,需要更新一下数据库,因为locate只会在数据库中查找文件所在的位置,所以locate查找 速度极快,缺点就是数据库更新并不是实时的,更新数据库有两种方式:

    • 手动更新,输入 updatedb
    • 默认情况下,updatedb 会每天自动执行一次

    选项

    • -c:只输出找到的数量
    • -n:至多显示 n个输出
    • -i:忽略大小写
    • -r:使用基本正则表达式
    • --regex:使用扩展正则表达式
    • -d DBPATH:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db

    实例

    • 查找passwd文件所在的位置
    root@localhost ~]# updatedb
    # 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
    [root@localhost ~]# locate passwd
    
    • 查找ens33网卡配置文件所在的位置
    [root@localhost ~]# locate -r ens33$
    /etc/sysconfig/network-scripts/ifcfg-ens33
    # $在正则表达式中表示以什么结尾,所以ens33$表示的是以ens33结尾的文件
    

    find

    实时查找工具,通过遍历指定路径下的文件系统来完成文件的查找

    工作特点:

    • 查找速度略慢
    • 精确查找
    • 实时查找
    • 可以满足多种条件的匹配

    使用方法如下

    find [选项] [路径] [查找条件 + 处理动作]
    # 查找路径:指定具体目录路径,默认是当前文件夹
    # 查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
    # 处理动作:对符合条件的文件做什么操作,默认输出屏幕
    

    查找条件

    • 根据文件名查找
    root@localhost ~]# find /etc -name "ifcfg-ens33"
    [root@localhost ~]# find /etc -iname "ifcfg-ens33" # 忽略大小写
    [root@localhost ~]# find /etc -iname "ifcfg*"
    
    • 按照文件大小查找
    [root@localhost ~]# find /etc -size +5M # 大于5M
    [root@localhost ~]# find /etc -size 5M # 等于5M
    [root@localhost ~]# find /etc -size -5M # 小于5M
    [root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
    
    • 指定查找的目录深度
    [root@localhost ~]# find / -maxdepth 3 -a -name "ifcfg-ens33" # 最大查找深度
    # -a是同时满足,-o是或
    [root@localhost ~]# find / -mindepth 3 -a -name "ifcfg-ens33" # 最小查找深度
    
    • 按照时间查找
    root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天
    [root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天
    [root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内
    

    atime: 文件访问时间

    ctime: 文件状态修改时间

    mtime: 文件内容修改时间

    • 按照文件属主,属组查找
    [root@localhost ~]# find /home -user atopos # 属主是atopos的文件
    [root@localhost ~]# find /home -group atopos
    [root@localhost ~]# find /home -user atopos -group atopos
    [root@localhost ~]# find /home -user atopos -a -group root
    [root@localhost ~]# find /home -user atopos -o -group root
    [root@localhost ~]# find /home -nouser # 没有属主的文件
    [root@localhost ~]# find /home -nogroup # 没有属组的文件
    

    其中-a是和,-o是或

    • 按文件类型
    root@localhost ~]# find /dev -type d
    
    • 按照文件权限查找
    root@localhost ~]# find / -perm 644 -ls
    [root@localhost ~]# find / -perm -644 -ls # 权限小于644的
    [root@localhost ~]# find / -perm 4000 -ls
    [root@localhost ~]# find / -perm -4000 -ls
    
    • 按正则表达式查找
    [root@localhost ~]# find /etc -regex '.*ifcfg-ens[0-9][0-9]'
    # .* 任意多个字符
    # [0-9] 任意一个数字
    

    处理动作

    • -print:默认的处理动作,显示到屏幕上
    • -ls:类似与对查找到的文件执行ls -l命令
    • -delete: 删除查找到的文件
    • -fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定的文件中
    • -ok COMMAND{}:对查找到的文件执行由COMMAND指定的命令,需要确认
    • -exec COMMAND{}:对查找到的文件执行由COMMAND指定的命令,不需要确认
    • {}:用于引用查找到的文件名自生

    实例

    • 查找/var目录下属主为root,且属组为mail的所有文件或目录
    [root@localhost ~]# find /var -user root -a -group mail
    
    • 查找/usr目录下不属于root,bin或Hadoop的所有文件或目录
    [root@localhost ~]# find /usr -not -user root -not -user bin -not -user Hadoop(centos)
    [root@localhost ~]# find /usr -not \(-user root -user bin -user Hadoop\)
    
    • 查找/etc目录下最近一周内容曾被修改过的文件或目录
    [root@localhost ~]# find /etc -mtime -7
    
    • 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
    [root@localhost ~]# find / \(-nouser -o -nogroup\) -a -atime -7
    
    • 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
    [root@localhost ~]# find /etc -size +1M -a -type f
    
    • 查找/etc目录下所有用户都没有写权限的文件
    [root@localhost ~]# find /etc -not -perm -222
    
    • 查找/etc目录下至少一类用户没有执行权限的文件
    [root@localhost ~]# find /etc -not -perm 111
    
    • 查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件
    [root@localhost ~]# find /etc/init.d -perm -113
    

    功法管理——用户权限管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须向管理员申请一个账号,然后输入这个账号的身份进入系统。

    为了更加方便的管理多个用户,就出现了用户组的相关概念,关于用户和用户组:

    • 系统上每个进程(运行的程序)都是作为特定用户运行的
    • 每个文件是由一个特定的用户拥有
    • 访问文件和目录收到用户的限制
    • 与正在运行的进程相关联的用户确定该进程可以访问的文件和目录

    实现用户账号的管理,主要完成的工作有以下的几个方面:

    • 用户账号的添加,删除和修改
    • 用户口令的管理
    • 用户组的管理

    用户和用户组的查看

    id

    现实用户的ID,以及所属群组的ID

    id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID

    [root@localhost ~]# id [OPTION]... [USER]
    
    • g:显示用户所属群组的ID
    • -G:显示用户所属附加组的ID
    • -n:显示用户,所属群组或者附加组的名称
    • -r:显示实际ID
    • -u:显示用户ID

    uid的约定

    Linux系统会依赖用户的uid数值来判定这个用户的角色,分别如下:

    • 0:超级管理员,也就是root,在Linux系统中拥有绝对的权力
    • 1~999:系统用户,系统用户往往是用来约束系统中的服务用的
    • 1000+:普通用户,可以用来登录和使用Linux操作系统

    关于root用户

    • uid是0
    • 拥有操作系统的所有权利
    • 该用户有权力覆盖文件系统上普通权限
    • 安装后者删除软件并管理系统文件和目录
    • 大多数设备只能有root控制

    实例

    • 查看当前登录用户的信息
    [root@localhost ~]# id
    uid=0(root) gid=0(root) 组=0(root) 环境
    =unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    
    • 查看文件的拥有者

    • 查看运行进程的用户名
    [root@localhost ~]# ps aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 2 0.0 0.0 0 0 ? S 09:06 0:00 [kthreadd]
    root 3 0.0 0.0 0 0 ? S 09:06 0:01 [ksoftirqd/0]
    root 4 0.1 0.0 0 0 ? R 09:06 0:09 [kworker/0:0]
    root 5 0.0 0.0 0 0 ? S< 09:06 0:00 [kworker/0:0H]
    

    相关的文件

    Linux一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的

    passwd文件

    用于保存用户信息,一般第一行是root用户,下面都是其他用户

    [root@localhost ~]# head -n 1 /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    # 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令
    

    shadow文件

    格式中密码占位置太长了,所以用x来代替,Linux系统会到shadow文件中查找x部分的密码内容

    [root@localhost ~]# head -n 1 /etc/shadow
    root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc
    /vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
    # 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的
    警告天数:密码过期后的宽限时间:账号失效时间:保留字段
    

    密码在 passwd 文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是 $6 ,这个类 型6的加密算法是sha-512。

    group文件

    用户和组的对应关系,会保存在group这个文件中

    [root@localhost ~]# head -n 1 /etc/group
    root:x:0:
    # 这个格式是组名:口令:组标识号:组内用户列表
    

    用户组管理

    groupadd 添加用户组

    groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中

    [root@localhost ~]# groupadd [选项] 组名
    

    选项

    • -g:指定新建工作组的ID
    • -r:创建系统工作组,系统工作组的ID小于500
    • -k:覆盖配置文件/etc/login.defs
    • -o:允许添加组ID号不唯一的工作组
    • -f:如果指定的组已经存在,此选项将失明了仅以成功的状态退出,当与 -g 一起使用,并且指定的 GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)

    实例

    [root@localhost ~]# groupadd hr -g 1000
    [root@localhost ~]# groupadd sale -g 2000
    [root@localhost ~]# groupadd it -g 3000
    [root@localhost ~]# groupadd fd -g 4000
    [root@localhost ~]# tail -n 4 /etc/group
    hr:x:1000:
    sale:x:2000:
    it:x:3000:
    fd:x:4000:
    

    groupmod 修改用户组

    groupmod命令用于更改用户组识别码或者名称

    [root@localhost ~]# groupmod [选项] 名称
    

    选项

    • -g:将组ID改为GID
    • -n:改名
    • -o:允许重复使用GID

    实例

    • 修改fd组的名称为finance
    [root@localhost ~]# groupmod -n finance fd
    [root@localhost ~]# tail -n 1 /etc/group
    finance:x:4000:
    

    groupdel:删除用户组

    groupdel命令用于删除群组

    需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用 户,则必须先删除这些用户后,方能删除群组。

    [root@localhost ~]# groupdel 组名
    

    实例

    • 删除一个用户组
    [root@localhost ~]# groupadd test
    [root@localhost ~]# groupdel test
    

    gpasswd:用户组成员管理

    gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组 中删除

    [root@localhost ~]# gpasswd [选项] 组名
    

    选项

    • -a:将用户添加到组里面
    • -d:从组里删除用户
    • -A:指定管理员
    • -M:指定组成员和-A的用途差不多
    • -R:限制用户登入组,只有组中的用户才可以用newgrp加入该组

    实例

    • 创建用户test,并且加入it组
    [root@localhost ~]# useradd test
    [root@localhost ~]# gpasswd -a test it
    正在将用户“test”加入到“it”组中
    [root@localhost ~]# cat /etc/group |grep it:
    it:x:3000:test
    # 在组文件中,可以看到这个组的成员
    [root@localhost ~]# id test
    uid=6667(test) gid=6667(test) 组=6667(test),3000(it)
    # 在用户的信息中,可以看到这个用户的所属组
    

    用户管理

    useradd:添加用户

    uaeradd可以用来添加新的用户

    [root@localhost ~]# useradd [选项] 用户名
    

    新建用户home目录下的bash开头的文件时从/etc/skel/中复制过去的

    如果创建一个用户时,未指定任何选项,系统会创建一个和用户名相同的组作为用户的 Primary Group

    选项

    • -c comment:指定一段注释性描述
    • -d :指定用户的主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
    • -m:创建用户的主目录
    • -g:指定用户所属的用户组,默认会创建一个和用户名差不多的用户组
    • -G:指定用户的附加组,一个用户可以属于多个附加组
    • -s:指定用户登录的shell
    • -u:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号
    • -r:创建系统用户

    实例

    • 添加一般用户
    [root@localhost ~]# useradd test1
    
    • 为添加的用户指定相应的用户组
    [root@localhost ~]# useradd -g root test2
    
    • 为新添加的用户指定home目录
    [root@localhost ~]# useradd -m /home/test3 test3
    
    • 创建一个不给登录的用户
    [root@localhost ~]# useradd -s /sbin/nologin test4
    

    usermod:修改用户信息

    usermod用于修改用户的的各类设定

    [root@localhost ~]# usermod [选项] 用户名
    

    选项

    • -c:修改用户账号的备注信息

    • -a:追加,默认的修改是覆盖

    • -d:修改用户登入时的目录

    • -e:修改账号的有效期限

    • -f:修改在密码过期后多少天关闭该账号

    • -g:修改用户所属群组

    • -G:修改用户所属附加组

    • -l:修改用户账号的名称

    • -L:锁定用户密码,使密码无效

    • -a:修改用户登录后使用是shell

    • -u:修改用户uid

    • -U:解除密码锁定

    实例

    • 更改登录的目录
    [root@localhost ~]# useradd user01
    [root@localhost ~]# usermod -d /home user01
    [root@localhost ~]# su - user01
    -bash-4.2$ pwd
    /home
    
    • 改变用户的UID
    [root@localhost ~]# usermod -u 6666 user01
    

    userdel:删除用户

    userdel命令用于删除用户账号

    userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件

    [root@localhost ~]# userdel [-r] 用户账号
    

    选项

    • -r:删除用户登入目录以及目录中所有的文件

    passwd文件中的shell

    查看/etc/passwd文件会发现每一行的最后面是我们登录成功以后执行的命令,其中有两种命令使用最为频繁

    • /bin/bash:这个是Linux命令行工具,我么你正常登录后默认进入的就是这个命令行
    • /sbin/nologin:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需 要登录。如果提供登录的功能反而不安全,所以写成nologin

    cat一下/etc/passwd文件

    [root@localhost ~]# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    

    新建一个用户,给他自定义命令

    [root@localhost ~]# useradd -s /bin/vi test
    [root@localhost ~]# tail -n 1 /etc/passwd
    test:x:1000:1000::/home/test:/bin/vi
    

    我们切换到test用户就会发现用户默认进入vi编辑页面

    login.defs

    useradd参照文件

    创建用户时对用户的一些限制,对root用户无效

    [root@atopos ~]# vim /etc/login.defs
    MAIL_DIR /var/spool/mail
    PASS_MAX_DAYS 99999
    PASS_MIN_DAYS 0
    PASS_MIN_LEN 5
    PASS_WARN_AGE 7
    CREATE_HOME yes
    ENCRYPT_METHOD SHA512
    [root@atopos ~]# vim /etc/default/useradd
    SHELL=/bin/bash
    

    chage

    [root@localhost ~]# chage [选项] 用户
    

    选项

    • -d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”
    • -E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
    • -h, --help 显示此帮助信息并推出
    • -I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
    • -l, --list 显示帐户年龄信息
    • -m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
    • -M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”
    • -R, --root CHROOT_DIR chroot 到的目录 -W, --warndays 警告天数 将过期警告天数设为“警告天数”

    实例

    [root@atopos ~]# useradd user01
    [root@atopos ~]# echo 123456 |passwd --stdin user01
    更改用户 user01 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    [root@atopos ~]# chage -d 0 user01 # 强制用户在下次登录的时候换密码
    

    用户密码管理

    root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。

    passwd命令

    [root@localhost ~]# passwd [选项...] 账号名称
    

    选项

    • -n mindays:指定最短使用期限
    • -x maxdays:指定最大使用期限
    • -w warndays:提前多少天开始警告
    • -i inactivedays:非活动期限
    • --stdin:从标准输入接收用户密码

    实例

    [root@localhost ~]# echo "123456" | passwd --stdin username
    

    sudo:提权

    以root用户的身份授权普通用户

    功法修炼等级限制——文件权限

    基本权限 UGO

    文件权限时控制某个用户或者用户组访问某个文件的方式

    UGO设置基本权限

    权限对象

    U:属主

    G:属组

    O:其他人

    权限类型

    r:读 数字:4

    w:写 数字:2

    x:执行 数字:1

    权限管理

    chown:更改文件的属组和属主

    [root@localhost ~]# chown user01:user01 file
    # 更改属主和属组
    [root@localhost ~]# chown :user01 file
    # 只更改属组
    [root@localhost ~]# chown user01 file
    # 只更爱属主
    

    chmod:更改文件权限

    对象:u g o a

    赋值符号:+ - =

    权限类型:r w x 也可以用数字

    [root@localhost ~]# chown u+x file	# 属主增加执行全新啊
    [root@localhost ~]# chown a=rwx	file	# 所有用户赋予rwx权限
    [root@localhost ~]# chown ug=rw,o=r	file	# 属主属组赋予读写,其他人只读
    
    # 使用数字
    [root@localhost ~]# chown 644 file	# 属主拥有读写权限,属组和其他用户只读
    

    chown:改变某个文件的属主属组

    chmod:改变某个文件自身的权限

    r,w,x权限对文件和目录的意义区别

    权限 对文件的影响 对目录的影响
    r(读取) 可以读取文件的内容 可以列出目录的内容,可以使用ls相关命令
    w(写入) 可以更改文件的内容 可以创建或删除目录中的文件,可以使用touch,rm等相关命令
    x(执行) 可以执行可执行文件 可以访问目录里面的内容,可以使用cd等相关命令

    目录权限跟文件权限无关

    ACL设置基本权限(r,w,x)

    UGO设置基本权限:只能一个用户或者一个组或者其他人

    ACL的基本用法

    [root@localhost ~]# setfacl [选项] 文件/目录
    

    选项

    • -m:添加acl设定参数
    • -x:删除acl设定参数
    • -b:移除所有的acl设定参数
    • -R:递归添加acl设定参数
    • -d:添加默认的acl设定参数(目录)

    实例

    [root@atopos ~]# ll file1
    -rw-r--r--. 1 centos it 0 9月 4 11:03 file1
    [root@atopos ~]# getfacl file1
    # file: file1
    # owner: centos
    # group: it
    user::rwgroup::r--
    other::r--
    [root@atopos ~]# setfacl -m u:centos:rw file1 # 增加用户权限
    [root@atopos ~]# setfacl -m u:user05:- file1 # 增加用户权限
    [root@atopos ~]# setfacl -m o::rw file1 # 修改其他人权限
    [root@atopos ~]# ll file1
    -rw-rw-rw-+ 1 centos it 0 9月 4 11:03 file1
    [root@xwz ~]# getfacl file1
    # file: file1
    # owner: centos
    # group: it
    user::rwuser:centos:rwuser:user05:---
    group::r--
    mask::rwother::rw-
    [root@xwz ~]# setfacl -m g:hr:r file1 # 增加组权限
    [root@xwz ~]# setfacl -x g:hr file1 # 删除组权限
    [root@xwz ~]# setfacl -b file1 # 删除所有acl权限
    

    mask

    mask决定了用户对文件的的最高权限,说白了,mask和acl共同控制用户对文件的权限,如果mask权限为r--,acl权限为rwx,则最后的权限只能时r--

    mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。

    设置mask权限

    [root@atopos ~]# setfacl -m m::--- file1
    [root@atopos ~]# getfacl file1
    # file: file1
    # owner: centos
    # group: it
    user::rwgroup::r-- 		#effective:---
    mask::---
    other::---
    

    default

    一般正对访问目录,默认权限独立与该目录本身的权限,规定了在该目录中创建文件的默认acl权限

    default可以指定在目录中创建的新文件的初始acl权限

    实例

    用户centos能够对/home以及以后再/home下创建的文件具有读写执行权限

    [root@atopos ~]# setfacl -m u:centos:rwx /home
    [root@atopos ~]# setfacl -m d:u:centos:rwx /home
    [root@atopos ~]# getfacl /home
    getfacl: Removing leading '/' from absolute path names
    # file: home
    # owner: root
    # group: root
    user::rwx
    user:centos:rwx
    group::r-x
    mask::rwx
    other::r-x
    default:user::rwx
    default:user:centos:rwx
    default:group::r-x
    default:mask::rwx
    default:other::r-x
    

    特殊权限

    文件除了上述的r,w,x基本权限,还有三个特殊权限:suid,sgid,sbit(sticky)

    suid

    suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件 时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加 suid 权限,则会显示大写S,属于无效。

    普通用户能够执行 passwd 命令修改自己的密码,修改密码其实就是修改 /etc/shadow 这个文件,查 看 /etc/passwd 这个文件的权限,发现除了 root 其他人没有写权限,但是普通用户能够成功执行 passwd ,其原因就在于 passwd 这个命令的权限是 rwsrw---- ,其中 s 的作用就是让执行命令的人具有和 该命令拥有者相同的权限。

    [root@atopos ~]# ll /usr/bin/passwd 
    -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
    

    实例

    [root@localhost ~]# su - user1
    [user1@localhost ~]$ passwd
    更改用户 user1 的密码 。
    为 user1 更改 STRESS 密码。
    (当前)UNIX 密码:
    
    • 保持这个会话,新建一个会话,查看系统进程,可以看到当前是root用户在执行passwd命令
    [root@localhost ~]# ps -aux |grep passwd
    root 7521 0.0 0.1 170760 2052 pts/0 S+ 10:24 0:00 passwd
    
    • 如果想自己添加suid权限,可以输入下面两个命令
    chmod u+s file
    chmod 4765 file
    

    sgid

    sgid 属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行 该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加 sgid 权限,则会 显示大写S,属于无效。

    运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如 果 /home/user1 目录具有 sgid 权限,且所属组是 user1 ,则任何用户在 /home/user1 下创建的子目录 或者文件的所属组都是 user1 。

    实例

    • 设置sgid,让用户在workdir下创建的文件都属于worker组
    [root@atopos ~]# mkdir workdir
    [root@atopos ~]# chmod g+s workdir/
    [root@atopos ~]# cd workdir/
    [root@atopos workdir]# touch file2
    [root@atopos workdir]# ll
    total 0
    -rw-r--r--. 1 root root   0 Jan 13 07:04 file
    -rw-r--r--. 1 root worker 0 Jan 13 07:05 file2
    

    sbit(sticky)

    sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777 或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)

    实例

    • 设置sbit,让普通用户只能创建文件,不能删除文件
    [root@localhost ~]# chmod 777 /workdir/
    [root@localhost ~]# chmod o+t /workdir/
    [root@localhost ~]# su - user1
    [user1@localhost ~]$ cd /workdir/
    [user1@localhost workdir]$ touch user1file
    [user1@localhost workdir]$ exit
    登出
    [root@localhost ~]# su - user2
    [user2@localhost ~]$ cd /workdir/
    [user2@localhost workdir]$ touch user2file
    [user2@localhost workdir]$ rm -rf user1file # 不给删除别人的文件
    rm: 无法删除"user1file": 不允许的操作
    [user2@localhost workdir]$ rm -rf user2file # 只能删除自己的文件
    [user2@localhost workdir]$ ll
    总用量 0
    -rw-rw----+ 1 user1 worker 0 4月 14 11:11 user1file
    

    chattr文件属性

    chattr命令用来改变文件的属性

    这项指令可以改变存放在文件或者目录属性,这些属性共有一下8种模式:

    • a:让文件或目录仅供附加用途
    • b:不更新文件或目录的最后存取时间
    • c:将文件或目录压缩后存放
    • d:将文件或目录排除在倾倒操作之外
    • i:不得任意更动文件或目录
    • s:保密性删除文件或目录
    • S:即时更新文件或目录
    • u:预防意外删除
    [root@localhost ~]# chattr [-RV][+/-/=<属性>][文件或目录...
    

    选项

    • -R:递归处理,将指定目录下的所有文件及子目录一并处理
    • -v <版本编号>:设置文件或目录版本
    • -V:显示指令执行过程
    • +<属性>:开启文件或目录的该项属性
    • -<属性>:关闭文件或目录的该项属性
    • = <属性>:指定文件或目录的该项属性

    实例

    • 使用chattr命令防止系统中某个关键文件被修改
    [root@localhost ~]# chattr +i /etc/resolv.conf
    [root@localhost ~]# lsattr /etc/resolv.conf
    ----i----------- /etc/resolv.conf
    [root@localhost ~]# echo test >> /etc/resolv.conf
    -bash: /etc/resolv.conf: 权限不够
    
    [root@localhost ~]# chattr +a /var/log/messages
    [root@localhost ~]# lsattr /var/log/messages
    -----a---------- /var/log/messages
    [root@localhost ~]# echo > /var/log/messages # 不允许清空日志
    -bash: /var/log/messages: 不允许的操作
    

    umask

    umask命令指定在建立文件时预设的权限掩码,进程 新建文件、目录的默认权限会收到umask的影响, umask表示要减掉得到权限。

    umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后, 即可产生建立文件时预设的权限。

    [root@localhost ~]# umask [选项][权限掩码]
    

    选项

    • -S:以文字的方式来表示权限掩码

    实例

    • 查看当前用户的umask权限
    [user01@atopos ~]$ umask
    0002
    
    • 查看最终所有的权限
    [user01@atopos ~]$ umask -S
    u=rwx,g=rwx,o=rx
    
    • 修改umask数值(临时)
    [user01@atopos ~]$ umask 0000
    [user01@atopos ~]$ mkdir dir1
    [user01@atopos ~]$ ll
    total 0
    drwxrwxrwx. 2 user01 user01 6 Jan 13 07:28 dir1
    
    • 修改umask数值(永久)
    [root@localhost ~]# vim /etc/profile
    --------------
    59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    60 umask 002
    61 else
    62 umask 022
    63 fi
    ---------------
    [root@localhost ~]# source /etc/profile # 立即在当前shell中生效
    
    • 通过umask决定新建用户 HOME 目录的权限
    [root@localhost ~]# vim /etc/login.defs
    -----------------
    61 # The permission mask is initialized to this value. If not specified,
    62 # the permission mask will be initialized to 022.
    63 UMASK 077
    ------------------
    

    正在运行中的功法——进程process

    什么是进程

    进程是cpu进行资源分配的最小单位,是一个在系统中运行的程序

    进程是已启动的可执行程序的运行实例,进程有一下部分组成:

    • 已分配的内存空间
    • 安全属性,包括所有权凭据和特权
    • 进程代码的一个或多个执行线程
    • 进场状态

    进程:程序运行的过程,动态,有生命周期及运行状态

    进程类型

    守护进程:在系统引导启动过程中启动的进程,跟终端无关

    前台进程:跟终端相关,通过终端启动的进程

    进程的生命周期

    父进程复制自己的地址空间(fork)创建一个新的子进程结构,每个新进程分配一个唯一的进程ID(PID),满足跟踪安全之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进 程都是第一个系统进程的后代:

    centos5/6:init

    centos7: systemd

    进程状态:

    子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代 码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。 当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之 为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的 程序代码。

    进程状态

    在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对 CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

    R:运行状态(runing): 表明进程要么在运行中要么在运行队列里,并不意味着进程一定在运行中。

    S:睡眠状态(sleeping):意味着进程在等待事件的完成(这里的睡眠有时候也叫做可中断睡眠)

    D:磁盘睡眠状态(Disk sleep): 有时候也叫做不可中断睡眠,在这个状态的进程通常会等待IO的结束

    T:停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过 发送SIGCNT信号让进程继续运行。

    Z:僵尸状态(zombie):通知父进程回收所有的资源

    X:死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

    • 僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者 waitpid 来获取子进程的状态信息,那么子进程的状态描述符依然保存在系统中。
    • 孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一 个孤儿进程,它会被init进程接管
    • 参考博客:僵尸进程与孤儿进程解析_TerryZjl的博客-CSDN博客_僵尸进程和孤儿进程的区别

    查看进程

    ps命令

    静态查看进程ps 注: ps -aux 不同于 ps aux

    常用组合:aux
    u:以用户为中心组织进程状态信息显示
    a:与终端相关的进程;
    x:与终端无关的进程;
    ~]# ps -uax
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    用户 进程ID CPU占用 内存占用
    VSZ:Virtual memory SiZe 虚拟内存集
    RSS:ReSident Size 常驻内存集———其他的都可以放入交换内存中
    STAT:进程状态
    R:running
    S:interruptable sleeping
    D:uninterruptable sleeping
    T:stopped
    Z:zombie
    +:前台进程
    l:多线程进程
    N:低优先级进程
    <:高优先级进程
    s:session leader
    START:启动时间
    TIME:运行占据cpu的累积时长
    COMMAND:由哪个命令来启动的相关进程
    常用组合:ps -ef
    -e:显示所有进程
    -f:显示完整格式程序信息
    常用组合:ps -eFH
    -F:显示完成格式的进程信息
    -H:以进程层级格式显示进程相关信息
    常用组合:eo,axo
    自定义想要查询的字段值
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
    -axo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wcha n:14,comm
    ni:nice值
    pri:priority,优先级
    psr:processor,CPU
    rtprio:实时优先级
    
    [root@atopos ~]# ps aux |less
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.3 193720  6768 ?        Ss   05:38   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root          2  0.0  0.0      0     0 ?        S    05:38   0:00 [kthreadd]
    root          3  0.0  0.0      0     0 ?        S    05:38   0:00 [ksoftirqd/0]
    root          5  0.0  0.0      0     0 ?        S<   05:38   0:00 [kworker/0:0H]
    root          7  0.0  0.0      0     0 ?        S    05:38   0:00 [migration/0]
    root          8  0.0  0.0      0     0 ?        S    05:38   0:00 [rcu_bh]
    
    

    USER:运行进程的用户

    PID:进程ID

    %CPU:CPU占用率

    %MEM:内存占用率

    VSZ:占用虚拟内存

    RSS:占用实际内存 驻留内存

    TTY:程序运行的终端

    STAT:进程状态 man ps(/STATE)

    • R(runing):运行状态
    • S(sleeping):浅度睡眠状态
    • D(disk sleep):磁盘睡眠状态
    • T(stopped):停止进程
    • X(dead):死亡状态
    • Z(zombie):僵尸状态

    START:进程的启动时间

    TIME:进程占用CPU的总时间

    COMMAND:进程文件,进程名

    [root@atopos ~]# ps aux --sort %cpu |less # 按照CPU使用率排序
    [root@atopos ~]# ps aux --sort -%cpu |less
    [root@atopos ~]# ps aux --sort rss |less
    [root@atopos ~]# ps aux --sort -rss |less
    
    [root@atopos ~]# yum -y install httpd
    [root@atopos ~]# systemctl start httpd
    [root@atopos ~]# ps auxf |grep httpd # 按照父子进程层级显示
    root 29276 0.0 0.0 112724 988 pts/1 S+ 14:25 0:00
    \_ grep --color=auto httpd
    root 29267 0.2 0.2 230408 5192 ? Ss 14:24 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
    /usr/sbin/httpd -DFOREGROUND
    apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
    /usr/sbin/httpd -DFOREGROUND
    apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
    /usr/sbin/httpd -DFOREGROUND
    apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
    /usr/sbin/httpd -DFOREGROUND
    apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00 \_
    /usr/sbin/httpd -DFOREGROUND
    [root@xwz ~]# ps -ef # 精简显示
    

    自定义显示字段

    [root@atopos ~]# cat /run/sshd.pid
    [root@atopos ~]# ps aux |grep sshd
    [root@atopos ~]# pgrep -l sshd
    [root@atopos ~]# pidof sshd
    

    查看进程树(需要安装pstree)

    [root@atopos ~]# pstree
    

    top命令

    动态显示系统相关资源的管理器,有点类似于windows当中的任务管理器

    [root@atopos ~]# top
    [root@atopos ~]# top -d 1 # 一秒钟刷新一次
    [root@atopos ~]# top -d 1 -p 6995 # 查看指定PID
    [root@atopos ~]# top -d 1 -p 6995,1 # 查看多个PID进程
    [root@atopos ~]# top -d 1 -u apache # 查看指定用户的进程
    [root@atopos ~]# top -d 1 -b -n 2 > top.txt # 将2次top信息写入到文件
    

    第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平 均值,数值越小意味着负载越低)。

    第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

    第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源 百分比等。

    第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。(buffer和cache之间的区 别,cache是提高cpu和内存之间的数据交换速度,buffer是io设备和存储设备之间的缓冲区)

    第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

    进程信息:

    • h|?:帮助
    • M:按内存的使用排序
    • P:按CPU使用排序
    • N:以PID的大小排序
    • R:对排序进行反转
    • f:自定义显示字段
    • 1:显示所有CPU的负载
    • k:输入信号
    • < :向前
    • > :向后
    • z:彩色
    • W:保存top环境设置 ~/.toprc

    信号控制进程

    [root@atopos ~]# kill -l # 列出所有支持的信号
    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
    6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
    11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
    16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
    21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
    31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
    38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42)
    SIGRTMIN+8
    43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47)
    SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52)
    SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57)
    SIGRTMAX-7
    58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62)
    SIGRTMAX-2
    63) SIGRTMAX-1 64) SIGRTMAX
    

    常用信号

    信号 信号名 作用
    1 SIGHUP 重新加载配置
    2 SIGINT 键盘中断^C
    3 SIGQUIT 键盘退出
    9 SIGKILL 强制终止
    15 SIGTERM 终止(正常结束),缺省信号
    18 SIGCONT 继续
    19 SIGSTOP 停止
    20 SIGTSTP 暂停
    [root@atopos ~]# ps aux |grep sshd
    root 6995 0.0 0.2 112756 4356 ? Ss 9月09 0:00
    /usr/sbin/sshd -D
    root 31872 5.0 0.2 160844 5620 ? Ss 18:56 0:00 sshd:
    root@pts/1
    root 31917 0.0 0.0 112728 988 pts/1 S+ 18:56 0:00 grep --
    color=auto sshd
    [root@atopos ~]# kill -1 6995 # 重新加载配置文件
    

    实例

    测试信号9和信号15

    [root@atopos ~]# touch file1 file2
    [root@atopos ~]# tty
    /dev/pts/1
    [root@atopos ~]# vim file1
    [root@atopos ~]# tty
    /dev/pts/2
    [root@atopos ~]# vim file2
    [root@atopos ~]# ps aux |grep vim
    root 32072 0.2 0.2 151532 5064 pts/1 S+ 19:09 0:00 vim file1
    root 32127 0.1 0.2 151532 5080 pts/2 S+ 19:09 0:00 vim file2
    root 32176 0.0 0.0 112728 988 pts/3 S+ 19:09 0:00 grep --
    color=auto vim
    [root@atopos ~]# kill 32072
    [root@atopos ~]# kill -9 32127
    [root@atopos ~]# killall vim # 杀死所有vim进程
    

    测试信号18和信号19

    [root@atopos ~]# ps aux |grep httpd
    root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
    /usr/sbin/httpd -DFOREGROUND
    apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    root 32229 0.0 0.0 112724 988 pts/3 S+ 19:14 0:00 grep --
    color=auto httpd
    [root@atopos ~]# kill -19 29267
    [root@atopos ~]# ps aux |grep httpd
    root 29267 0.0 0.2 230408 5192 ? Ts 14:24 0:01
    /usr/sbin/httpd -DFOREGROUND
    apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    root 32231 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
    color=auto httpd
    [root@atopos ~]# kill -18 29267
    [root@atopos ~]# ps aux |grep httpd
    root 29267 0.0 0.2 230408 5192 ? Ss 14:24 0:01
    /usr/sbin/httpd -DFOREGROUND
    apache 29268 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29269 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29270 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29271 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    apache 29272 0.0 0.1 232492 3160 ? S 14:25 0:00
    /usr/sbin/httpd -DFOREGROUND
    root 32233 0.0 0.0 112724 984 pts/3 S+ 19:15 0:00 grep --
    color=auto httpd
    

    踢出远程登录用户

    [root@atopos ~]# w
    19:21:16 up 1 day, 6:26, 4 users, load average: 0.00, 0.01, 0.05
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root :0 :0 四11 ?xdm? 2:05m 0.50s
    /usr/libexec/gnome-se
    root pts/0 :0 四11 5days 1.36s 0.36s -bash
    root pts/1 192.168.222.1 18:56 4.00s 0.14s 0.02s w
    centos pts/2 192.168.222.1 19:21 3.00s 0.04s 0.04s -bash
    [root@atopos ~]# pkill -u centos
    [root@atopos ~]# pkill -t pts/2 # 终止pts/2上所有进程
    [root@atopos ~]# pkill -9 -t pts/2 # 终止pts/2上所有进程,并结束pts/2
    

    进程优先级 nice

    Linux进程调度及多任务

    每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程 (和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速 切换,从而给用户多个进程在同时运行的假象。(并发)

    相对优先级

    由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常 规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他 一些调度策略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值, 可以有40种不同级别的nice值。

    进程优先级 0-99:实时优先级,数字越小,优先级越低

    00-139:静态优先级,数字越小,优先级越高

    进程默认启动时nice为0,优先级为120

    nice值越高表示优先级越低,例如+19,该进程容易将CPU使用量让给其他进程

    nice值越低表示优先级越高,例如-20,该进程更倾向于不让出CPU

    查看进程的nice级别

    使用ps查看

    [root@atopos ~]# ps axo pid,command,nice --sort=nice
    [root@atopos ~]# ps axo pid,command,nice,cls --sort=-nice
    

    TS表示该进程使用的调度策略为SCHED_OTHER

    使用top查看

    NI:实际nice级别

    PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39

    启动具有不同nice级别的进程

    启动进程的时候为进程指定nice值

    启动进程时,通常会继承父进程的nice级别,默认为0

    [root@atopos ~]# nice -n -5 sleep 6000 &
    [root@atopos ~]# ps axo command,pid,nice |grep sleep
    [root@atopos ~]# nice -n -20 systemctl start httpd
    [root@atopos ~]# ps axo pid,command,nice,cls |grep httpd
    10146 /usr/sbin/httpd -DFOREGROUN 0 TS
    10161 /usr/sbin/httpd -DFOREGROUN 0 TS
    10162 /usr/sbin/httpd -DFOREGROUN 0 TS
    10163 /usr/sbin/httpd -DFOREGROUN 0 TS
    10164 /usr/sbin/httpd -DFOREGROUN 0 TS
    10165 /usr/sbin/httpd -DFOREGROUN 0 TS
    10167 grep --color=auto httpd 0 TS
    

    更改现有进程的nice级别

    • 使用top更改nice级别

    r 调整进程的优先级(Nice Level) (-20高) - - - 0 - - - (19低)

    • 使用shell更改nice级别
    [root@atopos ~]# sleep 7000 &
    [2] 10267
    [root@atopos ~]# renice -20 10267
    10267 (进程 ID) 旧优先级为 0,新优先级为 -20
    

    丹田控制——存储管理

    磁盘管理

    认识Linux上的磁盘

    从工作原理区分

    机械硬盘HDD

    固态硬盘SSD

    从磁盘尺寸区分

    SATA

    HDD

    从磁盘主要接口区分

    SATA(Serial ATA)

    SAS(Serial Attached SCSI)

    磁盘设备的命名

    物理磁盘:/dev/sd[a-z]

    KVM虚拟化:/dev/vd[a-z]/dev/sd[a-z]

    设备命名:

    IDE:/dev/hd

    SCSI,SATA,SAS,USB:/dev/sb

    不同设备上:[a-z]

    同一设备上:[1,2,3,,]

    分区方式的区别

    MBR <2TB fdisk 4个主分区,扩展分区,逻辑分区

    GPT >2TB gdisk 128个分区

    MBR: 使用32位表示扇区数,分区不超过2T ,按柱面进行分区,4个主分区;3主分区+1扩展(N个逻辑分 区)。

    GPT:支持128个分区,使用64位,使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT 分区 表自动备份在头和尾两份

    注意:从MBR转到GPT,或从GPT转换到MBR会导致数据全部丢失

    存储结构与磁盘划分

    Linux上的目录结构前面有详细的结束,可以看前面的内容

    物理设备的命名规则

    常见的硬件设备及其文件名称

    硬件设备 文件名称
    IDE设备 /dev/hd[a-d]
    SCSI/SATA/U盘 /dev/sd[a-p]
    软驱 /dev/fd[0-1]
    打印机 /dev/lp[0-15]
    光驱 /dev/cdrom
    鼠标 /dev/mouse
    磁带机 /dev/st0或/dev/ht0

    文件系统与数据资料

    文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。

    文件系统 解释
    Ext3 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据 的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分 之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便 在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
    Ext4 Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批 量分配block块,从而极大地提高了读写效率。
    XFS 是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意 外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费 极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需 求。

    格式化后发生的事情

    • Linux创建一个硬盘地图'superblock',记录此filesystem 的整体信息,包括inode/block的总量、 使用量、剩余量, 以及文件系统的格式与相关信息等;
    • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码,默 认一个inode表格128字节,一个block记录消耗4B,记录满了后会新建inode用于扩展。
      • 该文件的访问权限(read、write、execute)
      • 该文件的所有者与所属组(owner、group)
      • 该文件的大小(size)
      • 该文件的创建或内容修改时间(ctime)
      • 该文件的最后一次访问时间(atime)
      • 该文件的修改时间(mtime)
      • 文件的特殊权限(SUID、SGID、SBIT)
      • 该文件的真实数据地址(point)
    • block:用于存储数据

    计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘 结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口, 这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。

    mount 挂载硬件设备

    [root@atopos ~]# mount 设备名 挂载点
    

    选项

    -a:挂载所有在/etc/fstab中定义的磁盘设备

    -t:指定文件系统的类型

    直接使用mount,只是临时挂载,必须将分区信息写入/etc/fstab中,在使用mount -a挂载信息文件中的设备

    第一个字段:挂载的设备

    • 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)

    第二个字段:挂载的目录

    • 指定要挂载到那个目录下面,需要事前创建好该目录

    第三个字段:格式类型

    • 指定文件的格式类型,

    第四个字段:权限选项

    • 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async

    第五个字段:是否备份

    • 若为1则开机后使用dump进行磁盘备份,为0则不备份

    第六个字段:是否自检

    • 若为1则开机后自动进行磁盘自检,为0则不自检

    umount 撤销挂载

    撤销已经挂载的设备文件 umount [挂载点/设备文件]

    [root@atopos ~]# umount /dev/sdb1
    

    添加磁盘设备

    fdisk 管理磁盘分区

    [root@atopos ~]# fdisk [磁盘名称]
    
    选项
    • m:查看可用的全部参数
    • n:添加新的分区
    • d:删除某个分区文件
    • l:列出所有可用的分区类型
    • t:改变某个分区的类型
    • p:查看分区信息
    • w:保存并退出
    • q:不保存直接退出
    挂载磁盘的步骤
    1. 添加一块磁盘
    2. 使用fdisk创建分区
    3. 使用mkfs.ext4进行文件系统格式化
    4. 使用mount挂载分区
    

    du 查看文件数据的占用量

    [root@atopos ~]# du [选项] [文件]
    
    [root@atopos ~]# du -sh /*
    0	/app
    0	/bin
    113M	/boot
    0	/dev
    35M	/etc
    0	/home
    0	/lib
    0	/lib64
    0	/media
    0	/mnt
    0	/opt
    du: cannot access ‘/proc/20259/task/20259/fd/4’: No such file or directory
    du: cannot access ‘/proc/20259/task/20259/fdinfo/4’: No such file or directory
    du: cannot access ‘/proc/20259/fd/4’: No such file or directory
    du: cannot access ‘/proc/20259/fdinfo/4’: No such file or directory
    0	/proc
    44K	/root
    9.6M	/run
    0	/sbin
    0	/srv
    0	/sys
    0	/tmp
    1.4G	/usr
    368M	/var
    
    选项
    • -a或-all:显示目录中个别文件的大小。
    • -b或-bytes:显示目录或文件大小时,以byte为单位。
    • -c或--total:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
    • -D或--dereference-args:显示指定符号连接的源文件大小。
    • -h或--human-readable:以K,M,G为单位,提高信息的可读性。
    • -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
    • -k或--kilobytes:以1024 bytes为单位。
    • -l或--count-links:重复计算硬件连接的文件。
    • -L<符号连接>或--dereference<符号连接>:显示选项中所指定符号连接的源文件大小。
    • -m或--megabytes:以1MB为单位。
    • -s或--summarize:仅显示总计。
    • -S或--separate-dirs:显示个别目录的大小时,并不含其子目录的大小。
    • -x或--one-file-xystem:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
    • -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
    • --exclude=<目录或文件>:略过指定的目录或文件。
    • --max-depth=<目录层数>:超过指定层数的目录后,予以忽略。
    • --help:显示帮助。
    • --version:显示版本信息。

    df 查看文件系统占用情况

    pass

    添加交换分区

    SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时 存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术

    在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍

    [root@atopos ~]# mkswap /dev/sdb1
    Setting up swapspace version 1, size = 5242876 KiB
    no label, UUID=494ce424-6f8e-4dc7-a1f7-7df45da24928
    [root@atopos ~]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:           1.8G        195M        1.1G        9.5M        469M        1.3G
    Swap:          2.0G          0B        2.0G
    [root@atopos ~]# sw
    swaplabel    swapoff      swapon       switch_root  
    [root@atopos ~]# swapon /dev/sdb1 
    [root@atopos ~]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:           1.8G        200M        1.1G        9.5M        469M        1.3G
    Swap:          7.0G          0B        7.0G
    

    命令

    mkswap [磁盘路径]	# 格式化swap
    swapon [磁盘路径]	# 挂载swap分区
    swapoff [磁盘路径]	# 卸载swap分区
    参数:
    -a:全部
    

    磁盘容量配额

    实例

    描述:

    • 创建5个用户user1,user2,user3,user4,user5,密码和用户名相同,初始组为usergrp组。
    • 5个用户都可以取得300M的磁盘使用空间,文件数量不限。超过250M,给于提示。
    • usergrp这个组内成员最大使用空间1GB。
    • 如果有用户超过soft限制,给14天的宽限时间。
    准备磁盘
    • 创建分区
    [root@atopos ~]# fdisk /dev/sdb
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): 
    Using default response p
    Partition number (1-4, default 1): 
    First sector (2048-41943039, default 2048): 
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
    Partition 1 of type Linux and of size 2 GiB is set
    
    Command (m for help): p
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x29af810b
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   83  Linux
    
    • lsblk 查看当前分区情况
    [root@atopos ~]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   20G  0 disk 
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   19G  0 part 
      ├─centos-root 253:0    0   17G  0 lvm  /
      └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
    sdb               8:16   0   20G  0 disk 
    └─sdb1            8:17   0    2G  0 part 
    sr0              11:0    1 1024M  0 rom  
    
    • 格式化分区的文件系统
    [root@atopos ~]# mkfs.ext4 /dev/sdb1
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    131072 inodes, 524288 blocks
    26214 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=536870912
    16 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
    	32768, 98304, 163840, 229376, 294912
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done 
    
    • 创建目录并挂载
    [root@atopos ~]# mkdir /mnt/mountpoint1
    [root@atopos ~]# mount /dev/sdb
    sdb   sdb1  
    [root@atopos ~]# mount /dev/sdb1 /mnt/mountpoint1/
    [root@atopos ~]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root xfs        17G  2.2G   15G  13% /
    devtmpfs                devtmpfs  898M     0  898M   0% /dev
    tmpfs                   tmpfs     910M     0  910M   0% /dev/shm
    tmpfs                   tmpfs     910M  9.7M  901M   2% /run
    tmpfs                   tmpfs     910M     0  910M   0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  146M  869M  15% /boot
    tmpfs                   tmpfs     182M     0  182M   0% /run/user/0
    overlay                 overlay    17G  2.2G   15G  13% /var/lib/docker/overlay2/ea6bd330b5a7154860e3e7b90affaf8b12673a6f71ff35665ecea39a47e3bce0/merged
    /dev/sdb1               ext4      2.0G  6.0M  1.8G   1% /mnt/mountpoint1
    
    准备用户
    [root@atopos ~]# setenforce 0
    # 临时关闭SELinux
    [root@atopos ~]# getenforce 
    Permissive
    [root@atopos ~]# groupadd usergrp
    [root@atopos ~]# for i in {1..5}; do useradd -g usergrp -b /mnt/mountpoint1 user$i; done
    
    确保文件系统支持
    • 检查挂载点是否支持quota配置
    [root@atopos ~]#  mount | grep mountpoint1
    /dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,data=ordered)
    
    • 重新挂载,让文件系统支持quota配置
    [root@atopos ~]#  mount -o remount,usrquota,grpquota /mnt/mountpoint1/
    [root@atopos ~]#  mount | grep mountpoint1
    /dev/sdb1 on /mnt/mountpoint1 type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)
    [root@atopos ~]# 
    
    
    安装 quota
    • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
    • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

    quotacheck主要参数

    • -a:扫描所有在/etc/mtab内含有quota参数的文件系统
    • -u:针对用户扫描文件与目录的使用情况,会新建一个aquota.user文件
    • -g:针对用户组扫描文件与目录的使用情况,会新增一个aquota.group文件
    • -v:显示扫描过程的信息
    [root@atopos ~]# yum install -y quota
    
    开启 quota
    [root@atopos ~]# quotacheck -avug
    quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
    quotacheck: Scanning /dev/sdb1 [/mnt/mountpoint1] done
    quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
    quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
    quotacheck: Cannot stat old user quota file /mnt/mountpoint1/aquota.user: No such file or directory. Usage will not be subtracted.
    quotacheck: Cannot stat old group quota file /mnt/mountpoint1/aquota.group: No such file or directory. Usage will not be subtracted.
    quotacheck: Checked 8 directories and 15 files
    quotacheck: Old file not found.
    quotacheck: Old file not found.
    [root@atopos ~]# quotaon -avug
    /dev/sdb1 [/mnt/mountpoint1]: group quotas turned on
    /dev/sdb1 [/mnt/mountpoint1]: user quotas turned on
    
    编辑配额配置
    [root@atopos ~]# edquota -u user1
    

    • 可以将针对user1的限制复制给user2
    [root@atopos ~]# edquota -p user1 -u user2
    
    • 查看限制情况
    [root@atopos ~]# repquota -as
    *** Report for user quotas on device /dev/sdb1
    Block grace time: 7days; Inode grace time: 7days
                            Space limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    root      --     20K      0K      0K              2     0     0       
    user1     --     16K    245M    293M              4     0     0       
    user2     --     16K    245M    293M              4     0     0       
    user3     --     16K      0K      0K              4     0     0       
    user4     --     16K      0K      0K              4     0     0       
    user5     --     16K      0K      0K              4     0     0      
    
    测试
    [user1@atopos ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
    sdb1: warning, user block quota exceeded.
    sdb1: write failed, user block limit reached.
    dd: 写入"bigfile" 出错: 超出磁盘限额
    记录了30+0 的读入
    记录了29+0 的写出
    307183616字节(307 MB)已复制,1.96853 秒,156 MB/秒
    [user1@atopos ~]$ du -sh *
    293M bigfile
    [user1@atopos ~]$
    

    quota 命令

    Linux quota命令用于显示磁盘已使用的空间与限制。

    执行quota指令,可查询磁盘空间的限制,并得知已使用多少空间

    选项:

    • -g 列出群组的磁盘空间限制。
    • -q 简明列表,只列出超过限制的部分。
    • -u 列出用户的磁盘空间限制。
    • -v 显示该用户或群组,在所有挂入系统的存储设备的空间限制。
    • -V 显示版本信息。

    ln 链接

    [root@atopos ~]# ln [选项] 源文件 目标文件
    

    选项

    • -s:创建“符号链接”(如果不带-s参数,则默认创建硬链接)
    • -f:强制创建文件或目录的链接
    • -i:覆盖前先询问
    • -v:显示创建链接的过程

    链接方式

    在Linux系统中存在硬链接和软连接两种文件

    • 硬链接(hard link):
      • 可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所 以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文 件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。 换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以 通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。

    • 软链接(也称为符号链接[symbolic link]):
      • 仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是, 当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具 有一样的性质

    软链接和硬链接的区别

    硬链接的特点

    • 不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的 数据都会发生改变。
    • 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
    • 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
    • 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的 硬链接不能连接目录

    软链接的特点

    • 不论是修改源文件(check),还是修改软链接文件(check-soft),另一个文件中的数据都会 发生改变。
    • 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显 示文件不存在。
    • 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是 源文件的文件 名及 inode 号。
    • 软链接可以链接目录。 软链接可以跨分区

    实例

    软链接

    [root@localhost ~]# echo "hello" > test
    [root@localhost ~]# ln -s test test123
    [root@localhost ~]# cat test123
    hello
    [root@localhost ~]# ls -l test
    -rw-r--r--. 1 root root 6 Apr 12 06:10 test
    [root@localhost ~]# rm -f test
    [root@localhost ~]# cat test123
    cat: test123: No such file or directory
    

    硬链接

    [root@localhost ~]# echo "hello" > test
    [root@localhost ~]# ln test test123
    [root@localhost ~]# cat test123
    hello
    [root@localhost ~]# ls -l test
    -rw-r--r--. 2 root root 6 Apr 12 06:12 test
    [root@localhost ~]# rm -f test
    [root@localhost ~]# cat test123
    hello
    

    RAID(独立冗余磁盘阵列)

    LVM(逻辑卷管理器)

    储物戒——软件包管理

    软件包的类型

    • 源码包
      • 需要自己编译
    • 二进制包
      • 已编译

    常见的二进制包

    • RedHat/Centos
      • RPM
      • 工具
        • rpm
        • yum:(自动安装,自动解决依赖关系)
    • Ubuntu/Debain
      • DPKG
      • 工具
        • dpkg
        • apt:(自动安装,自动解决依赖关系)

    rpm 包管理

    • rpm工具使用分为安装、查询、验证、更新、删除等操作
    • rpm包的格式说明:
    [root@atopos ~]# rpm -ivh httpd-2.4.6-93.el7.centos.x86_64.rpm
    - httpd:包名
    - 2:主版本号
    - 4:次版本号
    - 6:修订次数,指的是第几次修改bug
    - 93:release(第几次发布,指的是简单的修改参数)
    - e17:操作系统版本
    - x86_64:64位操作系统
    
    • 命令格式:
    [root@atopos ~]# rpm [选项] 软件包
    

    选项

    安装:

    • -i:install的意思,安装软件包
    • -v:显示附加信息,提供更多详细信息
    • -V:校验,对已安装的软件进行校验
    • -h --hash:安装时输出###标记

    查询:

    • -q:查询,一般跟下面的参数配合使用
    • -a:查询所有已安装的软件包
    • -f:系统文件名(查询系统文件属于哪个安装包)
    • -i:显示已安装的rpm软件包信息
    • -l:查询软件包文件的安装位置
    • -p:查询未安装软件包的相关信息
    • -R:查询软件包的依赖性

    卸载:

    • -e:erase
    • --nodeps:忽略依赖

    升级:

    • -U:一般配合vh使用

    实例:安装

    [root@atopos ~]# rpm -ivh
    http://centos.ustc.edu.cn/centos/7/os/x86_64/Packages/httpd-2.4.6-
    93.el7.centos.x86_64.rpm
    [root@localhost ~]# rpm -ivh vim-enhanced-7.4.629-6.el7.x86_64.rpm
    警告:vim-enhanced-7.4.629-6.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID
    f4a80eb5: NOKEY
    错误:依赖检测失败:
    libgpm.so.2()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
    libperl.so()(64bit) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
    perl(:MODULE_COMPAT_5.16.3) 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
    vim-common = 2:7.4.629-6.el7 被 vim-enhanced-2:7.4.629-6.el7.x86_64 需要
    # 需要自己手动解决依赖关系
    # 额外安装选项
    # --nosignature 不检验软件包的签名
    # --force 强制安装软件包
    # --nodeps 忽略依赖关系
    

    实例:查询

    [root@atopos ~]# rpm -q vim-enhanced
    vim-enhanced-7.4.629-8.el7_9.x86_64
    [root@atopos ~]# rpm -qa |grep vim-enhanced
    vim-enhanced-7.4.629-8.el7_9.x86_64
    [root@atopos ~]# rpm -ql vim-enhanced
    /etc/profile.d/vim.csh
    /etc/profile.d/vim.sh
    /usr/bin/rvim
    /usr/bin/vim
    /usr/bin/vimdiff
    /usr/bin/vimtutor
    [root@atopos ~]# rpm -qc openssh-server
    /etc/pam.d/sshd
    /etc/ssh/sshd_config
    /etc/sysconfig/sshd
    [root@atopos ~]# 
    

    实例:卸载

    [root@atopos ~]# rpm -e tree
    

    源码包管理

    源码包安装三绝招

    ./configure 
    #可以指定安装路径,启用或者禁用功能等,最终生成makefile
    make 
    #按Makefile文件编译
    make install
    #按Makefile定义的文件路径安装
    make clean
    #清除上一次make命令所产生的object文件,要重新执行
    configure时,需要执行make clean。
    

    实例

    • 炫酷代码雨编译安装
    [root@localhost ~]# yum -y install ncurses* gcc gcc-c++
    [root@localhost ~]# tar xf cmatrix-1.2a.tar.gz
    [root@localhost ~]# cd cmatrix-1.2a
    [root@localhost cmatrix-1.2a]# ./configure
    [root@localhost cmatrix-1.2a]# make
    [root@localhost cmatrix-1.2a]# make install
    [root@localhost cmatrix-1.2a]# cmatrix
    

    yum 包管理

    yum 介绍

    • yum是一个前端软件包管理器。基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无需繁琐的一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简介而又好记。
    • yum可以自己解决依赖关系

    本地源文件解释

    # 路径
    [root@atopos ~]# ls /etc/yum.repos.d/
    name=centos		#源的描述信息
    baseurl=https://xxxx.xxx.xxx/xx		# 仓库地址
    enabled=1		#启动yum,0为不启用
    gpgcheck=0		#不使用使用公钥检验rpm的正确性,1为使用。
    

    yum 换源

    下载阿里云
    [root@localhost ~]# wget -O /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
    

    yum 常用命令

    yum install -y httpd #安装软件包
    yum update httpd #升级软件包,改变软件设置和系统设置,系统版本内核都升级
    yum install upgrade #升级软件包,不改变软件设置和系统设置,系统版本内核都升级
    yum info httpd #查询包
    yum provides /usr/bin/find #查询命令属于哪一个包
    yum remove -y httpd #卸载
    yum search httpd #按关键字搜索包
    yum clan all #清除缓存
    yum makecache #生成缓存
    yum repolist #查看可用的yum源
    yum grouplist #列出可用组
    

    Linux网络设置

    配置网络服务

    nmtui 图形化配置工具

    [root@atopos ~]# nmtui
    

    通过网卡配置文件修改

    [root@atopos ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=none
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=ens33
    UUID=7cb2fd3e-61dd-4856-87fa-c6db7ec0169b
    DEVICE=ens33
    ONBOOT=yes
    IPADDR=192.168.91.128
    PREFIX=24
    GATEWAY=192.168.91.2
    DNS1=114.114.114.114
    DNS2=114.114.115.115
    
    解释 参数
    设备类型 TYPE=Ethernet
    地址分配模式 BOOTPROTO=static(静态)/dhcp
    网卡名称 NAME=ens33
    是否开机自动启动 ONBOOT=yes
    IP地址 IPADDR=192.168.91.128
    子网掩码 NETMASK=255.255.255.0
    前缀长度 PREFIX=24
    网关地址 GATEWAY=192.168.91.2
    DNS地址 DNS1=114.114.114.114
    • 配置完成以后,需要重启网卡才可以生效
    [root@atopos ~]# systemctl restart network
    

    nmcli 工具详解

    nmcli命令是redhat7或者centos7之后的命令,该命令可以完成网卡上所有的配置工作,并且可以写入 配置文件,永久生效

    • 查看接口状态
    [root@atopos ~]# nmcli device status 
    DEVICE   TYPE      STATE      CONNECTION         
    ens33    ethernet  connected  ens33              
    ens37    ethernet  connected  Wired connection 1 
    docker0  bridge    connected  docker0            
    lo       loopback  unmanaged  --  
    
    • 查看链接信息
    [root@atopos ~]# nmcli connection show
    NAME                UUID                                  TYPE      DEVICE  
    docker0             ca6db5d5-a1a1-478d-8592-112d5283069d  bridge    docker0 
    ens33               122f2554-8762-40c0-8fb7-f92275a6b358  ethernet  ens33   
    Wired connection 1  1099d5fd-29be-3f24-92d3-5f47c981fbae  ethernet  ens37   
    
    • 启动/停止接口
    [root@atopos ~]# nmcli connection up ens33
    [root@atopos ~]# nmcli connection down ens33
    
    • 创建链接
    [root@atopos ~]# nmcli connection add type ethernet con-name dhcp_ens33
    ifname ens33
    
    • 删除链接
    [root@atopos ~]# nmcli connection delete dhcp_ens33
    成功删除连接 'dhcp_ens33'(37adadf4-419d-47f0-a0f6-af849160a4f7)。
    

    net-tools

    • 默认路由
    默认路由:
    route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.2
    

    防火墙

    计划任务及日志管理

    计划任务

    计划任务主要是做一些周期性的任务,目前主要用途是定期备份数据

    at 一次调度执行

    at <TIMESPEC>
    now +5min	# 5分钟
    teatime tomorrow (teatime is 16:00)
    noon +4 days	# 四天
    5pm august 3 2021	# 具体日期
    

    实例

    [root@atopos ~]# yum install -y at
    [root@atopos ~]# systemctl start atd
    [root@atopos ~]# at now +1min
    at> echo hello
    at> <EOT>		# exit/ctrl+D退出
    job 1 at Mon Jan 17 05:44:00 2022
    [root@atopos ~]# atq	# 查看设定的任务
    1	Mon Jan 17 05:44:00 2022 a root
    
    • 通过重定向的方式将事先写好的任务重定向加入到计划任务中
    [root@atopos ~]# vim at.jobs
    touch /root/`date +%F`.txt
    You have mail in /var/spool/mail/root
    [root@atopos ~]#  at now +1min < at.jobs
    job 2 at Mon Jan 17 05:47:00 2022
    [root@atopos ~]# atq
    2	Mon Jan 17 05:47:00 2022 a root
    

    cron 循环调度执行 用户级

    • 使用之前先通过systemctl启动守护进程
    [root@atopos ~]# systemctl start crond
    [root@atopos ~]# systemctl enable crond
    [root@atopos ~]# ps aux|grep crond
    root 6242 0.3 0.0 126380 1656 ? Ss 16:27 0:00
    /usr/sbin/crond -n
    
    • crond每分钟会处理一次计划任务
    • 存储位置
    [root@atopos ~]# ls /var/spool/cron/
    

    常用管理命令

    [root@atopos ~]# crontab -l # 列出当前用户所有计划任务
    [root@atopos ~]# crontab -r # 删除当前用户计划任务
    [root@atopos ~]# crontab -e # 编辑当前用户计划任务
    管理员可以使用 -u username,去管理其他用户的计划任务
    [root@atopos ~]# vim /etc/cron.deny # 这个文件中加入的用户名无法使用cron
    

    语法格式

    # 五个*分别代表
    分 时 日 月 星期 命令
    * 表示任何数字都符合
    0 2 * * * /run.sh # 每天的2点
    0 2 14 * * /run.sh # 每月14号2点
    0 2 14 2 * /run.sh # 每年2月14号2点
    0 2 * * 5 /run.sh # 每个星期5的2点
    0 2 * 6 5 /run.sh # 每年6月份的星期5的2点
    0 2 2 * 5 /run.sh # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
    0 2 2 6 5 /run.sh # 每年6月2号或者星期5的2点
    */5 * * * * /run.sh # 每隔5分钟执行一次
    0 2 1,4,6 * * /run.sh # 每月1号,4号,6号的2点
    0 2 5-9 * * /run.sh # 每月5-9号的2点
    * * * * * /run.sh # 每分钟
    0 * * * * /run.sh # 每整点
    * * 2 * * /run.sh # 每月2号的每分钟
    

    cron 循环调度执行 系统级

    • 文件的位置
    [root@atopos ~]# vim /etc/crontab
    

    [root@atopos ~]# ls /etc/cron.d	# 定义的计划任务每个小时会执行
    0hourly
    [root@atopos ~]# cat /etc/cron.d/0hourly 
    # Run the hourly jobs
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly	# 每小时01分以root身份执行/etc/cron.hourly/目录下的所有脚本
    
    • crond仅仅会执行每小时定义的脚本
    [root@atopos ~]# ls /etc/cron.hourly/
    [root@atopos ~]# cat /etc/cron.hourly/0anacron
    /usr/sbin/anacron -s # anacron是用来检查是否有错过的计划任务需要被执行
    [root@atopos ~]# vi /etc/anacrontab
    1 5 cron.daily nice run-parts /etc/cron.daily
    #每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那
    就执行
    7 25 cron.weekly nice run-parts /etc/cron.weekly
    #每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被
    执行,就会执行
    ©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
    #每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没
    有被执行,那就执行
    

    日志管理

    常见的日志文件(系统,进程,应用程序)

    日志文件 作用描述
    tail /var/log/messages 系统主日志文件
    tail -20 /var/log/messages
    tail -f /var/log/messages 动态查看日志文件的尾部
    tailf /var/log/secure 认证、安全
    tail /var/log/maillog 和邮件postfix相关
    tail /var/log/cron crond、at进程产生的日志
    tail /var/log/dmesg 和系统启动相关
    tail /var/log/audit/audit.log 系统审计日志
    tail /var/log/yum.log yum
    tail /var/log/mysqld.log MySQL
    tail /var/log/xferlog 访问FTP服务器相关
    w 当前登录的用户 /var/log/wtmp
    ast 最近登录的用户 /var/log/btmp
    lastlog 所有用户的登录情况 /var/log/lastlog

    实例

    • 统计登录失败
    [root@atopos ~]#  grep 'Fail' /var/log/secure |awk '{print $11}' |sort |uniq -c |sort -k1 -n -r |head -5
    
    • 统计登录成功
    [root@atopos ~]#  grep 'Accepted' /var/log/secure |awk '{print $(NF-3)}'|sort |uniq -c
    
    • 查看网卡是否已被驱动
    [root@atopos ~]# grep -i eth /var/log/dmesg
    [    5.204426] e1000 0000:02:01.0 eth0: (PCI:66MHz:32-bit) 00:0c:29:2b:aa:29
    [    5.204432] e1000 0000:02:01.0 eth0: Intel(R) PRO/1000 Network Connection
    

    rsyslogd 子系统-日志管理

    • rsyslogd:绝大部分日志记录,和系统操作有关,安全,认证 sshd,su ,计划任务 at,cron httpd/nginx/mysql 等等应用可以以自己的方式记录日志
    [root@atopos ~]# ps aux |grep rsyslogd
    root      16826  0.0  0.3 389172  5916 ?        Ssl  Jan16   0:08 /usr/sbin/rsyslogd -n
    root      20777  0.0  0.0 112816   976 pts/1    S+   06:02   0:00 grep --color=auto rsyslogd
    

    日志可以放在本地,也可以放在服务器上

    • 查询rsyslog相关配置文件
    [root@atopos ~]# rpm -qc rsyslog
    /etc/logrotate.d/syslog
    /etc/rsyslog.conf
    /etc/sysconfig/rsyslog
    
    [root@localhost ~]# vim /etc/rsyslog.conf
    # 告诉rsyslogd进程 哪个设备(facility),关于哪个级别的信息,以及如何处理
    authpriv.* /var/log/secure
    mail.* -/var/log/maillog
    cron.* /var/log/cron
    *.emerg :omusrmsg:*
    authpriv.* * #
    所有终端
    authpriv.* @192.168.1.123 #
    UDP
    authpriv.* @@192.168.1.123 #
    TCP
    

    设备facility相关内容,查看man手册https://man7.org/linux/man-pages/man3/syslog.3.html

    设备类型及日记级别

    设备类型(表示日志类型) 解释
    LOG_AUTHPRIV 安全认证
    LOG_CRON cron和at
    LOG_DAEMON 后台进程
    LOG_FTP frp进程
    LOG_KERN 内核信息
    LOG_LOCAL0 through LOG_LOCAL7 用户自定义设备
    LOG_LPR 打印机子系统
    LOG_MAIL 邮件系统
    LOG_NEWS 新闻子系统
    LOG_SYSLOG syslogd自身产生的日志
    • 日志级别
    级别(日志的重要级别) 解释
    LOG_EMERG 紧急,致命,服务无法继续运行,如配置文件丢失
    LOG_ALERT 报警,需要立即处理,如磁盘空间使用95%
    LOG_CRIT 致命行为
    LOG_ERR 错误行为
    LOG_WARNING 警告信息
    LOG_NOTICE 普通
    LOG_INFO 标准信息
    LOG_DEBUG 调试信息,排错才开,一般不建议使用
    • 配置文件
    [root@atopos ~]# vim /etc/rsyslog.conf
    *.info;mail.none;authpriv.none;cron.none                /var/log/messages
    
    # The authpriv file has restricted access.
    authpriv.*                                              /var/log/secure
    
    # Log all the mail messages in one place.
    mail.*                                                  -/var/log/maillog
    
    
    # Log cron stuff
    cron.*                                                  /var/log/cron
    
    # Everybody gets emergency messages
    *.emerg                                                 :omusrmsg:*
    
    # Save news errors of level crit and higher in a special file.
    uucp,news.crit                                          /var/log/spooler
    
    # Save boot messages also to boot.log
    local7.*                                                /var/log/boot.log
    

    实例

    rsyslog远程管理日志

    • 修改server1的rsyslog.conf配置文件,打开tcp、udp监听端口
    [root@server1 httpd]# vim /etc/rsyslog.conf
    # Provides UDP syslog reception
    $ModLoad imudp
    $UDPServerRun 514
    # Provides TCP syslog reception
    $ModLoad imtcp
    $InputTCPServerRun 514
    
    • 重启rsyslog,检查端口是否在监听
    [root@server1 ~]# yum install net-tools -y
    [root@server1 ~]# netstat -nltup |grep 514
    tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
    1342/rsyslogd
    tcp6 0 0 :::514 :::* LISTEN
    1342/rsyslogd
    udp 0 0 0.0.0.0:514 0.0.0.0:*
    1342/rsyslogd
    udp6 0 0 :::514 :::*
    1342/rsyslogd
    
    • 修改server2的ssh配置文件,将日志发送到local0中
    [root@server2 ~]# vim /etc/ssh/sshd_config
    SyslogFacility LOCAL0
    [root@server2 ~]# systemctl restart sshd
    
    • 修改server2的rsyslog.conf
    [root@server2 ~]# vim /etc/rsyslog.conf
    local0.* @192.168.80.193
    [root@server2 ~]# systemctl restart rsyslog.service
    

    参考博客:Rsyslog系统日志管理 - 谁与问倚楼人瘦 - 博客园 (cnblogs.com)

    logrotate 日志轮转(日志切割)

    针对任何日志文件(rsyslog日志、Nginx访问或错误日志)

    • 随着时间增长,日志文件会越来越大,所以需要进行日志轮转,切割
    • 丢弃系统中过期的旧日志,节省空间
    • logrotate本身不是系统守护进程,它是通过计划任务crond每天执行
    [root@atopos ~]# cat /etc/cron.daily/logrotate 
    #!/bin/sh
    
    /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    
    [root@localhost ~]# ls /etc/logrotate.conf /etc/logrotate.d/
    /etc/logrotate.conf
    /etc/logrotate.d/:
    bootlog chrony syslog wpa_supplicant yum
    

    主配置文件

    [root@atopos ~]# vim /etc/logrotate.conf
    weekly		# 一周轮转一次
    rotate 4	# 保留四份日志
    create		# 主动创建新的日志文件
    dateext		# 使用日期来作为文件名的后缀
    include /etc/logrotate.d
    # 导入其他应用的日志轮转规则
    /var/log/wtmp {		# 对该日志文件设置轮转方法
        monthly			# 一个月轮转一次
        create 0664 root utmp	# 轮转后创建新文件,并设置权限
            minsize 1M		# 最小达到1M才会轮转
        rotate 1
    }
    /var/log/btmp {
        missingok		# 丢失不提醒
        monthly
        create 0600 root utmp
        rotate 1
    }
    

    远程控制服务

    配置sshd服务

    sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供两种安全验证的方法:

    • 基于口令的验证—用账户和密码来验证登录;

    • 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的 公钥进行比较;该方式相较来说更安全。

    sshd服务的配置信息保存在 /etc/ssh/sshd_config 文件中。运维人员一般会把保存着最主要配置信息 的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在 修改参数后再去掉前面的#号。

    sshd服务的配置文件

    [root@atopos ~]# cat /etc/ssh/sshd_config 
    #	$OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
    
    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.
    
    # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
    
    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.
    
    # If you want to change the port on a SELinux system, you have to tell
    # SELinux about this change.
    # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
    #
    #Port 22
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::
    
    HostKey /etc/ssh/ssh_host_rsa_key
    #HostKey /etc/ssh/ssh_host_dsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    
    # Ciphers and keying
    #RekeyLimit default none
    
    # Logging
    #SyslogFacility AUTH
    SyslogFacility AUTHPRIV
    #LogLevel INFO
    
    # Authentication:
    
    #LoginGraceTime 2m
    #PermitRootLogin yes
    #StrictModes yes
    #MaxAuthTries 6
    #MaxSessions 10
    
    #PubkeyAuthentication yes
    
    # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
    # but this is overridden so installations will only check .ssh/authorized_keys
    AuthorizedKeysFile	.ssh/authorized_keys
    
    #AuthorizedPrincipalsFile none
    
    #AuthorizedKeysCommand none
    #AuthorizedKeysCommandUser nobody
    
    # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    #HostbasedAuthentication no
    # Change to yes if you don't trust ~/.ssh/known_hosts for
    # HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes
    
    # To disable tunneled clear text passwords, change to no here!
    #PasswordAuthentication yes
    #PermitEmptyPasswords no
    PasswordAuthentication yes
    
    # Change to no to disable s/key passwords
    #ChallengeResponseAuthentication yes
    ChallengeResponseAuthentication no
    
    # Kerberos options
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosGetAFSToken no
    #KerberosUseKuserok yes
    
    # GSSAPI options
    GSSAPIAuthentication yes
    GSSAPICleanupCredentials no
    #GSSAPIStrictAcceptorCheck yes
    #GSSAPIKeyExchange no
    #GSSAPIEnablek5users no
    
    # Set this to 'yes' to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication and
    # PasswordAuthentication.  Depending on your PAM configuration,
    # PAM authentication via ChallengeResponseAuthentication may bypass
    # the setting of "PermitRootLogin without-password".
    # If you just want the PAM account and session checks to run without
    # PAM authentication, then enable this but set PasswordAuthentication
    # and ChallengeResponseAuthentication to 'no'.
    # WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
    # problems.
    UsePAM yes
    
    #AllowAgentForwarding yes
    #AllowTcpForwarding yes
    #GatewayPorts no
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #PermitTTY yes
    #PrintMotd yes
    #PrintLastLog yes
    #TCPKeepAlive yes
    #UseLogin no
    #UsePrivilegeSeparation sandbox
    #PermitUserEnvironment no
    #Compression delayed
    #ClientAliveInterval 0
    #ClientAliveCountMax 3
    #ShowPatchLevel no
    #UseDNS yes
    #PidFile /var/run/sshd.pid
    #MaxStartups 10:30:100
    #PermitTunnel no
    #ChrootDirectory none
    #VersionAddendum none
    
    # no default banner path
    #Banner none
    
    # Accept locale-related environment variables
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    
    # override default of no subsystems
    Subsystem	sftp	/usr/libexec/openssh/sftp-server
    
    # Example of overriding settings on a per-user basis
    #Match User anoncvs
    #	X11Forwarding no
    #	AllowTcpForwarding no
    #	PermitTTY no
    #	ForceCommand cvs server
    
    
    • 各个字段的解释
    字段 作用
    Port 22 默认的sshd服务端口
    ListenAddress 0.0.0.0 设定sshd服务器监听的IP地址
    Protocol 2 SSH协议的版本号
    HostKey /etc/ssh/ssh_host_key SSH协议版本为1时,DES私钥存放的位置
    HostKey /etc/ssh/ssh_host_rsa_key SSH协议版本为2时,RSA私钥存放的位置
    HostKey /etc/ssh/ssh_host_dsa_key SSH协议版本为2时,DSA私钥存放的位置
    PermitRootLogin yes 设定是否允许root管理员直接登录
    StrictModes yes 当远程用户的私钥改变时直接拒绝连接
    MaxAuthTries 6 最大密码尝试次数
    MaxSessions 10 最大终端数
    PasswordAuthentication yes 是否允许密码验证
    PermitEmptyPasswords no 是否允许空密码登录(很不安全)

    安全密钥验证

    1. 在客户端主机中生成密钥对
    [root@localhost ~]# ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):	# 密钥对的名字,不输入就默认id_rsa
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase):		# 私钥密码
    Enter same passphrase again:					# 确认密码
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:9+KE/GYBG6wjbCQ4o9j139nD9kkrL29bdAYd49kTvLo
    root@localhost.localdomain
    The key's randomart image is:
    +---[RSA 2048]----+
    | .+ 			|
    | .o*			|
    | . . .++		|
    |+ . o + o.		|
    |o+ = . .S+. . +|
    |o . + +..o.. . o.|
    | . . oo.o=. o .|
    | .+=.BE.+ 		|
    | oo. OB. 		|
    +----[SHA256]-----+
    
    1. 把客户端主机中的公钥文件发送给服务端
    [root@atopos ~]# ssh-copy-id 192.168.2.128
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed:
    "/root/.ssh/id_rsa.pub"
    The authenticity of host '192.168.2.128 (192.168.2.128)' can't be
    established.
    ECDSA key fingerprint is SHA256:PWPGI+gebAxdFtOfQe66cO/RnTBEV/Qw5AEoZv6w5lM.
    ECDSA key fingerprint is
    MD5:61:3d:ae:39:43:65:70:f4:9a:10:ff:48:67:6f:ef:54.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
    filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are
    prompted now it is to install the new keys
    root@192.168.91.128's password:
    Number of key(s) added: 1
    Now try logging into the machine, with: "ssh '192.168.2.128'"
    and check to make sure that only the key(s) you wanted were added.
    
    1. 对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存 并重启sshd服务程序
    [root@atopos ~]# vim /etc/ssh/sshd_config
    ..................
    65 PasswordAuthentication no
    ...................
    [root@atopos ~]# systemctl restart sshd
    

    screen 不间断会话服务

    当与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断。

    screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同 时控制多个远程终端窗口而设计的程序。用户还可以使用screen服务程序同时在多个远程会话中自由切 换,能够做到实现如下功能。

    • 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
    • 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
    • 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出 信息共享。

    下载screen工具

    [root@atopos ~]# yum install -y screen
    

    管理远程会话

    screen的命令:

    • 用 -S 参数创建会话窗口
    • 用 -d 参数将指定会话进行离线处理
    • 用 -x 参数一次性恢复所有的会话
    • 用 -ls 参数显示当前已有的会话
    • 用 -wipe 参数把目前无法使用的会话删除
    # 创建新的窗口
    [root@atopos ~]# screen -S window
    
    • 可以看到我们创建的新的会话正在运行中
    [root@atopos ~]# screen -ls
    There is a screen on:
            17126.window    (Attached)
    1 Socket in /var/run/screen/S-root.
    

    在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用screen命令执行要 运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后screen会话也会自动结束

    [root@atopos ~]# screen ping -c 4 baidu.com
    [screen is terminating]
    

    了解堡垒机

    概述

    ​ 当今的时代是一个信息化社会,信息系统已成为各企事业单位业务运营的基础,由于信息系统运维人员 掌握着信息系统的最高权限,一旦运维操作出现安全问题将会给[企业]或单位带来巨大的损失。因此,加 强对运维人员操作行为的监管与审计是[信息安全]发展的必然趋势。在此背景之下,针对运维操作管理与 审计的堡垒机应运而生。堡垒机提供了一套多维度的运维操作控管控与审计解决方案,使得管理人员可以全面对各种资源(如[网络]设备、[服务器]、安全设备和[数据库]等)进行集中账号管理、细粒度的权限管 理和访问审计,帮助企业提升内部风险控制水平。

    ​ 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏, 而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操 作行为,以便集中报警、及时处理及审计定责。

    ​ 目前国内外有很多厂商生产堡垒机,堡垒机目前有两种最主流的形式。 硬件堡垒机:厂商定制硬件设备,并且将软件系统封装在其中,比较封闭,安全系数较高

    ​ 软件堡垒机:厂商仅仅维护软件堡垒机系统,需要客户自己部署堡垒机,可以虚拟化形式,部署自由 程度高

    核心功能

    • 登录功能
    • 账号管理
    • 身份认证
    • 资源授权
    • 访问控制
    • 操作审计

    文件服务

    FTP(文件传输协议)

    FTP协议:文件传输协议(File Transfer Protocol)

    • 协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准
    • FTP运行在OSI模型的应用层,并利用传输协议TCP在不同的主机之间提供可靠的数据传输
    • FTP 在文件传输中还支持断点续传功能,可以大幅度减少CPU网络带宽的开销

    FTP 模型

    • 用户接口:提供一个用户接口并使用客户端协议解释器的服务

    • 客户端协议解释器:向远程服务器发送命令 并建立客户数据传输过程

    • 服务端协议解释器:响应客户协议机发出的命令并驱动服务端数据传输过程

    • 客户端数据传输协议:负责完成和服务器数据传输过程及客户端本地文件系统的通信

    • 服务端数据传输协议:负责完成和客户数据过程及服务器端文件系统的通信

    通信接口

    21端口:控制连接

    • FTP服务端监听21端口等待建立连接,只有身份验证通过,才可以顺利建立连接
    • 在FTP连接期间,控制连接始终保持通常的连接状态。在数据连接存在期间,控制连接必须存 在;一旦控制连接断开,数据连接会自动关闭

    20端口:数据连接

    • FTP服务端监听20端口来等待数据连接
    • 数据连接依赖于控制连接

    两种连接方式

    ​ FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

    ​ 在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放 N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端 口(通常是20)来连接客户端指定的端口N+1,进行数据传输。

    ​ 在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开 启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开 放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到 命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。

    主动连接

    • 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口
    • 控制连接建立后,客户端进行份验证,协商数据连接采用主动模式;随后客户端会 向FTP服务器发送Port报 文,表明自己监听的IP+端口,并等待FTP服务器(20端 口)向自己监听的IP+端口发起数据连接请求。
    • 服务端发起数据连接请求,建立数据连接

    被动连接

    • 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口;
    • 控制连接建立后,客户端进行身份验证,协商数据连接采用被动模式;随后客户端 会向服务器发送PASV报文,表示我们用被动模式
    • 服务端收到PASV报文,于是向客户端发送Port报文,表明自己监听的IP+端口
    • 客户端发起数据连接请求,建立数据连接

    image-20220117235058642

    vsftpd 服务

    安装

    [root@atopos ~]# yum install -y vsftpd
    

    配置文件

    # 主配置文件
    /etc/vsftpd/vsftpd.conf
    # 用户访问控制文件
    /etc/vsftpd/ftpusers 
    /etc/vsftpd/user_list
    # 日志文件
    /etc/logrotate.d/vsftpd
    
    配置文件参数:
    参数 作用
    listen=NO 是否以独立运行的方式监听服务
    listen_address=ip地址 设置要监听的IP地址
    listen_port=21 设置FTP服务的监听端口
    download_enable=YES 是否允许下载文件
    userlist_enable=YES 设置用户列表为"允许"
    userlist_deny=YES 设置用户列表为"禁止"
    max_clients=0 最大客户端连接数,0为不限制
    max_per_ip=0 同一IP地址的最大连接数,0为不限制
    anonymous_enable=YES 是否允许匿名用户访问
    anon_upload_enable=YES 是否允许匿名用户上传文件
    anon_umask 匿名用户上传文件的umask
    anon_root=/var/ftp 匿名用户的ftp根目录
    anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
    anon_other_write_enable=YES 是否开放匿名用户的其他写入权限(重命名、删除等)
    anon_max_rate=0 匿名用户的最大传输速率,0为不限制
    local_enable=yes 是否允许本地用户登录
    local_umask=022 本地用户上传文件的umask值
    local_root=/vat/ftp 本地用户的ftp根目录
    chroot_local_user=YES 是否将用户权限禁锢在ftp目录,以确保安全
    local_max_rate=0 本地用户的最大传输速率,0为不限制

    客户端工具

    • ftp
    [root@atopos ~]#yum install ftp -y
    [root@atopos ~]#ftp <IP地址>
    
    • lftp
    [root@atopos ~]#yum install lftp -y
    [root@atopos ~]#lftp <IP地址>
    
    • 区别:
      • ftp 工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示。lftp不会直接给出登 录成功或者失败的
      • lftp 需要输入ls工具才可以发现是否连接成功,优点在于连接更加方便

    实例

    匿名用户访问(默认开启)
    [root@atopos ~]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    anon_umask=022
    anon_upload_enable=Yes
    anon_mkdir_write_enable=Yes
    anon_other_write_enable=Yes
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    [root@atopos ~]# systemctl restart vsftpd
    
    本地用户访问
    [root@atopos ~]# vi /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    [root@atopos ~]# systemctl restart vsftpd
    [root@atopos ~]# systemctl enable vsftpd
    注意:出现在/etc/vsftpd/ftpuser /etc/vsftpd/user_list这两个文件
    中的内容将会被定义为黑名单
    
    虚拟用户访问
    1. 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码
    [root@atopos ~]# cd /etc/vsftpd/
    [root@atopos vsftpd]# vi vuser.list
    eagle
    centos
    cisco
    centos
    huawei
    centos
    
    1. 使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
    2. 降低数据库文件的权限(避免其他人看到数据库文件的内容)
    3. 把原始的明文信息文件删除。
    [root@atopos vsftpd]# db_load -T -t hash -f vuser.list vuser.db
    [root@atopos vsftpd]# file vuser.db
    vuser.db: Berkeley DB (Hash, version 9, native byte-order)
    [root@atopos vsftpd]# chmod 600 vuser.db
    [root@atopos vsftpd]# rm -f vuser.list
    
    1. 创建一个本地用户,用来做虚拟用户在本地的代理,为了安全起见,禁止这个本 地用户登录
    [root@atopos vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
    [root@atopos vsftpd]# ls -ld /var/ftproot/
    drwx------. 2 virtual virtual 59 8月 10 23:04 /var/ftproot/
    [root@atopos vsftpd]# chmod -Rf 777 /var/ftproot/
    
    1. 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
    [root@atopos vsftpd]# vi /etc/pam.d/vsftpd.vu
    auth required pam_userdb.so db=/etc/vsftpd/vuser
    account required pam_userdb.so db=/etc/vsftpd/vuser
    
    1. 配置文件
    [root@atopos vsftpd]# cat /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    guest_enable=YES
    guest_username=virtual
    allow_writeable_chroot=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd.vu
    userlist_enable=YES
    tcp_wrappers=YES
    
    1. 如果想要针对不同的用户设置不同的权限
    [root@atopos vsftpd]# mkdir /etc/vsftpd/vusers_dir/
    [root@atopos vsftpd]# cd /etc/vsftpd/vusers_dir/
    [root@atopos vusers_dir]# touch huawei
    [root@atopos vusers_dir]# vi eagle
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@atopos vusers_dir]#
    [root@atopos vusers_dir]# vi /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    local_enable=YES
    guest_enable=YES
    guest_username=virtual
    allow_writeable_chroot=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd.vu
    userlist_enable=YES
    tcp_wrappers=YES
    user_config_dir=/etc/vsftpd/vusers_dir
    [root@atopos vusers_dir]# systemctl restart vsftpd
    

    NFS(网络文件系统)

    NFS,Network File System。顾名思义,网络文件系统,即通过网络,对在不同主机上的文件进行共享。

    NFS包括两部分:服务端(servlet)及客户端(client)

    由于NFS服务功能很多,会有很多端口,这些端口还有可能不固定,(pc -ef | egrep nfs 我们可以看到nfs 不同的端口号)那么客户端就无法与服务器进行通信,因为程序间通信必须通过端口(tcp/udp都是端到端通信),那么就需要一个中间的桥接机制,RPC进程即充当这样一个角色,RPC的端口是一定的(111),当NFS启动时,会向RPC进行注册, (rpc 一定是在nfs启动前,就已经启动了,)那么客户端PRC就能与服务器RPC进行通信, 从而进行文件的传输。

    NFS服务端

    安装

    # centos7 安装NFS 服务端
    [root@atopos ~]# yum install -y nfs-utils
    # 注意关闭selinux和firewalld
    [root@atopos ~]# systemctl stop firewalld
    [root@atopos ~]# setenforce 0
    

    服务端相关配置文件

    配置文件定义

    NFS的配置文件为 /etc/exports内容格式,如:<共享目录> [客户端1(选项)] [客户端2(选项) ...]

    • 共享目录:NFS共享给客户机的目录

    • 客户端:网络中可以访问此目录的主机。多个客户端以空格分隔。

    • 选项:设置目录的访问权限、用户映射等,多个选项以逗号分隔。

    • 例如:/data 192.168.1.0/24(rw,insecure,sync,all_squash,anonuid= 65534,anongid=65534)

    配置文件路径

    /etc/exports:NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容是空的

    [root@atopos ~]# cat /etc/exports
    /data 192.168.2.0/24(rw,insecure,sync,all_squash,anonuid= 65534,anongid=65534)
    

    /usr/sbin/exports:

    NFS服务的管理命令
    exportfs
      不重启nfs服务应用更新,相关选项如下:
      -a 全部挂载或卸载 /etc/exports中的内容
      -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
      -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
      -v 在export的时候,将详细的信息输出到屏幕上。
    
    nfsstat
      查看NFS的运行状态。
     
    rpcinfo
      查看rpc服务注册情况。
      相关选项:
      -p 显示所有的端口与程序信息。
      示例:
      rpcinfo -p localhost  #列出本机的RPC注册状况。
    
    showmount
      查询nfs共享目录信息,相关选项如下:
      -a 显示已经于客户端连接上的目录信息
      -e IP或者hostname 显示此IP地址分享出来的目录
     
      示例:
      showmount -e localhost  #查询本机nfs共享目录情况
      showmount -a localhost  #查询本机共享目录连接情况
    
    NFS配置权限配置参数
    • rw:表示可读写权限。

    • sync:请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。

    • async:写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源)。

    • all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在生产环境中配置NFS的重要技巧:

     (1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同

    ​ (2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同)

    • anonuid:参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好

    • anongid:同anonuid,区别是把uid(用户id)换成gid(组id)

    • ro:表示只有只读权限

    sync是synchronized的缩写,意为同步,async是asynchonous的缩写意为异步,怎么理解同步和异步:

    ​ 比如:你女朋买了一张票等你下班一起看电影,她会亲自给你电影票然后一起看电影,在比如生产者跟消费者,我们常常加同步锁synchronized,这样就是生产一个,消费一个(Linux分为实时同步和定时同步)。异步,在比如生产者跟消费者,生产100个产品,消费者只能消费50个,那么就会把生产者的产品放在超市,消费者就会去超市买东西,

    NFS 客户端

    安装

    [root@atopos ~]# yum install -y nfs-utils
    

    常用命令

    pass

    实例一

    基于NFS搭建web后端NAS存储
    • 关闭防火墙和selinux
    [root@atopos ~]# systemctl stop firewalld
    [root@atopos ~]# setenforce 0
    
    • 准备NFS共享文件
    # 安装nfs服务
    [root@atopos ~]# yum install -y nfs-utils
    # 准备共享目录
    [root@atopos ~]# mkdir /webdata
    # 准备共享文件
    [root@atopos ~]# echo "<h1>today i study but you sleep i good you bad</h1>" > /webdata/index.html
    # 配置nfs服务
    [root@atopos webdata]# vim /etc/exports
    [root@atopos webdata]# cat /etc/exports
    /webdata 192.168.2.0/24(rw)
    [root@atopos ~]# systemctl start nfs-server.service
    [root@atopos ~]# systemctl enable nfs-server.service
    
    • 客户端查看服务端的共享文件
    [root@node1 ~]# yum install -y nfs-utils
    [root@node1 ~]# showmount -e 192.168.2.128
    /webdata 192.168.2.0/24
    
    • 挂载nas共享文件到网站根目录
    [root@node1 ~]# mount -t nfs 192.168.2.128:/webdata /var/www/html/
    [root@node1 ~]# df
    文件系统 1K-块 已用 可用 已用% 挂载点
    /dev/mapper/centos-root 17811456 1153376 16658080 7% /
    devtmpfs 922468 0 922468 0% /dev
    tmpfs 933524 0 933524 0% /dev/shm
    tmpfs 933524 8804 924720 1% /run
    tmpfs 933524 0 933524 0% /sys/fs/cgroup
    /dev/sda1 1038336 145756 892580 15% /boot
    tmpfs 186708 0 186708 0% /run/user/0
    192.168.2.128:/webdata 17811456 1082880 16728576 7% /var/www/html
    
    • 最后浏览器访问测试

    autofs 自动挂载

    可使用autofs服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载

    相关包和文件

    [root@atopos ~]# yum install -y autofs
    

    配置文件:/etc/auto.master

    服务文件: /usr/lib/systemd/system/autofs.service

    配置文件格式

    查看帮助: man 5 autofs

    所有导出到网络中的NFS启用特殊匹配-host至"browse"

    实例:

    cat /etc/auto.master
    /net -hosts
    cd /net/192.168.175.147
    
    • 自动挂载资源有两种格式:
      • 相对路径法:将mount point路径分成dirname和basename分别配置,可能会影响现有的目录结构
      • 绝对路径法:直接匹配全部绝对路径名称,不会影响本地目录结构

    实例二

    将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录

    环境准备

    将server中的用户家目录共享出来,node1在登陆这个用户的到时候,看到家目录下的文件是一致的

    步骤
    • NFS服务器创建用户和相应的目录,将用户user的家目录共享
    [root@atopos ~]# systemctl stop firewalld
    [root@atopos ~]# setenforce 0 
    # 关闭防火墙和selinux
    [root@atopos ~]# yum install -y nfs-utils
    [root@atopos ~]# systemctl start nfs
    [root@atopos ~]# mkdir /data
    [root@atopos ~]# useradd -d /data/user user
    [root@atopos ~]# id user
    uid=1000(user) gid=1000(user) 组=1000(user)
    [root@atopos ~]# vim /etc/exports.d/test.exports
    /data/user *(rw,anonuid=1000,anongid=1000,all_squash)
    [root@atopos ~]# systemctl restart nfs
    
    • 在node1客户端上实现autofs
    [root@atopos ~]# systemctl stop firewalld
    [root@atopos ~]# setenforce 0 
    # 关闭防火墙和selinux
    [root@node1 ~]# yum install -y autofs
    [root@node1 ~]# systemctl start autofs
    [root@node1 ~]# vim /etc/auto.master
    /data /etc/auto.home
    [root@node1 ~]# vim /etc/auto.home
    * -fstype=nfs,vers=3 192.168.175.144:/data/user&
    [root@node1 ~]# systemctl restart autofs
    
    • 在node1客户端上创建用户user
    [root@node1 ~]# mkdir /data
    [root@node1 ~]# useradd -d /data/user -u 1000 user
    
    • 测试node1上是否存在来自server共享的目录
    [root@atopos ~]# su - user
    [user@atopos ~]$ touch file
    # 在NSF服务器上登录user用户,创建文件在家目录中
    [root@node1 /]# su - user
    [user@node1 ~]$ ll
    总用量 0
    -rw-rw-r--. 1 user user 0 1月 16 10:13 file
    # 在NSF客户机上登录user用户,发现文件已经被共享了
    

    samba

    简介

    • 历史:

    • 1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块) 协议,旨在解 决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享 文件变得越来越简单。到了1991年, 当时还在读大学的Tridgwell为了解决Linux系统与 Windows系统之间的文件共享问题,基于SMB协议开发出了 SMBServer服务程序。这是一款 开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的 文件共享 工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB 是没有意义的 字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名 字—Samba,而且这个热情洋溢的 舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的 名字由此诞生。Samba服务程序现在已经成为在Linux系 统与Windows系统之间共享文件的 最佳选择

    • SMB协议:

      • SMB(服务信息模块)协议是一个高层协议、它提供了在网络上的不同计算机之间共享文 件,打印机和不同通 信资料的手段
      • SMB使用NetBIOS API实现面向连接的协议,该协议为Window是客户程序和服务提供了一个 通过虚链路按照 请求——响应方式进行通信的机制
      • SMB的工作原理就是让NetBIOS与SMB协议运行在TCP/IP上,并且使用NetBIOS的名字解释 器让Linux机器可 以在Windows的网络邻居中被看到,从而在Windows的网络邻居中被看 到,从而和Windows9x/NT/200X进 行相互沟通,共享文件和打印机
    • CIFS协议:

      • 通用网际文件系统是微软服务器消息块协议(SMB)的增强版
      • 提供计算机用户在企业内部网和因特网上共享文件的标准方法
      • CIFS在TCP/IP运行,利用英特网上的全球域名服务系统(DNS)增强其可扩展性,同时为因 特网上普遍存在 的慢速拨号连接优化
    • 应用环境:

      • 文件和打印机共享:文件和打印机共享是samba的主要功能,SMB进程实现资源共享,将文 件和打印机发布到网络之中,以供用户可以访问
      • 身份验证和权限设置:samba服务支持user mode和domain mode 等身份验证和权限设置模 式,通过加密方式可以保护共享的文件和打印机
      • 名称解析:samba通过NMB服务可以搭建NBNS服务器,提供域名解析,将计算机的 NetBIOS名称解析为ip地址
      • 名称解析:samba通过NMB服务可以搭建NBNS服务器,提供域名解析,将计算机的 NetBIOS名称解析为ip地址
    • 端口号:139和445:

      • 在早期,SMB运行于NBT协议上,使用udp协议的137和138以及TCP协议的139端口
    cat /etc/services
    netbios-ns 137/tcp # NETBIOS Name Service
    netbios-ns 137/udp
    netbios-dgm 138/tcp # NETBIOS Datagram
    # Service
    netbios-dgm 138/udp
    netbios-ssn 139/tcp # NETBIOS session service
    netbios-ssn 139/udp
    
    • NetBIOS协议:
      • NetBIOS是Network Basic Input/Output System的简称,网络基本输入输出协议。协议,一 般指能用于局域网通信的一套API,是由IBM公司开发的。主要作用,通过NetBIOS协议获得计算机名称,然后把计算机名称解析为对应的IP地址

    服务配置与使用

    安装

    [root@atopos ~]# yum install samba -y
    

    相关配置文件

    /etc/sysconfig/samba:用于设置守护进程的启动参数。
    /etc/samba/smb.conf:主配置文件。
    /etc/samba/smbusers:用于映射Linux用户和Windows用户。
    /etc/samba/lmhosts:用于设置NetBIOS名字与IP地址的对应关系表。
    /etc/pam.d/samba:Samba的PAM配置文件
    /etc/rc.d/init.d/smb:Samba的INIT启动脚本
    

    相关工具命令

    # 服务端工具:
    /usr/bin/smbpasswd:用于设置Samba用户账号及口令
    /usr/bin/testparm:用于检测配置文件的正确性
    /usr/bin/smbstatus:用于查找网络中的Samba服务器
    # 客户端工具:
    /usr/bin/findsmb:用于查找网络中的Samba服务器
    /usr/bin/smbclient:Linux下的Samba客户端
    /usr/bin/smbget:基于SMB/CIFS的类似于wget的下载工具
    /usr/bin/smbtar:类似于tar的归档工具,用于将SMB/CIFS的共享打包备份到Linux主机
    

    主配置文件详解

    [root@atopos ~]# cat /etc/samba/smb.conf
    # 默认主配置文件:
    [global] #全局参数。
    workgroup = MYGROUP #工作组名称
    server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本
    号
    log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的
    主机名
    max log size = 50 #定义日志文件的最大容量为50KB
    security = user #安全验证的方式,总共有4种
    	#share:来访主机无需验证口令;比较方便,但安全性很差
    	#user:需验证来访主机提供的口令后才可以访问;提升了安全性
    	#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
    	#domain:使用域控制器进行身份验证
    passdb backend = tdbsam #定义用户后台的类型,共有3种
    	#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
    	#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
        #ldapsam:基于LDAP服务进行账户验证
    load printers = yes #设置在Samba服务启动时是否共享打印机设备
    cups options = raw #打印机的选项
    [homes] #共享参数
    comment = Home Directories #描述信息
    browseable = no #指定共享信息是否在“网上邻居”中可见
    writable = yes #定义是否可以执行写入操作,与“read only”相反
    [printers] #打印机共享参数
    comment = All Printers
    path = /var/spool/samba #共享文件的实际路径(重要)。
    browseable = no
    guest ok = no #是否所有人可见,等同于"public"参数。
    writable = no
    printable = ye
    
    安全等级
    Samba安全等级:
        User:由本地Samba服务器负责账户验证
        使用smbpasswd 设置账号(默认的安全等级)
        Domain:账户验证账户及口令的工作由其他的Windows 或Samba域控制器负责
        需要使用“password server”指令指定验证服务器
        Ads:验证账户及口令的工作由支持Kerberos验证的Windows活动目录服务器负责。
        需要使用“realm”指令指定Kerberos领域
        Share:匿名共享
    Samba账户及口令数据库
    1.Samba使用的账户文件/数据库是与系统账户文件分离的
    2.当设置了user的安全等级后(默认),将由本地系统对问Samba共享资源的用户进行认证
    3.用.tdb格式的口令数据库,初始情况下口令数据库文件并不存在
    4.为了创建Samba的口令数据库文件,管理员可以在添加Samba账户的同时创建它
    5.管理员可以使用smbpasswd命令配置Samba账号并设置其口令
    

    配置一个共享资源(具体步骤)

    1. 设置共享名称
      • 共享资源发布后,必须为每个共享目录或打印机设置不同的共享名称,给网络用户访问时使 用,并且共享名可以与原目录名不同。例如,samba服务器上有个目录为/share,需要发布 该目录为共享目录,定义共享名为public
    2. 共享资源描述
      • 格式: comment = 备注信息
      • 备注信息通常是用来进行解释说明的
    3. 共享路径
      • 共享资源的原始完整路径
      • 格式: path = 绝对路径
    4. 设置匿名访问
      • 共享资源如果对匿名访问进行设置,可以更改public字段
      • 格式: public = yes | no (yes代表允许匿名访问,no代表不允许)
    5. 设置访问用户
      • 如果共享资源存在重要数据的话,需要访问用户审核,可以使用valid users字段进行设置
      • 格式:
        • valid users = 用户
        • valid users = @组名
    6. 设置目录只读
      • 共享目录如果限制用户的读写操作,可以通过readonly实现
      • 格式: readonly = yes | no
    7. 设置目录可写
      • 如果目录允许用户写操作,可以使用writable或write list两个字段进行设置
      • 格式:
        • writable = yes 读写
        • writable = no 只读
        • write list = 用户名
        • write list = @ 组名

    实例一:通过用户名共享文件

    共享销售部 /xsb 这个目录,只有知道用户名和密码的同事可以看这个共享,在/xsb目录中存放销售部重 要的数据。需要将security设置为user级别,这样可以启用samba身份验证机制,然后在共享目录 /xsb 下设置valid user 字段,配置只允许销售部员工能访问这个共享目录

    • 修改主配置文件安全相关设置
    [root@atopos ~]# vim /etc/samba/smb.conf
    [global]
    workgroup = SAMBA
    security = user
    # passdb backend = tdbsam
    passdb backend = smbpasswd
    smb passwd file = /etc/samba/smbpasswd
    printing = cups
    printcap name = cups
    load printers = yes
    cups options = raw
    # 重启smb服务之后,会自动生成/etc/samba/smbpasswd该文件
    
    • 添加销售部用户和组
    [root@atopos ~]# groupadd xsb
    [root@atopos ~]# useradd -g xsb -M -s /sbin/nologin xsb01
    [root@atopos ~]# useradd -g xsb -M -s /sbin/nologin xsb02
    [root@atopos ~]# useradd jsb01
    
    • 添加相应的samba账户
    [root@atopos ~]# smbpasswd -a xsb01
    New SMB password:
    Retype new SMB password:
    Added user xsb01.
    [root@atopos ~]# smbpasswd -a xsb02
    New SMB password:
    Retype new SMB password:
    Added user xsb02.
    
    • 指定共享目录
    [root@atopos ~]# mkdir /xsb
    [root@atopos ~]# cp /etc/hosts /xsb
    [root@atopos ~]# vim /etc/samba/smb.conf
    [xsb]
    comment = Xsb Data
    path = /xsb
    valid user = xsb01,xsb02
    
    • 重启服务
    [root@atopos ~]# systemctl restart smb.service
    [root@atopos ~]# systemctl restart nmb.service
    
    • 检查139和445端口号
    [root@atopos ~]# ss -tanl
    State Recv-Q Send-Q Local Address:Port Peer
    Address:Port
    LISTEN 0 50 *:139 *:*
    LISTEN 0 50 *:445 *:*
    LISTEN 0 50 :::139 :::*
    LISTEN 0 50 :::445
    
    • 客户端验证
    # linux上验证
    [root@node1 ~]# yum install samba-client -y
    [root@node1 ~]# smbclient -L //192.168.80.151/xsb -U xsb01
    Enter SAMBA\xsb02's password:
    Sharename Type Comment
    --------- ---- -------
    print$ Disk Printer Drivers
    xsb Disk Xsb Data
    IPC$ IPC IPC Service (Samba 4.10.16)
    xsb02 Disk Home Directories
    Reconnecting with SMB1 for workgroup listing.
    Server Comment
    --------- -------
    Workgroup Master
    --------- -------
    SAMBA SERVER1
    # 在windows上进行验证
    windows验证:
    在Window运行输入地址:\\192.168.10.10
    用户名:******
    密码:******
    可以在DOS窗口中使用命令net use * /delete 清空用户缓存信息
    
    • 在Linux上进行挂载
    [root@node1 ~]# mkdir /xsbdata
    [root@node1 ~]# yum install cifs-utils -y
    [root@node1 ~]# vim auth.smb
    username=xsb01
    password=1
    [root@node1 ~]# vim /etc/fstab
    //192.168.80.151/xsb /xsbdata cifs defaults,credentials=/root/auth.smb
    0 0
    [root@node1 ~]# df
    文件系统 1K-块 已用 可用 已用% 挂载点
    /dev/mapper/centos-root 17811456 1099604 16711852 7% /
    devtmpfs 922468 0 922468 0% /dev
    tmpfs 933524 0 933524 0% /dev/shm
    tmpfs 933524 8852 924672 1% /run
    tmpfs 933524 0 933524 0% /sys/fs/cgroup
    /dev/sda1 1038336 145756 892580 15% /boot
    tmpfs 186708 0 186708 0% /run/user/0
    //192.168.80.151/xsb 17811456 1108900 16702556 7% /xsbdata
    [root@node1 ~]# ls /xsbdata/
    hosts
    

    案例二:不同账户访问不同目录

    • 服务端:
    #创建三个samba用户,并指定密码为centos
    useradd -s /sbin/nologin -r smb1 #加选项-r 不创建家目录
    useradd -s /sbin/nologin -r smb2
    useradd -s /sbin/nologin -r smb3
    smbpasswd –a smb1 #创建对应账号的口令 ,不加-a表示修改已经存在的账号的口令
    smbpasswd –a smb2
    smbpasswd –a smb3
    [root@atopos ~]#pdbedit -L #查看samba账号
    smb1:995:
    smb3:993:
    smb2:994:
    #修改samba配置文件
    vim /etc/samba/smb.conf
    #在workgroup下加一行
    config file= /etc/samba/conf.d/%U 说明:%U表示用户名 #这个步骤为关键步骤
    [share] #共享文件夹在最后添加
    Path=/data/dir #指定分享文件夹的路径
    Read only= NO #不仅仅是只读
    Guest ok = yes
    write list=@admin
    [root@atopos ~]#mkdir /data/dir
    [root@atopos ~]#mkdir /data/dir1
    [root@atopos ~]#mkdir /data/dir2
    [root@atopos ~]#touch /data/dir/share.txt #新建共享文件
    [root@atopos ~]#touch /data/dir1/smb1.txt #新建给smb1用户访问特定文件
    [root@atopos ~]#touch /data/dir2/smb2.txt #新建给smb2用户访问特定文件
    [root@atopos ~]#tree /data/
    /data/
    ├── dir
    │ └── share.txt
    ├── dir1
    │ └── smb1.txt
    └── dir2
    └── smb2.txt
    3 directories, 3 files
    #针对smb1和smb2用户创建单独的配置文件
    [root@atopos ~]#mkdir /etc/samba/conf/smb1 -pv
    [root@atopos ~]# vim /etc/samba/conf.d/smb1
    [share]
    Path=/data/dir1
    Read only= NO 等价于writable = yes
    Create mask=0644
    #说明:默认为744
    [root@atopos ~]#mkdir /etc/samba/conf/smb2 -pv
    [root@atopos ~]# vim /etc/samba/conf.d/smb2
    [share]
    path=/data/dir2
    systemctl restart smb nmb #重启对应的服务
    #用户smb1,smb2,smb3访问share共享目录,看到目录是不同目录,smb3访问的是默认的share目录
    
    • 客户端上验证:
    [root@client ~]#smbclient //192.168.32.18/share -U smb1%centos
    Try "help" to get a list of possible commands.
    smb: \> ls
    . D 0 Fri Dec 20 13:11:40 2019
    .. D 0 Fri Dec 20 13:10:56 2019
    smb1.txt N 0 Fri Dec 20 13:11:40 2019
    52403200 blocks of size 1024. 52004560 blocks available
    smb: \> exit
    [root@client ~]#smbclient //192.168.32.18/share -U smb2%centos
    Try "help" to get a list of possible commands.
    smb: \> ls
    . D 0 Fri Dec 20 13:12:53 2019
    .. D 0 Fri Dec 20 13:10:56 2019
    smb2.txt N 0 Fri Dec 20 13:12:53 2019
    52403200 blocks of size 1024. 52004560 blocks available
    smb: \> exit
    [root@client ~]#smbclient //192.168.32.18/share -U smb3%centos
    Try "help" to get a list of possible commands.
    smb: \> ls
    . D 0 Fri Dec 20 13:13:12 2019
    .. D 0 Fri Dec 20 13:10:56 2019
    share.txt N 0 Fri Dec 20 13:11:26 2019
    52403200 blocks of size 1024. 52004560 blocks available
    smb: \> exit
    

    网站服务

    访问网站的基本流程

    会单独写博客详谈这个问题

    我们每天都会使用web客户端上网浏览网页,最常见的web客户端就是web浏览器,如通用的微软IE, 以及技术人员偏爱的火狐浏览器、谷歌浏览器等。当我们在web浏览器输入网站地址时(例如 www.baidu.com ),很快就会看到网站的内容。这一切似乎看起来很神奇,那么在其背后到底时怎样的 实现流程呢?也许普通的上网者无需关注,但作为一个IT技术人员,特别时合格的Linux运维人员,就需要清晰的掌握了。

    访问网址的流程:

    1. 客户端,浏览器输入网址信息点击回车
    2. 客户端,完成域名解析过程DNS
    3. 浏览器缓存
    4. 系统缓存
    5. 路由器缓存————————以上均为DNS客户端的缓存!!
    6. ISP DNS缓存
    7. 根域名服务器
    8. 顶级域名服务器
    9. 主机名服务器
    10. 保存结果至缓存
    11. 客户端,直接访问响应网址服务器,建立tcp三次握手过程
    12. 客户端,访问网址服务器,发送HTTP请求报文(多次)
    13. 服务端,响应客户端请求,回复HTTP响应报文(多次)
    14. 客户端,浏览器查看到网址页面,浏览器完成html解析
    15. 客户端,结束网站访问

    HTTP 协议

    简介

    • HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网中最常用的 一种网络协议。HTTP重要应用之一是www服务。涉及HTTP协议最初的目的就是提供一种发布和接 受HTML页面的方法。HTTP协议是互联网上最常用的通信协议之一,它有很多的应用,但最流行的 就是用于web浏览器和web服务器之间的通信,即www应用或称web应用
    • HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件, 查询结果等)的应用层协议
    • HTTP协议工作于C/S或B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发 送所有请求。 Web服务器根据接收到的请求后,向客户端发送响应信息。

    URI和URL

    URI

    URI:是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。

    ​ Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的URI一般由三部组成:①访问资源的命名机制②存放资源的主机名③资源自身的名称,由路径表示,着重强调于资源。

    URL

    URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

    URL:是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:①协议(或称为服务方式)②存有该资源的主机IP地址(有时也包括端口号)③主机资源的具体地址。如目录和文件名等

  • 相关阅读:
    (转)golang获取当前时间、时间戳和时间字符串及它们之间的相互转换
    FFmpeg常用命令
    go cmd nohup 的坑
    Nginx配置详解(转)
    记录一次go性能调试的过程
    github徽标引入
    golang 关于 interface 的学习整理
    <转>Go语言TCP Socket编程
    [转]Go里面的unsafe包详解
    linux extglob模式 和rm反选
  • 原文地址:https://www.cnblogs.com/echoooo/p/15796472.html
Copyright © 2011-2022 走看看