Linux 系统常用管理命令(精简笔记)

Linux是一套免费使用和自由传播的类Unix操作系统,下面的笔记是我从鸟菜中摘抄出来的重要命令,并进行了一定的排版,摒弃了一些用不到的乱七八糟的命令,目的是在生产环境中能够快速的定位并查询需要命令的参数,能够高效工作.

文件目录基本命令

文件基本操作命令

显示目录或文件: 显示目标列表,在Linux系统中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件

[root@localhost ~]# ls --help
命令语法:[ ls [选项] 文件或目录 ]
        -a              #显示所有文件,包括隐藏文件,连同.与..的文件也列出来
        -A              #显示所有文件,包括隐藏文件,但不列出.与..
        -d              #仅列出目录
        -f              #直接列出结果不排序
        -h              #文件大小显示为B KB MB
        -i              #列出文件的Inode号
        -l              #以长格式显示
        -n              #列出uid与gid
        -S              #以文件容量大小排序(大文件在前小文件在后)
        -t              #以时间大小排序(大日期在前小日期在后)
        -r              #将排序结果反向输出
        -R              #递归显示目录以及子目录
        -Z              #列出SELinux安全上下文
        --full-time     #列出文件详细时间
        --time=atime/ctime/mtime        #列出指定时间

使用 ls -lh 参数查询所在目录详细信息

[root@localhost ~]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark
第1项:          文件权限位
第2项:          引用计数(文件:硬链接数 目录:目录下的子目录个数)
第3项:          文件的所有者(属主->此处为root)
第4项:          文件的所属组(属组->此处为root)
第5项:          文件大小(默认单位字节byte)
第6项:          最后一次修改时间
第7项:          文件名

使用 ls -lh --full-time 显示文件创建的详细时间信息

[root@localhost ~]# ls -h --full-time
total 0
-rw-r--r--. 1 root root 0 2018-11-13 09:36:25.172274787 -0500 admin
drwxr-xr-x. 2 root root 6 2018-11-13 09:36:13.292275532 -0500 lyshark

使用 ls -lhS 显示文件,并按照文件由大到小打印

[root@localhost ~]# ls -lhS
total 0
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin

使用 ls -lhrS 显示文件,并按照文件由小到大打印

[root@localhost ~]# ls -lhrS
total 0
-rw-r--r--. 1 root root 0 Nov 13 09:36 admin
drwxr-xr-x. 2 root root 6 Nov 13 09:36 lyshark

使用 ls -lZ 显示文件,并显示SeLinux安全上下文

[root@localhost ~]# ls -lZ 
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 admin
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark

目录跳转与切换: 切换当前的哦工作目录

[root@localhost ~]# cd --help
命令语法:[ cd [选项] 目录 ]
        cd              #进入用户主目录
        cd ~            #进入用户主目录
        cd -            #返回进入此目录之前所在的目录
        cd ..           #返回上级目录
        cd ../..        #返回上两级目录
        cd !$           #把上个命令的参数作为cd参数使用

使用 cd ~ or cd 切换到用户家目录

[root@localhost etc]# pwd
/etc
[root@localhost etc]# cd
[root@localhost ~]# pwd
/root

使用 cd .. 切换上一级目录里去

[root@localhost ~]# pwd
/root
[root@localhost ~]# cd ..
[root@localhost /]# pwd
/

使用 cd ../.. 切换上两级目录里去

[root@localhost sysconfig]# pwd
/etc/sysconfig
[root@localhost sysconfig]# cd ../..
[root@localhost /]# pwd
/

创建新目录: mkdir命令用来创建一个新目录,或者递归创建一些目录。

[root@localhost ~]# mkdir --help
语法格式:[ mkdir [选项] 新目录名 ]
        -v              #显示创建过程
        -p              #递归创建目录
        -Z              #设置安全上下文
        -m              #建立目录时同时设置权限

使用 mkdir -p 递归创建目录

[root@localhost ~]# mkdir -p /tmp/lyshark/lyshark
[root@localhost ~]# ls -lh /tmp/lyshark/
total 0
drwxr-xr-x. 2 root root 6 Nov 13 09:56 lyshark

使用 mkdir -m 建立目录时同时设置权限.

[root@localhost ~]# mkdir -m 000 lyshark
[root@localhost ~]# ls -lh
total 0
d---------. 2 root root 6 Nov 13 10:02 lyshark

创建空文件: touch命令用于创建空文件按,或者把已存在文件的时间标签更新为系统当前的时间。

[root@localhost ~]# touch --help
语法格式:[ touch [选项] 文件名 ]
        -a              #修改访问时间
        -c              #修改文件时间,若文件不存在则不创建新文件
        -m              #仅修改mtime
        -t              #修改文件时间(touch -t 1806101012)

使用 touch 命令在当前目录下创建一个空文件lyshark.txt.

[root@localhost ~]# ls -lh
total 0
[root@localhost ~]# touch lyshark.txt
[root@localhost ~]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Nov 13 10:32 lyshark.txt

使用 touch -t 命令修改文件的时间改成15年11月03日11点59分.

[root@localhost ~]# ls -lh --full-time
total 0
-rw-r--r--. 1 root root 0 2018-11-13 10:35:50.639051120 -0500 lyshark.txt
[root@localhost ~]# touch -t 1511031159 lyshark.txt 
[root@localhost ~]# ls -lh --full-time
total 0
-rw-r--r--. 1 root root 0 2015-11-03 11:59:00.000000000 -0500 lyshark.txt

复制文件或目录: cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。

[root@localhost ~]# cp --help
语法格式:[ cp [选项] 源文件或目录 目标目录 ]
        -a              #相当于pdr
        -d              #连同链接文件的属性一起复制
        -f              #强制复制
        -i              #如目标文件已存在,则覆盖时询问
        -p              #连同文件属性一起复制(备份常用)
        -r              #递归复制,用于目录的复制
        -s              #复制时创建软连接
        -u              #源文件更新时才会提示复制

使用 cp -a 命令实现文件拷贝,将/etc/的文件拷贝到/tmp/目录下.

[root@localhost ~]# cp -a /etc/* /tmp/
[root@localhost ~]# ls -lh /tmp/
total 1.1M
-rw-r--r--.  1 root root     16 Oct 13 12:37 adjtime
-rw-r--r--.  1 root root   1.5K Jun  7  2013 aliases
-rw-r--r--.  1 root root    12K Oct 13 12:39 aliases.db
drwxr-xr-x.  2 root root    236 Oct 13 12:34 alternatives
....省略....

使用 cp -s 命令实现拷贝文件,将/etc/passwd创建软链接到/tmp/目录下.

[root@localhost ~]# cp -s /etc/passwd /tmp/
[root@localhost ~]# ls -lh /tmp/
total 0
lrwxrwxrwx. 1 root root 11 Nov 13 10:09 passwd -> /etc/passwd

使用 cp -a 命令实现一次拷贝多个文件,到/tmp/目录下.

[root@localhost ~]# cp -a /etc/passwd /etc/shadow /tmp/
[root@localhost ~]# ls -lh /tmp/
total 8.0K
-rw-r--r--. 1 root root 898 Oct 13 12:37 passwd
----------. 1 root root 714 Oct 13 12:37 shadow

移动文件或目录: mv命令用来对文件或目录重新命名,如果文件存在则会强制更新。

[root@localhost ~]# mv --help
语法格式:[ mv [选项] 源文件或目录 目标目录 ]
        -f              #强制移动
        -i              #以互动方式移动
        -u              #源文件更新才会移动

使用 mv 命令实现将/etc/passwd移动到/tmp目录下.

[root@localhost ~]# mv /etc/passwd /tmp/
[root@localhost ~]# ls -lh /tmp/
total 4.0K
-rw-r--r--. 1 0 root 898 Oct 13 12:37 passwd

使用 mv 命令实现一次移动多个文件,下面将/etc/passwd和/etc/shadow 移动到/tmp目录下.

[root@localhost ~]# mv /etc/passwd /etc/shadow /tmp/
[root@localhost ~]# ls -lh /tmp/
total 8.0K
-rw-r--r--. 1 0 root 898 Oct 13 12:37 passwd
----------. 1 0 root 714 Oct 13 12:37 shadow

使用 mv 命令实现重命名,将当前目录下的lyshark改名为linux.

[root@localhost ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Nov 13 10:19 lyshark
[root@localhost ~]# mv lyshark/ linux
[root@localhost ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Nov 13 10:19 linux

删除文件或目录: rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.

[root@localhost ~]# rm --help
语法格式:[ rm [选项] 文件或目录 ]
        -f              #不提示警告信息,直接删除
        -r              #递归删除
        -i              #删除前提示
        -fr             #常用搭配

使用 rm -fr 命令删除当前目录下的linux目录.

[root@localhost ~]# ls
linux
[root@localhost ~]# rm -fr linux/
[root@localhost ~]# ls

使用 rm -fr * 命令使用通配符,删除指定文件夹内的所有文件.

[root@localhost lyshark]# ls
1  10  2  3  4  5  6  7  8  9
[root@localhost lyshark]# rm -fr *
[root@localhost lyshark]# ls

判断文件的类型: file命令用来检测给定文件的类型,file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程

[root@localhost ~]# file --help
语法格式:[ file [选项] 文件或目录 ]
        -b              #列出辨识结果时,不显示文件名称
        -c              #详细显示指令执行过程
        -f 文件名        #在文件中一次读取并判断格式
        -z              #查询压缩包信息

使用 file 命令判断/etc/passwd 和 /bin/bash 文件的格式.

[root@localhost ~]# file /etc/passwd
/etc/passwd: ASCII text
[root@localhost ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=9a57e086388119ecd285c4d5c66823f3f3b68ab5, stripped

使用 file -z 命令读取lyshark.tar.gz压缩包文件属性.

[root@localhost ~]# ls -lh
total 9.4M
-rw-r--r--. 1 root root 9.4M Nov 13 10:51 lyshark.tar.gz
[root@localhost ~]# file -z lyshark.tar.gz 
lyshark.tar.gz: POSIX tar archive (GNU) ,
(gzip compressed data, from Unix, last modified: Tue Nov 13 10:51:13 2018)

使用 file -f 命令在文件中读取指定行,并依次判断文件.

[root@localhost ~]# cat temp 
/etc/passwd
/etc/shadow
/bin/bash
/bin/ls
[root@localhost ~]# file -f temp 
/etc/passwd: ASCII text
/etc/shadow: ASCII text
/bin/bash:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=9a57e086388119ecd285c4d5c66823f3f3b68ab5, stripped
/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]=ec3f3e5e8160c9917e8a4b896fe9044748472991, stripped

查询文件状态: stat命令用于显示文件的状态信息,stat命令的输出信息比ls命令的输出信息要更详细。

[root@localhost ~]# stat --help
语法格式:[ stat [选项] 文件或目录 ]
        -L              #支持符号连接
        -f              #显示文件系统状态而非文件状态
        -t              #以简洁方式输出信息

使用 stat 命令查询/bin/bash文件的相信信息.

[root@localhost ~]# stat /bin/bash
  File: ‘/bin/bash’
  Size: 964544      Blocks: 1888       IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 50340311    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:shell_exec_t:s0
Access: 2018-11-13 09:33:12.197999579 -0500
Modify: 2017-09-26 09:14:20.000000000 -0400
Change: 2018-10-13 12:32:43.377997461 -0400
 Birth: -

使用 stat -f 命令显示系统的状态信息.

[root@localhost ~]# stat -f /bin/bash
  File: "/bin/bash"
    ID: fd0000000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 4452864    Free: 4155020    Available: 4155020
Inodes: Total: 8910848    Free: 8877953

创建链接文件: ln命令用来为文件创件连接,既可以创建软连接也可以创建硬链接。

[root@localhost ~]# ln --help
语法格式:[ stat [选项] 文件或目录 ]
        -L              #支持符号连接
        -d              #建立目录的硬链接
        -f              #强制建立链接
        -i              #覆盖前询问
        -s              #建立一个软链接

使用 ln 命令建立一个硬链接.

[root@localhost ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
[root@localhost ~]# ln bash bash_ln
[root@localhost ~]# ls -lhi
total 1.9M
33844798 -rwxr-xr-x. 2 root root 942K Sep 26  2017 bash
33844798 -rwxr-xr-x. 2 root root 942K Sep 26  2017 bash_ln

使用 ln -s 命令建立一个软链接.

[root@localhost ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
[root@localhost ~]# ln -s bash bash_link
[root@localhost ~]# ls -lhi
total 944K
33844798 -rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
33959316 lrwxrwxrwx. 1 root root    4 Nov 13 11:06 bash_link -> bash

文件内容查阅命令

文本打印命令: cat 文件打印滚屏命令,控制参数输出。

[root@localhost ~]# cat --help
语法格式:[ cat [选项] 文件名 ]
        -b              #列出行号,空白行不标号
        -E              #将结尾段行符$显示出来
        -T              #将Tab键以^I显示出来
        -n              #打印出行号

使用 cat -n 命令给指定文本标号并打印.

[root@localhost ~]# cat -n /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
....省略....

使用 cat -E 命令显示文本结束符$.

[root@localhost ~]# cat -E /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$
sync:x:5:0:sync:/sbin:/bin/sync$
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown$
....省略....

显示开头文本: head命令用于显示文件的开头的内容,在默认情况下,head命令显示文件的头10行内容

[root@localhost ~]# head --help
语法格式:[ head [选项] 文件名 ]
        -c 10           #显示前10个字符
        -n 10           #显示前10行
        -v              #总是显示文件名的头信息
        -q              #不显示文件名的头信息

使用 head -c 命令显示文本的前20个字符.

[root@localhost ~]# head -c 20 /etc/passwd
root:x:0:0:root:/roo
[root@localhost ~]# 

使用 head -n 命令显示文本前3行.

[root@localhost ~]# head -n 3 /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

显示结尾文本: tail命令用于输入文件中的尾部内容,tail命令默认在屏幕上显示指定文件的末尾10行

[root@localhost ~]# tail --help
语法格式:[ tail [选项] 文件名 ]
        -c 10           #显示后10个字符
        -n 10           #显示文件后10行
        -f              #持续监测文件后面的变化
        --pid=PID       #与-f合用,表示在进程ID,死掉之后结束

使用 tail -n 命令显示文本后3行.

[root@localhost ~]# tail -n 3 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
lyshark:x:1000:1000:lyshark:/home/lyshark:/bin/bash

使用 tail -f 命令动态监控一个文件.

[root@localhost ~]# tail -f /var/log/messages 
Nov 13 10:01:01 localhost systemd: Starting Session 3 of user root.
Nov 13 10:10:54 localhost kernel: e1000: ens32 NIC Link is Down
Nov 13 10:10:58 localhost kernel: e1000: ens32 NIC Link is Up 
Nov 13 10:10:58 localhost NetworkManager[772]: <info>  
....省略....

使用 tail --pid=PID 命令监视一个进程.

[root@localhost ~]# ps
   PID TTY          TIME CMD
  1404 pts/0    00:00:00 bash
 11441 pts/0    00:00:00 ps
[root@localhost ~]# 
[root@localhost ~]# tail --pid=1401
tail: warning: PID ignored; --pid=PID is useful only when following
....省略....

使用 tail -n +5 命令从第五行以后开始打印.

[root@localhost ~]# tail -n +5 /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
....省略....

使用 tail -n +5 | head -n 3 命令从第五行开始打印,向下打印2行内容.

[root@localhost ~]# tail -n +5 /etc/passwd |head -n 3
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

指定格式输出文本: nl命令读取file参数缺省情况下标准输入,计算输入中的行号,将计算过的行号写入标准输出.

[root@localhost ~]# nl --help
语法格式:[ nl [选项] 文件名 ]
        -c 10           #显示后10个字符
        -b a            #列出行号,包括空格(类似 cat -n)
        -b t            #列出行号,不包括空格(类似 cat -n)
        -n ln           #行号显示在最左边
        -n rn           #行号显示在最右边
        -n rz           #行号显示在最右边,并加0补齐
        -w              #指定补齐0的个数

使用 nl -b a 命令给文本标号打印(类似于cat -n).

[root@localhost ~]# nl -b a /etc/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
....省略....

使用 nl -b a -n rz 命令列出文本并给予编号,空格0填充.

[root@localhost ~]# nl -b a -n rz /etc/passwd
000001  root:x:0:0:root:/root:/bin/bash
000002  bin:x:1:1:bin:/bin:/sbin/nologin
000003  daemon:x:2:2:daemon:/sbin:/sbin/nologin
000004  adm:x:3:4:adm:/var/adm:/sbin/nologin
000005  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
....省略....

使用 nl -b a -n rz -w 3 命令列出文本并给予编号,编号填充2行0.

[root@localhost ~]# nl -b a -n rz -w 3 /etc/passwd
001 root:x:0:0:root:/root:/bin/bash
002 bin:x:1:1:bin:/bin:/sbin/nologin
003 daemon:x:2:2:daemon:/sbin:/sbin/nologin
004 adm:x:3:4:adm:/var/adm:/sbin/nologin
005 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
....省略....

非纯文本文件打印: od用于输出文件的八进制、十六进制或其它格式编码字节,此命令主要用来查看保存在二进制文件中的值.

[root@localhost ~]# od --help
语法格式:[ od [选项] 文件名 ]
        -t a            #利用默认字符来输出
        -t c            #使用ASCII字符输出
        -t d            #使用十进制输出
        -t f            #使用浮点数输出
        -t o            #使用八进制输出
        -t x            #使用十六进制输出

使用 od -t a 命令使用默认格式输出.

[root@localhost ~]# od -t a /bin/cd 
0000000   #   !   /   b   i   n   /   s   h  nl   b   u   i   l   t   i
0000020   n  sp   c   d  sp   "   $   @   "  nl
0000032

使用 od -t c 命令使用ASCII输出.

[root@localhost ~]# od -t c /bin/cd 
0000000   #   !   /   b   i   n   /   s   h  \n   b   u   i   l   t   i
0000020   n       c   d       "   $   @   "  \n
0000032

使用 od -t x 命令输出二进制文件的十六进制。

[root@localhost ~]# od -t x /bin/cd
0000000 622f2123 732f6e69 75620a68 69746c69
0000020 6463206e 40242220 00000a22

翻页浏览文本: more/less命令都是文本翻阅查看命令。

[root@localhost ~]# more --help
语法格式:[ more 文件名 ]
        空格            #像下翻一页
        B               #向上翻一页
        Enter           #向下滚动一行
        /字符串          #向下查找字符串
        :f              #立即显示行号
        q或Q            #退出
[root@localhost ~]# less --help
语法格式:[ less [选项] 文件名 ]
        -e              #文件显示完成后自动退出
        -f              #强制显示文件
        -l              #搜索时忽略大小写的差异
        -N              #每一行行首显示行号
        空格             #向下翻动一页
        [pageup]        #向上翻动一页
        /字符串          #向下查找字符串
        ?字符串          #向上查找字符串
        q               #退出

文件打补丁: 给指定的配置文件打补丁,通过对比生成差异文件,并打入补丁.

[root@localhost ~]# diff --help
语法格式:[ diff [选项] 源文件 新文件 > *.patch ]
        -a          #将任何文档当做文本文档处理
        -b          #忽略空格造成的不同
        -B          #忽略空白行造成的不同
        -I          #忽略大小写造成的不同
        -N          #当比较目录时,若某个文件只在一个目录中,则另一个目录中视作空文件
        -r          #当比较目录时,递归比较子目录
        -u          #使用同一的输出格式
[root@localhost ~]# diff -Naur /root/old /root/new > lyshark.patch #生成补丁文件
[root@localhost ~]# patch -p2 old < lyshark.patch                  #追加打补丁

文件目录查找命令

查命令绝对路径: which用于查找并显示给定命令的绝对路径,环境变量中PATH参数也可以被查出来。

[root@localhost ~]# which bash
/usr/bin/bash
[root@localhost ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls

寻找特定文件: whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径,该命令只能用于程序名的搜索

[root@localhost ~]# whereis --help
语法格式:[ whereis [选项] 文件名 ]
        -b              #只找二进制文件
        -m              #只找man文档
        -s              #只找源代码

使用 whereis -b 命令找二进制文件,与帮助手册。

[root@localhost ~]# whereis -b ifconfig
ifconfig: /usr/sbin/ifconfig
[root@localhost ~]# whereis -m ifconfig
ifconfig: /usr/share/man/man8/ifconfig.8.gz

缓存查找文件: locate 搜索一个数据库/var/lib/mlocatedb,这个数据库中含有本地所有文件信息,Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件,为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库,updatedb命令会根据/etc/updatedb.conf来更新文件.

[root@localhost ~]# yum install -y mlocate
[root@localhost ~]# locate --help
语法格式:[ locate [选项] 文件名 ]
        -d 目录        #指定数据库所在的目录
        -i             #忽略大小写差异
        -r             #后面接正则表达式

使用 locate 命令查询一个文件.

[root@localhost ~]# updatedb 
[root@localhost ~]# locate /etc/passwd
/etc/passwd
/etc/passwd-

高级文件查找命令

遍历文件查找: find 命令可以说是最重要的查找命令了,该命令参数较多。

[root@localhost ~]# find --help
语法格式:[ find [目录] [属性] 文件名 ]
        -name         #按文件名查找
        -size         #根据大小查找
        -user         #根据属主查找
        -perm         #根据权限查找
        -type         #根据类型查找
        -time         #按时间查找
        -inum         #根据i节点查询
        -exec         #查找后执行命令

-name 按文件名查找:

常用查询通配符
\*     #匹配任意一个或多个字符
?     #匹配任意一个字符
[]     #指定范围,外侧加引号

查找/var/目录下,以.log结尾的文件.

[root@localhost ~]# find /var/ -name "*.log"
/var/log/tuned/tuned.log
/var/log/audit/audit.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
....省略....

查找/root/目录下,以[1-3之间],结尾是.txt的文件

[root@localhost ~]# ls
1.txt  2.txt  3.txt  Catalog  File
[root@localhost ~]# find /root/ -name "[1-3].txt"
/root/1.txt
/root/2.txt
/root/3.txt

查找/etc/目录下,开头是6个任意字符的文件

[root@localhost ~]# find /etc/ -name "??????"
/etc/grub.d
/etc/grub.d/README
/etc/shells
/etc/init.d
....省略....

-size 根据大小查找

单位是 block 数据块  一块是512字节
1M -> 1024k -> 2048 块  (1块是0.5k 也就是512字节)
100M -> 102400k -> 204800块

查找/etc/目录下,小于10k的文件

root@localhost ~]# find /etc/ -size -10k
/etc/crypttab
/etc/.pwd.lock
/etc/environment
....省略....

查找/etc/目录下,大于1M的文件

[root@localhost ~]# find /etc/ -size +1M   #查询大于1M的文件
/etc/udev/hwdb.bin
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
....省略....
#注意:+-号如果没有,是精确到这么大,通常都会带上+或-号表示一个范围.

-user 根据属主与权限查找

在/root目录中查找属于wang用户的文件

[root@localhost ~]# find /root/ -user wang
/root/1.txt
/root/2.txt
/root/3.txt
#注意:系统中要存在该用户,否则会报错误.

查找/boot/目录中权限是644的文件

[root@localhost ~]# find /boot/ -perm 0644
/boot/grub2/device.map
/boot/grub2/i386-pc/gcry_rmd160.mod
/boot/grub2/i386-pc/acpi.mod
/boot/grub2/i386-pc/gcry_rsa.mod
....省略....

-type 根据类型查找

-type f 二进制文件(普通文件)
-type l 软链接文件
-type d 目录

查找/usr/bin/目录下,类型是二进制文件.

[root@localhost ~]# find /usr/bin/ -type f
/usr/bin/cp
/usr/bin/gzip
/usr/bin/alias
/usr/bin/csplit
/usr/bin/bash
....省略....

-time 按时间查找

按天数   ctime  atime  mtime
按分钟   cmin   amin     mmin
  c  change   #表示属性被修改过:所有者、所属组、权限
  a  access   #被访问过(被查看过)
  m  modify   #表示内容被修改过

查找/etc/目录下,在120分钟以内,内容被修改过的文件

[root@localhost ~]# find /etc/ -mmin -120
/etc/
/etc/resolv.conf
/etc/group-
/etc/gshadow-
/etc/group
/etc/gshadow
....省略....

查找/etc/目录下,在7天之前,属性被修改过的文件

[root@localhost ~]# find /etc/ -ctime +7
/etc/resolv.conf
/etc/group-
/etc/gshadow-
....省略....

-inum 根据i节点查询

有一些文件的硬链接数量很多,有相同的i节点,查找其中一个文件的i节点号,一次性删除。

[root@localhost ~]# find ./ -inum 1024 -exec rm{} \;   #删除相同I节点的数据

-and or 逻辑连接符

-a    (and 逻辑与)     
-o    (or  逻辑或)

在/etc/目录下,查找大于1k,并且小于10k的文件

[root@localhost ~]# find /etc/ -size +1k -a -size -10k
/etc/
/etc/grub.d/00_header
/etc/grub.d/20_ppc_terminfo
/etc/grub.d/00_tuned
/etc/rc.d/init.d/README
/etc/rc.d/init.d/netconsole
/etc/rc.d/init.d/network
/etc/pam.d
....省略....

-exec 命令执行连接符

[查询格式] find  ...  -exec 命令 {}  \;
{}        #表示find查询的结果集
\         #是转义符,不使用命令别名,直接使用命令本身
;         #分号是表示语句的结束.
#注意:固定格式,只能这样写.注意中间的空格.
-----------------------------------------------------------------
说明: 转义符的作用是什么?
在linux中有一个别名机制,如rm删除文件,执行的却是rm -i(用which rm 可以查看命令别名),
使用rm删除文件前会提示,就是因为rm -i这个参数。如果想使用命令原意,可以在加\转义,
如:\rm test.txt   则不会提示,直接删除

查找/var/log/目录下名字以.log结尾的文件,找到后执行 ls -l 显示详细信息.

[root@localhost ~]# find /var/log/ *.log -exec ls -l {} \;
total 1176
drwxr-xr-x. 2 root   root      204 Sep 18 09:12 anaconda
drwx------. 2 root   root       23 Sep 18 09:12 audit
-rw-------. 1 root   root    53001 Sep 19 00:57 boot.log
-rw-------. 1 root   utmp      384 Sep 18 09:22 btmp
drwxr-xr-x. 2 chrony chrony      6 Apr 12 13:37 chrony
-rw-------. 1 root   root     3523 Sep 19 01:01 cron
-rw-r--r--  1 root   root   119414 Sep 19 00:57 dmesg
-rw-r--r--  1 root   root   119599 Sep 18 23:35 dmesg.old
-rw-r--r--. 1 root   root     1320 Sep 19 00:23 firewalld
-rw-r--r--. 1 root   root      193 Sep 18 09:05 grubby_prune_debug
....

查找/etc/目录下名字以”init*”开头的文件,找到后,只列出文件,过滤掉目录,并执行 ls -l 显示详细信息.

[root@localhost ~]# find /etc/ -name "init*" -a -type f -exec ls -l {} \;
-rw-r--r--. 1 root root 511 Apr 11 01:09 /etc/inittab
-rw-r--r--. 1 root root 798 Apr 11 01:09 /etc/sysconfig/init
-rwxr-xr-x. 1 root root 5419 Jan  2  2018 /etc/sysconfig/network-scripts/init.ipv6-global
-rw-r--r--. 1 root root 30 Apr 11 14:12 /etc/selinux/targeted/contexts/initrc_context

查找/tmp/下,的yum.log文件,找到后直接删除.

[root@localhost tmp]# find /tmp/ -name yum.log -exec rm {} \;
[root@localhost tmp]#

查找根下,找关于lyshark用户的所有文件,找到后直接删除.

[root@localhost ~]# find / -user lyshark -exec rm -r {} \;
find: ‘/proc/1465/task/1465/fd/6’: No such file or directory
find: ‘/proc/1465/task/1465/fdinfo/6’: No such file or directory
find: ‘/proc/1465/fd/5’: No such file or directory
find: ‘/proc/1465/fdinfo/5’: No such file or directory
find: ‘/root/Catalog’: No such file or directory
find: ‘/home/lyshark’: No such file or directory
#rm -r 连带目录一起删除.报错原因:-exec 不适合大量传输,速率慢导致.

在根下,查找lyshark用户的文件,找到后删除,删除前会提示是否删除.

[root@localhost ~]# find / -user lyshark -ok rm -r {} \;
find: ‘/proc/1777/task/1777/fd/6’: No such file or directory
find: ‘/proc/1777/task/1777/fdinfo/6’: No such file or directory
< rm ... /root/LyShark > ? y
# -ok的使用和-exec是一样的,区别是-ok,执行时会提示你是否进行下一步操作.

文件目录压缩命令

compress压缩: compress是个历史悠久的压缩程序,文件经它压缩后,其名称后面会多出 “.Z” 的扩展名。

[root@localhost ~]# yum install -y ncompress
[root@localhost ~]# compress --help
命令语法:[ compress [选项] 文件或目录 ]
        -f              #强制覆盖掉目标文件
        -c              #将结果送到标准输出,无文件被改变
        -r              #递归的操作方式
        -b 数字         #压缩效率是一个介于9~16
        -d              #对文件进行解压缩而非压缩
        -v              #显示指令执行过程

通过使用compress -c命令压缩一个文件.

[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
[root@localhost ~]# compress -c bash > bash.Z
[root@localhost ~]# ls -lh
total 1.6M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z

通过使用compress -d命令解压一个文件.

[root@localhost ~]# ls -lh
total 596K
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z
[root@localhost ~]# compress -d bash.Z
[root@localhost ~]# ls -lh
total 944K
-rw-r--r--. 1 root root 942K Nov 16 06:38 bash

zip压缩: zip命令压缩的拓展名.zip 各种系统都支持zip的压缩格式,所以在一定程度上,是可以通用的.

[root@localhost ~]# yum install -y zip unzip
[root@localhost ~]# zip --help
命令语法:[ zip/unzip [选项] 文件或目录 ]
        -r              #递归压缩,连同子目录一同压缩
        -S              #包含系统和隐藏文件
        -v              #显示指令执行过程
        -q              #不显示指令执行过程

通过使用zip -r -v命令将/etc/目录全部内容压缩.

[root@localhost ~]# zip -r -v lyshark.zip /etc/
[root@localhost ~]# ls -lh
total 12M
-rw-r--r--. 1 root root 12M Nov 16 09:46 lyshark.zip

使用unzip -l命令查询一个压缩包中的文件.

[root@localhost ~]# unzip -l lyshark.zip

使用unzip -d命令将文件解压到指定目录.

[root@localhost ~]# unzip lyshark.zip -d /tmp/
[root@localhost ~]# ls -lh /tmp/
total 12K
drwxr-xr-x. 84 root root 8.0K Nov  6 11:02 etc

gzip压缩: gzip是Linux系统默认支持的压缩格式,其可以与tar命令结合使用,gzip对文本文件有60%~70%的压缩率。

[root@localhost ~]# gzip --help
命令语法:[ gzip/zcat [选项] 文件或目录 ]
        -a              #使用ASCII文字模式
        -d              #解开压缩文件
        -f              #强行压缩文件
        -l              #列出压缩文件的相关信息
        -n              #压缩时,不保存原来的文件名称及时间戳
        -N              #压缩时,保存原来的文件名称及时间戳
        -q              #不显示警告信息
        -r              #递归处理
        -v              #显示指令执行过程

通过使用gzip -rv命令压缩一个文件.

[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
[root@localhost ~]# gzip -rv bash
bash:    51.2% -- replaced with bash.gz
[root@localhost ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

通过使用gzip -l/zcat -l命令查询一个文件.

[root@localhost ~]# gzip -l bash.gz
         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash
[root@localhost ~]# zcat -l bash.gz
         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash

通过使用gzip -dv / zcat命令解压一个文件.

[root@localhost ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz
[root@localhost ~]# gzip -dv bash.gz
bash.gz:         51.2% -- replaced with bash
[root@localhost ~]# zcat -d bash.gz >bash_zcat

bzip2压缩: bzip2命令用于创建和管理,包括解压缩,使用这个命令必须要先安装,因为这个命令并没有集成安装.

[root@localhost ~]# yum install -y bzip2
[root@localhost ~]# bzip2 --hlep
命令语法:[ bzip2/bzcat [选项] 文件或目录 ]
        -c              #输出压缩解压过程
        -d              #执行解压缩
        -k              #解压后保留原始文件
        -v              #压缩或解压时详细输出
        -z              #强制执行压缩

通过使用bzip2 -kzv命令将bash文件压缩.

[root@localhost ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
[root@localhost ~]# bzip2 -kzv bash
  bash:     2.164:1,  3.697 bits/byte, 53.79% saved, 964544 in, 445742 out.

通过使用bzip2 -kdv命令解压缩bash.bz2文件.

[root@localhost ~]# ls -lh
total 436K
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2
[root@localhost ~]# bzip2 -kdv bash.bz2
  bash.bz2: done

tar 归档并压缩: 该命令常常与gz,bz2等压缩命令结合使用。

[root@localhost ~]# tar --hlep
命令语法:[ tar [选项] 文件或目录 ]
        -c              #新建打包
        -t              #查看打包文件
        -x              #解压打包文件
        -j              #通过bz2进行压缩与解压
        -z              #通过gz进行压缩与解压
        -J              #通过xz进行压缩与解压
        -v              #显示压缩与解压过程
        -C              #指定解压到哪里

通过使用tar -czvf xzvf tvf命令压缩解压与查询.

[root@localhost ~]# tar -czvf lyshark.tar.gz /etc/*        #将/etc/*目录下的内容压缩成lyshark.tar.gz
[root@localhost ~]# tar -tvf lyshark.tar.gz                #查询包中的内容
[root@localhost ~]# tar -xzvf lyshark.tar.gz -C /etc/      #将压缩包,解压到/etc/目录下

通过使用tar -cjvf xjvf tvf命令压缩解压与查询.

[root@localhost ~]# tar -cjvf lyshark.tar.bz2 /etc/*        #将/etc/*目录下的内容压缩成lyshark.tar.bz2
[root@localhost ~]# tar -tvf lyshark.tar.bz2                #查询包中的内容
[root@localhost ~]# tar -xjvf lyshark.tar.bz2 -C /etc/      #将压缩包,解压到/etc/目录下

通过使用tar -cJvf xJvf tvf命令压缩解压与查询.

[root@localhost ~]# tar -cJvf lyshark.tar.xz /etc/*         #将/etc/*目录下的内容压缩成lyshark.tar.xz
[root@localhost ~]# tar -tvf lyshark.tar.xz                 #查询包中的内容
[root@localhost ~]# tar -xJvf lyshark.tar.xz -C /etc/       #将压缩包,解压到/etc/目录下

cpio块级压缩: cpio用来建立或者还原备份的工具程序,cpio命令可以备份任何东西包括设备文件。

[root@localhost ~]# cpio --help
压缩语法:[ cpio –cvBo > [文件|设备] ]
        -c              #使用portable format存储方式
        -v              #显示过程
        -B              #设定输入输出块为512bytes
        -o              #进入copy-out模式(压缩)
查看语法:[ cpio –ivct < [cpio文件] ]
        -i              #将数据从文件复制到系统中
        -c              #使用portable format存储方式
        -t              #查看CPIO压缩包内容
还原语法:[ cpio –idvcu < [cpio文件] ]
        -i              #进入copy-in模式(解压)
        -d              #恢复到指定位置(视压缩方式恢复)
        -v              #显示过程
        -c              #使用portable format存储方式
        -u              #替换所有文件,无提示

使用cpio -cvBo命令,来备份/etc/目录

[root@localhost ~]# find /etc/ -print | cpio -cvBo > /root/etc.cpio
[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

使用cpio -cvBo命令,将/etc/目录下的内容备份到/sdb磁盘

[root@localhost ~]# find /etc/ -print | cpio -cvBo > /dev/vdb

使用cpio -ivct命令查询,压缩包内容

[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio
[root@localhost ~]# cpio -ivct < etc.cpio

使用cpio -idvcu还原文件到/etc/目录

[root@localhost ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio
[root@localhost ~]# cpio -idvcu < /root/etc.cpio

制作ISO镜像: mkisofs命令用来将指定的目录与文件做成ISO 9660格式的映像文件。

[root@localhost ~]# mkisofs --help
命令语法:[ mkisofs [选项] 文件或目录 ]
        -o              #后面接镜像名
        -r              #连同文件属性一起记录
        -v              #显示构建过程
        -m              #排除指定文件
        -V              #新建volume

通过mkisofs制作一个镜像将/etc目录制作成lyshark.iso.

[root@localhost ~]# mkisofs -r -v -o /root/lyshark.iso /etc/
[root@localhost ~]# ls -lh
total 123M
-rw-r--r--. 1 root root 123M Nov 16 11:14 lyshark.iso

磁盘测速与拷贝: dd命令用于磁盘测速与备份,该命令很底层所以可以完成很多备份工具无法完成的功能。

[root@localhost ~]# dd --help
备份语法:[ dd [if=源文件] [of=输出] [count=计数] ]
        if=文件名        #输入文件名
        of=文件名        #输出文件名
        bs=bytes        #读入计数
        count=blocks    #仅拷贝blocks个块
        /dev/zero       #是字符设备会不断返回0值字节
        /dev/null       #空设备,相当于一个垃圾桶

通过使用dd进行磁盘测速,测磁盘读写速度(可分别测试1024,2048,4096,8192)

[root@localhost ~]# dd if=/dev/zero of=/dev/null bs=1024 count=10000
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.00852247 s, 1.2 GB/s

通过使用dd进行磁盘常规备份

#将本地的 /dev/sda 整盘备份到 /dev/hdd
[root@localhost ~]# dd if=/dev/sda /of=/dev/hdd
#将 /dev/sda 全盘数据备份成指定路径的image文件
[root@localhost ~]# dd if=/dev/sda of=/tmp/image
#将image备份文件恢复到指定盘/dev/sdb
[root@localhost ~]# dd if=/tmp/image of=/dev/sdb
#备份 /dev/sda 全盘数据,并利用gzip工具进行压缩,保存到/tmp/image.gz
[root@localhost ~]# dd if=/dev/sda | gzip > /tmp/image.gz
#恢复,将压缩的备份文件 /tmp/image.gz ,恢复到制定盘 /dev/sdb
[root@localhost ~]# gizp -dc /tmp/image.gz | dd of=/dev/sdb

通过使用dd命令备份磁盘MBR,与恢复分区MBR.

#备份MBR,备份磁盘 /dev/sda 开始的512个字节大小的MBR信息到指定文件/tmp/mbr512
#其中:count=1 指仅拷贝一个块;bs=512 指块大小为512个字节
[root@localhost ~]# dd if=/dev/sda of=/tmp/mbr512 count=1 bs=512
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00015245 s, 3.4 MB/s
#恢复MBR,将备份 /tmp/mbr512 的MBR信息写到磁盘开始部分 /dev/sda
[root@localhost ~]# dd if=/tmp/mbr512 of=/dev/sda
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000201242 s, 2.5 MB/s

通过使用dd命令拷贝内存数据与光盘数据到指定位置。

#拷贝内存内容到磁盘
[root@localhost ~]# dd if=/dev/mem of=/tmp/mem_image bs=1024(指定块大小为1k)
dd: error reading ‘/dev/mem’: Bad address
632+0 records in
632+0 records out
647168 bytes (647 kB) copied, 0.001591 s, 407 MB/s
#拷贝光盘内容到指定文件夹,并保存为/tmp/LyShark.iso文件
[root@localhost ~]# dd if=/dev/sr0 of=/tmp/LyShark.iso
1249+0 records in
1248+0 records out
638976 bytes (639 kB) copied, 0.368021 s, 1.7 MB/s
#利用随机数填充磁盘,彻底销毁磁盘 /dev/sdb 数据
[root@localhost ~]# dd if=/dev/urandom of=/dev/sdb

软件仓库管理命令

RPM 命令的使用

RPM 全名是 “RedHat Package Manager” 简称则为 RPM 顾名思义,当初这个软件管理的机制就是由 Red Hat 这家公司开发出来的 RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制.

RPM软件包参数:
BASHBASH
[root@localhost ~]# ls -lh
total 1.8M
-r–r–r–. 1 root root 1.8M Jan 17 2018 bind-9.9.4-61.el7.x86_64.rpm

bind .9.9.4 -61 .el7 .x86_64 .rpm
↑ ↑ ↑ ↑ ↑ ↑
① ② ③ ④ ⑤ ⑥

1.软件名称:本例软件名为bind
2.软件版本:本例软件版本为9.9.4-61
3.发布次数:本例修改了61次
4.编译平台:编译平台有(el8=RHEL8,el7=RHEL7,el6=RHEL6)
5.适合平台:平台有(i386,i586,i686,noarch,x86_64)
6.打包格式:这里是rpm包,还有一种gpkg包.
“`
RPM安装软件: 安装软件是ROOT的工作,因此你得要是ROOT的身份才能够使用RPM命令,该命令参数如下.

[root@localhost ~]# rpm --help
命令语法:[ rpm [选项] 包名称 ]
        -i              #安装一个新的rpm软件包
        -v              #显示安装详细过程
        -h              #以"#"号显示安装的进度
        --nodeps        #不检测依赖安装
        --force         #强制安装,不管软件是否存在,都强制重新安装(修复软件)
        --test          #测试安装,不真正安装,检测软件依赖关系
        --prefix        #指定安装路径,不按照默认路径安装
        --replacefiles  #以覆盖写入方式安装
        --replacepkgs   #重复安装软件
        --justdb        #更新软件在数据库内的相关信息
        --nosignature   #忽略数字证书检测
        --noscripts     #禁止软件安装过程中执行某些命令

RPM查询信息: RPM在查询的时候,其实查询的地方是在/var/lib/rpm/ 这个目录下的数据文件。

[root@localhost ~]# rpm --help
命令语法:[ rpm [选项] 包名称 ]
[查询已安装软件]
        -q 软件名        #查看指定软件是否安装
        -qa             #查看系统中所有已安装的软件
        -qi 软件名       #查看指定软件的详细信息
        -qc 软件名       #列出软件所以设置文件
        -qd 软件名       #列出软件所以帮助文件
        -ql 软件名       #查看指定软件安装的目录和文件列表
        -qR 软件名       #查看指定软件的依赖关系
        –qf 文件或目录   #查询文件或者目录,是由哪个软件包安装产生的
[查询未安装软件]
        -qpi 包全名      #查看指定未安装软件的详细信息
        -qpl 包全名      #查看指定未安装软件的默认安装位置(预览)
        -qpR 包全名      #查看指定未安装软件的依赖关系

RPM升级软件: 使用RPM升级,就以-Uvh或-Fvh来升级即可

[root@localhost ~]# rpm --help
命令语法:[ rpm [选项] 包名称 ]
        -v              #显示安装详细过程
        -h              #以"#"号显示安装的进度
        -U              #升级安装,若没安装,则直接安装,若安装有旧版本,则升级安装
        -F              #升级安装,若没安装,则不安装,必须有旧版本,才进行升级安装

RPM卸载软件:移除的选项很简单,直接通过-e移除,必要时使用--rebuilddb重建一下数据库文件.

[root@localhost ~]# rpm --help
命令语法:[ rpm [选项] 包名称 ]
        -e           #卸载软件(注意卸载顺序)
        --nodeps     #不检测依赖卸载
        --rebuilddb  #重建数据库,防止错误

RPM提取文件: 从RPM包中提取出包里面的文件内容,类似于解压缩,这里解压的是RMP包。

[root@localhost ~]# ls -l
total 48
-rw-rw-r-- 1 root root 47508 Jul  4  2014 tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]# rpm2cpio tree-1.6.0-10.el7.x86_64.rpm |cpio -idv     #提取tree包中的文件
[root@localhost ~]# ll
total 48
-rw-rw-r-- 1 root root 47508 Jul  4  2014 tree-1.6.0-10.el7.x86_64.rpm
drwxr-xr-x 4 root root    30 Sep 20 05:17 usr

RPM验证证书: 证书验证可以确保文件的原生性,即有没有被修改过,命令如下:

[root@localhost ~]# rpm --help
命令语法:[ rpm [选项] 包名称 ]
        -V 软件名        #验证指定软件安装后的完整性,及文件的元数据是否发生变化
        -Va             #列出目前系统上所有被改动过的文件
        -Vf 文件名       #验证指定文件是否被修改过
        -Vp 文件名       #列出该软件内可能被改动过的文件

下面,我们通过验证/etc/profile文件来作为模板,看其每个参数所代表的含义.

[root@localhost ~]# rpm -Vf /etc/profile
S.5....T.      c           /etc/profile
#↑ 验证结果     ↑ 文件类型   ↑ 文件位置
验证结果具体的信息:
s -------------> 文件大小是否改变
M -------------> 权限是否被改变
5 -------------> 文件的MD5校验和是否改变(即文件内容)
D -------------> 主从设备号是否改变(/dev/)
L -------------> 文件路径是否改变
U -------------> 文件的属主是否改变
G -------------> 文件的属组是否改变
T -------------> 文件的修改时间是否改变
文件类型具体分类:
c -------------> 配置文件
d -------------> 普通文件
g -------------> 鬼文件
l -------------> 授权文件
r -------------> 描述文件

RPM导入证书: 通过命令我们可以导入系统镜像的原厂证书,不导入的话可能无法安装程序。

[root@localhost ~]# ls -lh /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
-rw-r--r--. 1 root root 3.2K Feb 28  2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@localhost ~]# ls -lh /mnt/RPM-GPG-KEY-redhat-release
-r--r--r--. 1 root root 3.2K Feb 28  2018 /mnt/RPM-GPG-KEY-redhat-release
[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release  # 导入证书
[root@localhost ~]# rpm -qa |grep pubkey                                      # 查询证书
gpg-pubkey-2fa658e0-45700c69
[root@localhost ~]# rpm -qi gpg-pubkey-2fa658e0-45700c69

YUM命令的使用

YUM 是通过分析 RPM 的标头数据后,根据各软件的相关性,制作出软件依赖解决方案,然后可以自动处理软件的依赖属性问题,以解决软件安装或移除与升级的问题,各大厂商都会提供自己的软件仓库,网上就可以找到很多配置方式.

配置本地YUM源: 我们的系统光盘里就存在一个本地YUM仓库,我们只需要配置一下即可使用了。

[root@localhost ~]# mount /dev/sr0 /mnt
[root@localhost ~]# cat /etc/yum.repos.d/redhat.repo
[server]
name="redhat yum"
baseurl=file:///mnt
enabled=1
gpgcheck=0
gpgkey=
[root@localhost ~]# yum repolist all  # 查询仓库是否配置成功
[root@localhost ~]# yum makecache     # 建立本地仓库缓存

配置网络YUM源: 由于RHEL系统YUM是收费的,所以我们要将其改成Centos的YUM源来使用.

# 删除RHEL系统中默认的YUM仓库程序
[root@localhost ~]# rpm -qa |grep "yum" |xargs rpm -e --nodeps
[root@localhost ~]# rpm -qa |grep "python-urlgrabber" |xargs rpm -e --nodeps
[root@localhost ~]# rpm -qa |grep yum
# 下载Centos7系统的YUM源仓库工具并强制安装
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-161.el7.centos.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-50.el7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-50.el7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-9.el7.noarch.rpm
[root@localhost ~]# rpm -ivh --nodeps *.rpm
# 下载Centos7系统的Yum源
[root@localhost ~]# rm -fr /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 编辑配置文件并替换所有的$releaserver替换为7
[root@localhost ~]# vim /etc/yum.repos.d/CentOS-Base.repo
:%s/$releasever/7/g
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache

YUM仓库查询:

[root@localhost ~]# yum --help
命令语法:[ yum [选项] 包名称 ]
        -y              #自动化安装,无需应答
        installroot     #安装时指定安装位置
        search          #搜索指定包文件
        list            #显示全部可用列表
        info            #显示软件相关信息
        grouplist       #查询所有已安装和可安装的软件组
        groupinfo       #列出软件组中包含的软件
        provides        #通过关键字查找安装包

YUM安装与更新:

[root@localhost ~]# yum install [软件名]              #全部安装
[root@localhost ~]# yum groupinsall [软件组名]        #安装程序组
[root@localhost ~]# yum update [软件名]              #全部更新
[root@localhost ~]# yum check-update                #检查可更新的程序
[root@localhost ~]# yum upgrade [软件名]             #升级指定程序包
[root@localhost ~]# yum groupupdate [组软件名]       #升级程序组
[root@localhost ~]# yum  remove [软件名]              #删除软件
[root@localhost ~]# yum  groupremove [软件组名]       #删除软件组

YUM清理缓存:

[root@localhost ~]# yum clean packages       #清除缓存目录下的软件包
[root@localhost ~]# yum clean headers        #清除缓存目录下的 headers
[root@localhost ~]# yum clean oldheaders     #清除缓存目录下旧的 headers
[root@localhost ~]# yum clean all            #清除下载的临时软件包和缓存
[root@localhost ~]# yum makecache            #建立软件包缓存,提高查询速度
[root@localhost ~]# yum update               #更新所有需要更新的软件&内核

安装图形界面:

[root@localhost ~]# yum -y install xorg*
[root@localhost ~]# yum -y groupinstall "X Window System"
[root@localhost ~]# yum -y groupinstall Desktop
[root@localhost ~]# yum -y groupinstall "Chinese Support"
[root@localhost ~]# startx  

APT命令的使用

apt-get 是一款适用于Unix和Linux系统的应用程序管理器,最初于1998年发布,用于检索应用程序并将其加载到Debian系统,Apt-get成名的原因之一在于其出色的解决软件依赖关系的能力,其通常使用.deb-formatted文件,随着Linux在企业中的普及,Windows和Mac用户了解如何使用apt-get加载应用程序有一定的好处.

DPKG包管理命令:

root@kali:~# dpkg --help
命令语法:[ dpkg [选项] 包名称 ]
        -i              #安装软件包
        -r              #删除软件包
        -P              #删除软件包的同时删除其配置文件
        -L              #显示软件包文件列表
        -l              #显示已安装软件包列表
        -c              #显示软件包内文件列表
        -s              #显示指定软件包的详细状态
        --unpack        #解开软件包
        --confiugre     #配置软件包

APT包管理工具:

root@kali:~# apt --help
命令语法:[ apt [选项] 包名称 ]
        -i              #安装软件包
        list            #根据名称列出软件包
        search          #搜索软件包描述
        show            #显示软件包细节
        install         #安装软件包
        remove          #移除软件包
        autoremove      #卸载所有自动安装且不再使用的软件包
        update          #更新可用软件包列表
        upgrade         #通过安装/升级软件来更新系统

apt安装与删除:

root@kali:~# sudo apt-get install package             #安装包
root@kali:~# sudo apt-get install package --reinstall #重新安装包
root@kali:~# sudo apt-get -f install                  #修复安装
root@kali:~# sudo apt-get bulid-dep package           #安装相关的编译环境
root@kali:~# sudo apt-get remove package              #删除包
root@kali:~# sudo apt-get remove package --purge      #完全删除包
root@kali:~# sudo apt-get -f autoremove               #把软件附加项也删掉
root@kali:~# sudo apt-get autoremove --purge software #删除的更彻底些

apt更新与修复:

root@kali:~# sudo apt-get update                          #更新源
root@kali:~# sudo apt-get upgrade                         #更新已安装的包
root@kali:~# sudo apt-get dist-upgrade                    #升级系统
root@kali:~# sudo apt-get source package                  #下载该包的源代码
root@kali:~# sudo apt-get clean && sudo apt-get autoclean #清楚无用的包
root@kali:~# sudo apt-get check                           #检查是否有损坏的依赖
root@kali:~# sudo dpkg -i package                         #安装后缀是deb的

apt搜索软件包:

root@kali:~# sudo apt-cache search package                #搜索软件包
root@kali:~# sudo apt-cache show package                  #获取软件包信息
root@kali:~# sudo apt-cache depends package               #了解使用该包依赖哪些包
root@kali:~# sudo apt-cache redepends package             #查看该包被哪些包依赖

系统用户与组管理

配置文件解析

Linux系统是多用户的系统,为了保证用户的安全,默认将用户账号放入/etc/passwd文件中,把密码单独放置在了/etc/shadow文件中且权限是只允许root能够访问,而同样将用户组相关信息分别放置在了/etc/group/etc/gshadow 这两个配置文件中进行保存,下面给将具体介绍配置文件字段含义。

/etc/passwd: 存储用户名称以及默认的用户环境。

[root@localhost ~]# head -n 3 /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
| 第一列       | 用户名:就是账号,用来对应UID的:例如root的UID对应就是0 |
| 第二列       | 密码位:密码占位符,这个字段的密码数据在/etc/shadow中  |
| 第三列       | 用户UID:0=管理员,1-499=系统账户,500-65535=自定义账户|
| 第四列       | 用户GID:也就是用户的组ID号,这个GID与/etc/group有关  |
| 第五列       | 用户描述信息:这一列可有可无,只是用来解释账号的意义而已|
| 第六列       | 用户家目录:指定了用户的家目录保存位置,系统默认生成    |
| 第七列       | 登陆默认Shell:指明系统默认的登陆shell是什么          |

/etc/shadow: 主要存储用户的密码hash值,以及用户的过期时间等。

[root@localhost ~]# head -n 3 /etc/shadow
root:$6$TT4VWP5W$Libo7Yk8JzG15VQWKu:17699:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
| 第一列       | 用户名:这个文件的第一栏就是账号,必须要与/etc/passwd相同才行 |
| 第二列       | 密码位:这个字段内的数据才是真正的口令,而且是经过加密的口令   |
| 第三列       | 密码最近更改时间:这个字段记录了『更改系统口令那一天』的日期    |
| 第四列       | 密码最短有效期:账号的口令在最近一次被更改后需要经过几天后才能再次更改 |
| 第五列       | 密码最长有效期:指定在最近一次更改口令后,经过多久需要再次更改的时间 |
| 第六列       | 密码到期前的警告天数:当账号口令过期时,系统会发出『警告』给这个账号   |
| 第七列       | 密码过期后的宽限天数:口令有效日期为『升级日期(第3字段)』+『重新变更日期(第5字段)』 |
| 第八列       | 密码失效时间:账号在此字段规定的日期之后,将无法再使用,默认是9999999 |
| 第九列       | 系统保留:此配置没有被使用,属于系统保留字段                  |

/etc/group: 这个文件就是在记录GID与组名的对应了,他主要是实现组用户的记录工作/etc/group

[root@localhost ~]# head -n 3 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
| 第一列       |  组名称:就是组名,在新建用户的时候系统会为用户分配一个默认组. |
| 第二列       |  密码占位符:通常不需要配置,这个配置通常是给『组管理员』使用的. |
| 第三列       |  组ID号(GID):就是群组的 ID 号码.                          |
| 第四列       |  成员列表:显示本组内的成员列表                             |

/etc/gshadow: 本配置文件用于存储组的密码,等相关信息

[root@localhost ~]# head -n 3 /etc/gshadow
root:::
bin:::
daemon:::
| 第一列       |  用户组:就是组名,本配置文件必须与/etc/group文件相对应. |
| 第二列       |  组密码:这个段可以是空的或!,如果是空的或有!,表示没有密码|
| 第三列       |  组管理者:这个字段也可为空,如果有多个用户组管理者用,分割|
| 第四列       |  组内成员:如果有多个成员用,号分割                     |

除此之外,当我们执行useradd命令创建新用户的时候,系统也会默认参考2个配置文件,来配置默认值。

/etc/default/useradd: 用户的默认属性目录。

[root@localhost ~]# cat /etc/default/useradd
GROUP=100        #新用户组GID(私有组)
HOME=/home       #新用户默认家目录位置
INACTIVE=-1      #密码过期宽限天数 (0=立即过去,-1=永不过期,正数表示天数)
EXPIRE=          #密码失效时间(时间戳)
SHELL=/bin/bash  #系统默认使用的Shell环境
SKEL=/etc/skel   #模板目录,创建用户时自动拷贝里面的内容
GREATE_MAIL_SPOOL=yes #是否给新用户创建新邮箱

/etc/login.defs: 更加详细的参考目录。

[root@localhost ~]# cat /etc/login.defs
MAIL_DIR /var/spool/mail #默认用户邮箱目录
PASS_MAX_DAYS 99999      #这行指定的是密码的有效期
PASS_MIN_DAYS 0          #第一次修改密码后,几天后才能再次修改密码
PASS_MIN_LEN 5           #这行代表密码的最小长度
PASS_WARN_AGE 7          #密码修改到期前的警告天数
UID_MIN 500              #创建普通用户的时候默认的起始UID
UID_MAX 60000            #创建普通用户默认最大的UID
GID_MIN 500              #创建组的时候默认的起始GID
GID_MAX 60000            #创建组的时候默认的最大的GID
CREATE_HOME yes          #创建用户时是否创建用户家目录
UMASK 077                #建立的用户家目录的默认权限
USERGROUPS_ENAB yes      #删除用户时是否删除用户的初始组
ENCRYPT_METHOD SHA512    #用户密码使用SHA512散列模式加密

用户管理命令

新建用户: useradd命令可以新建系统用户

[root@localhost ~]# useradd --help
命令语法:[ user [选项] 用户名 ]
        -u UID          #创建用户时指定UID号
        -g 组名         #指定一个初始组
        -G 组名         #加入一个附加组
        -d 目录         #手动指定某目录为家目录
        -s 类型         #指定默认Shell,默认/bin/bash
        -M              #强制不创建家目录
        -D              #查询默认配置参数
        -m              #强制创建家目录
        -c              #指定说明信息,可随便写
        -r              #创建一个系统的账号
        -e              #指定账号失效日期,格式为『YYYY-MM-DD』
        -f              #指定口令是否会失效,0为立刻失效
        -1              #指定用户永远不失效

使用 useradd -M -r -s /sbin/nologin 参数创建一个系统用户,用于供相关服务使用。

[root@localhost ~]# useradd -M -r -s /sbin/nologin lyshark
[root@localhost ~]# cat /etc/passwd |grep lyshark
lyshark:x:997:995::/home/lyshark:/sbin/nologin

使用 useradd -G 参数创建用户并指定组.

[root@localhost ~]# groupadd admin
[root@localhost ~]# useradd -G admin wang
[root@localhost ~]# cat /etc/group |grep wang
admin:x:1000:wang

设置密码: 创建好用户接下来就是设置密码,passwd命令用于设置用户密码。

[root@localhost ~]# passwd --help
命令语法:[ passwd [选项] 用户名 ]
        -u UID          #创建用户时指定UID号
        --stdin         #非交互给予密码
        -l 用户名        #锁定用户,使之无法登陆,会将 /etc/shadow 第二栏最前面加上 ! 使口令失效.
        -u 用户名        #解锁用户,是 Unlock 的意思
        -S 用户名        #查看用户账号状态(是否被锁定).
        -n              #后面接天数,多久不可修改口令天数
        -x              #后面接天数,多久内必须要更动口令
        -w              #后面接天数,口令过期前的警告天数
        -i              #后面接『日期』,口令失效日期

使用 echo |passwd --stdin 参数非交互设置密码.

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

使用 passwd参数修改lyshark用户的密码.

[root@localhost ~]# passwd lyshark
Changing password for user lyshark.
New password: 123123
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 123123
passwd: all authentication tokens updated successfully.

管理用户: usermod命令用于管理用户

[root@localhost ~]# usermod --help
命令语法:[ usermod [选项] 用户名 ]
        -u UID          #创建用户时指定UID号
        -c              #后面加账号说明
        -d 目录         #结合 -m 直接对家目录进行改名
        -e              #后面接日期,格式是 YYYY-MM-DD
        -f              #后面接天数
        -g 组名         #修改指定初始组
        -G              #修改指定附加组
        -a              #与 -G 合用,添加次要组
        -l 新名 旧名    #修改用户名
        -s shell        #修改默认Shell
        -u UID          #修改用户的指定UID
        -L              #冻结指定用户,让其无法登陆
        -U              #解除冻结

如果你仔细的比对,会发现 usermod 的选项与 useradd 非常类似,这是因为 usermod 也是用来微调 useradd 添加的使用者参数嘛,不过 usermod 还是有新增的选项,那就是 -L 与 -U,不过这两个选项其实与 passwd 的 -l,-u 是相同的.

使用 usermod -m -d /home/hello wang 参数将原wang家目录修改成hello

[root@localhost home]# ls
wang
[root@localhost home]# usermod -m -d /home/hello wang
[root@localhost home]# ls
hello

使用 usermod -s /bin/bash 参数修改lyshark账户的默认shell

[root@localhost ~]# usermod -s /bin/bash lyshark

使用userdel -fr 强制删除指定的用户与密码。

[root@localhost ~]# userdel -fr lyshark

chage查询参数: chage命令是用来修改帐号和密码的有效期限,其参数我们会在下面进行说明.

[root@localhost ~]# chage --help
命令语法:[ chage [选项] 用户名 ]
        -m              #密码可更改的最小天数
        -M              #密码保持有效的最大天数
        -w              #用户密码到期前警告天数
        -E              #帐号到期时间
        -d              #上一次更改的日期
        -l              #列出该账号的详细口令参数
        chage -d 0      #强制用户下次登陆修改密码

使用 chage -d 0 lyshark 强制用户下次登陆修改密码.

[root@localhost ~]# chage -d 0 lyshark
[root@localhost ~]# chage -l lyshark
Last password change                    : password must be changed
Password expires                    : password must be changed
Password inactive                   : password must be changed
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7

添加/修改/删除 属组: 这三条命令一般都不太能用,通常直接使用gpasswd代替了。

[root@localhost ~]# groupadd --help
命令语法:[ groupadd [选项] 组名 ]
        -g              #指定组GID
        -r              #创建系统群组
------------------------------------------------
[root@localhost ~]# groupmod --help
命令语法:[ groupmod [选项] 组名 ]
        -g              #修改原有的GID数字
        -n              #修改原有的组名
------------------------------------------------
[root@localhost ~]# groupdel --help
命令语法:[ groupdel [选项] 组名 ]

添加成员: gpasswd是Linux下工作组文件/etc/group和/etc/gshadow管理工具,其参数我们会在下面进行说明.

[root@localhost ~]# gpasswd --help
命令语法:[ gpasswd [选项] 组名 ]
        -a              #添加用户到组
        -d              #从组删除用户
        -A              #指定管理员
        -M              #指定组成员
        -r              #删除密码
        -R              #限制用户登入组

使用 gpasswd -a 添加lyshark用户到root组.

[root@localhost ~]# gpasswd -a lyshark root
Adding user lyshark to group root

使用 gpasswd -d 从lyshark组中删除root.

[root@localhost ~]# gpasswd -d lyshark root
Removing user lyshark from group root

使用 gpasswd -M 批量将用户 a1,a2,a3,a4 添加到test组.

[root@localhost ~]# useradd a1
[root@localhost ~]# useradd a2
[root@localhost ~]# useradd a3
[root@localhost ~]# useradd a4
[root@localhost ~]# groupadd test
[root@localhost ~]# gpasswd -M a1,a2,a3,a4 test
root@localhost ~]# cat /etc/group |grep test
test:x:1008:a1,a2,a3,a4

用户查询命令

切换身份命令: su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码.

[root@localhost ~]# su --help
命令语法:[ su - [选项] 用户名 ]
        -c 指令          #执行完指定的指令后,即恢复原来的身份
        -f               #使shell不用去读取启动文件
        -l               #改变身份时连同环境变量一起切换
        -m               #改变身份不同步环境变量
        -s shell         #指定要执行的shell

查询用户信息: id命令可以显示真实有效的用户,id命令已经默认预装在大多数Linux系统中

[root@localhost ~]# id --help
命令语法:[ id [选项] 用户名 ]
        -g              #显示用户所属群组的ID
        -G              #显示用户所属附加群组的ID
        -n              #显示用户,所属群组或附加群组的名称.
        -r              #显示实际ID
        -u              #显示用户ID

显示登陆用户列表: w命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。

[root@localhost ~]# w --help
命令语法:[ w [选项] 用户名 ]
        -h              #不打印头信息
        -u              #当显示当前进程和cpu时间时忽略用户名
        -s              #使用短输出格式
        -f              #显示用户从哪登录

显示登录系统信息: who命令是显示目前登录系统的用户信息,执行who命令可得知目前有那些用户登入系统

[root@localhost ~]# who --help
命令语法:[ who [选项] ]
        -H              #显示各栏位的标题信息列
        -u              #显示用户闲置时间(1分钟内无操作显示. 24小时不操作显示old)
        -m              #与 who am i 参数效果相同
        -q              #只显示登入系统的帐号名称和总人数
        -s              #只负责解决兼容性问题
        -w              #显示用户的信息状态栏

显示用户最近登录信息: last命令用于显示用户最近登录信息,单独执行last命令,它会读取/var/log/wtmp中的内容。

[root@localhost ~]# last --help
命令语法:[ last [选项] [文件目录] ]
        -H              #显示各栏位的标题信息列
        -a              #把从何处登入系统的主机名称或IP,显示在最后一行
        -d              #将IP地址转换成主机名称
        -f 记录文件      #指定记录文件
        -n 显示条数      #设置列出名单的显示列数
        -R              #不显示登入系统的主机名称或IP地址
        -x              #显示系统关机,重新开机,以及执行等级的改变等信息

显示最后登陆信息: lastlog命令用于显示系统中所有用户最近一次登录信息.

[root@localhost ~]# lastlog --help
命令语法:[ lastlog [选项] [文件目录] ]
        -b 天数         #显示指定天数前的登录信息
        -t 天数         #显示指定天数以来的登录信息
        -u 用户名       #显示指定用户的最近登录信息

在线发送提示: write命令用于向指定登录用户终端上发送信息,通过write命令可传递信息给另一位登入系统的用户

[root@localhost ~]# echo "hello lyshark" | write lyshark
[root@localhost ~]# wall hello linux admin
while true
do
cat /var/log/messages |base64 |write lyshark
done

发送邮件: mail命令是命令行的电子邮件发送和接收工具

[root@localhost ~]# yum install -y mailx
[root@localhost ~]# mail --help
命令语法:[ mail [选项] [用户] ]
        -b 地址         #指定密件副本的收信人地址
        -c 地址         #指定副本的收信人地址
        -f 邮件文件     #读取指定邮件文件中的邮件
        -i             #不显示终端发出的信息
        -I             #使用互动模式
        -s 邮件主题     #指定邮件的主题
        -u 用户帐号     #读取指定用户的邮件
        h              #列出信件表头
        d              #删除邮件
        s              #将邮件保存成文件
        q              #退出

使用 mail 使用管道进行邮件发送.

[root@localhost ~]# echo "hello,this is the content of mail." |mail -s "by root" lyshark
You have new mail in /var/spool/mail/root

使用 mail 使用文件进行邮件发送.

[root@localhost ~]# mail -s "by root" admin@mkdirs.com < mail.txt
You have new mail in /var/spool/mail/root

系统文件权限管理

普通权限管理

简单权限位介绍: 使用ls -l命令查询文件如下,下面我们就分别介绍一下下面内容的含义吧.

[root@localhost ~]# ls -lh
d   rwxr-xr-x.  2   root   root       6   Nov 17 05:22   lyshark_dir
-   rw-r--r--.  1   root   root       0   Nov 17 05:22   lyshark_file
l   rwxrwxrwx.  1   root   root      12   Nov 17 05:22   lyshark_link -> lyshark_file
b   rw-rw----.  1   root   disk       8   Nov 17 05:21   /dev/sda
c   rw-rw-rw-.  1   root   root       1   Nov 17 05:21   /dev/zero
第一项:代表这个文件的类型与权限(permission)
当为[ d ]则是目录,例如上为『lyshark_dir』的那一行
当为[ - ]则是文件,例如上表名为『lyshark_file』那一行
若是[ l ]则是链接,例如上为『lyshark_link』的那一行
若是[ b ]则是设备,表示可供储存的接口设备(可随机存取装置)
若是[ c ]则表串口,的串行端口设备,例如键盘、鼠标,显示器
第二项:以三个为一组,且均为『rwx』的三个参数的组合
当为[ r ]则是读取权限,此权限还可以用数字4代表.
当为[ w ]则是写入权限,此权限还可以用数字2代表.
若是[ x ]则是执行权限,此权限还可以用数字1代表.
第三项:代表文件的链接数,引用计数(文件:硬链接数 目录:目录下的子目录个数).
第四项:代表文件的文件的所有者(属主)
第五项:代表文件的文件的所属组(属组)
第六项:代表文件大小(默认单位字节byte)
第七项:代表文件最后一次修改时间
第八项:代表文件的文件名

更改文件目录权限: chmod命令用来变更文件或目录的权限,用户可以使用chmod指令去变更文件与目录的权限。

[root@localhost ~]# chmod --help
命令语法:[ chmod [选项] [ugo][+-][rwx] 文件或目录 ]
        U               #属主,可用4代表
        G               #属组,可用2代表
        O               #其他人,可用1代表
        -c              #显示权限修改过程,但仅显示改变的
        -v              #显示权限修改过程,显示所有过程
        -f              #不显示错误信息
        -R              #递归设置权限

使用chmod -Rv给指定目录设置一个777的权限.

[root@localhost ~]# chmod -Rv 777 lyshark_dir/
mode of ‘lyshark_dir/’ changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)
[root@localhost ~]# ls -lh lyshark_dir
total 0
drwxrwxrwx. 2 root root  6 Nov 17 05:22 lyshark_dir

使用chmod -R给指定文件的其他人设置rwx权限.

[root@localhost ~]# chmod o+rwx lyshark_file
[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file

更改文件属主与属组: chown命令改变某个文件或目录的所有者和所属的组。

[root@localhost ~]# chown  --help
命令语法:[ chown [选项] [属主].[属组] 文件或目录 ]
        -c              #显示权限修改过程,但仅显示改变的
        -v              #显示权限修改过程,显示所有过程
        -f              #不显示错误信息
        -R              #递归设置属性
        -h              #只对符号连接的文件作修改

使用chown -Rv给指定文件设置lyshark为属主.

[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file
[root@localhost ~]# chown -Rv lyshark lyshark_file
changed ownership of ‘lyshark_file’ from root to lyshark
[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file

使用chown -Rv给指定文件设置lyshark为属组.

[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file
[root@localhost ~]# chown -Rv .lyshark lyshark_file
changed ownership of ‘lyshark_file’ from lyshark:root to :lyshark
[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark lyshark 0 Nov 17 05:22 lyshark_file

设置文件默认掩码: umask命令用来设置限制新建文件权限的掩码,当新文件被创建时,其最初的权限由文件创建掩码决定。

[root@localhost ~]# umask --hlep
命令语法:[ umask [选项] [u=rwx] [g=rwx] [o=rwx] ]
        -p              #输出的权限掩码可直接作为指令来执行
        -S              #以符号方式输出权限掩码

使用umask设置系统的默认Umask值,当前掩码为u=rwx,g=rwx,o=rwx 此处我们改成u=rwx,g=rw,o=r查看变化。

[root@localhost ~]# umask -S
u=rwx,g=rwx,o=rwx
[root@localhost ~]# umask u=rwx,g=rw,o=r
[root@localhost ~]# umask -S
u=rwx,g=rw,o=r

另一种数字方式改法,查询系统默认掩码为0022我们直接减去0777得到755,则说明创建文件默认权限755

[root@localhost ~]# umask
0022
[root@localhost ~]# mkdir lyshark
[root@localhost ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Nov 15 03:05 lyshark

设置文件目录隐藏属性: chattr命令用来改变文件属性,隐藏属性的设置可以极大提高系统安全性。

[root@localhost ~]# chattr --help
命令语法:[ chattr [+-=] [状态] [选项] 文件或目录 ]
        p              #输出的权限掩码可直接作为指令来执行
        A              #锁定(atime)访问时间
        S              #异步写入磁盘(sync)
        a              #设置只能添加数据,不能删除和修改
        c              #自动将此文件压缩,需要时自动解压缩
        d              #在dump备份时,不会备份此文件
        i              #将文件设置为只读
        s              #文件被删除将永久移除
        u              #文件删除不永久移除
        -R             #递归处理,连同子目录一起生效
        -V             #显示指令执行过程

例如我们可以将/lyshark目录设置为只能增加不能删除,设置成功后就算是root也无权删除文件。

[root@localhost /]# chattr +a /lyshark/
[root@localhost /]# cd /lyshark/
[root@localhost lyshark]# mkdir hello
[root@localhost lyshark]# rm -fr hello/
rm: cannot remove hello/: Operation not permitted

查询文件目录隐藏属性: 利用lsattr来查阅隐藏的属性

[root@localhost ~]# lsattr --help
命令语法:[ lsattr [选项] 文件或目录 ]
        -R             #递归显示权限
        -V             #显示指令的版本信息
        -a             #列出目录中的所有文件,包括隐藏文件.
[root@localhost ~]# lsattr -a /lyshark/
-----a---------- /lyshark/.
---------------- /lyshark/..
---------------- /lyshark/wang

文件特殊权限

SUID文件权限: 当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时,将以文件所有者的身份执行.

打个比方,普通用户根本没有修改/etc/passwd和/etc/shadow的权利,但是它还是可以通过passwd命令修改自己的密码,这就与SUID这个权限有关

SetUID 针对文件的作用:
1.只有可以执行的二进制程序才能设定SUID权限
2.命令执行者要对该程序拥有x(执行)权限
3.命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
4.SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

那么如何设置SGID权限呢? 很简单,看下面的小例子.

[root@localhost ~]# ls -l
total 16
-rwxr-xr-x 1 root root 8464 Jun 21 18:05 lyshark     #这是一个可执行文件,SUID只能设置在可执行文件上,且执行者要对此文件拥有x权限
[root@localhost ~]# chmod u+s ./lyshark              #设置方法也很简单只需要u+s即可
[root@localhost ~]# chmod 4755 lyshark               #或者
[root@localhost ~]# ls -l
total 16
-rwsr-xr-x 1 root root 8464 Jun 21 18:05 lyshark    #看吧在权限上多出一个 s

SGID文件权限: 如果可执行文件需要读取一个数据文件,恰巧他们在同一个组里,而可执行文件拥有SGID属性,则他们就可以直接访问,当普通用户在具有SGID的目录里创建文件时,文件的属组都会变成父目录的属组,其作用是方便组内其他成员的操作.

SetGID 针对文件的作用:
1.只有可执行的二进制程序才能设置SGID权限
2.命令执行者要对该程序拥有x(执行)权限
3.命令执行在执行程序的时候,组身份升级为该程序文件的属组
4.SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

SetGID 针对目录的作用:
1.普通用户必须对此目录拥有r和x权限,才能进入此目录
2.普通用户在此目录中的有效组会变成此目录的属组
3.普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

那么如何设置SGID权限呢? 很简单,看下面的小例子.

[root@localhost ~]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Jun 21 18:19 lyshark
[root@localhost ~]# chmod g+s lyshark/        #设置SGID属性
[root@localhost ~]# chmod 2644 lyshark/       #这样也可以
[root@localhost ~]# ls -l
total 4
drwxrwsrwx 2 root root 4096 Jun 21 18:19 lyshark  #看吧在权限上多出一个 s

SBIT黏着权限: 黏着位只能对目录有效,在设置了黏着位的目录下,只能删除自己创建的文件,其他人创建的文件只能浏览.

SetBID 针对目录的作用:
1.粘着位目前只对目录有效
2.普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
3.赋予了粘着位后,普通用户就算拥有w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件

那么如何设置SBIT权限呢? 很简单,看下面的小例子.

[root@localhost ~]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Jun 21 18:25 lyshark
[root@localhost ~]# chmod 1644 lyshark/
[root@localhost ~]# ls -l
total 4
drw-r--r-T 2 root root 4096 Jun 21 18:25 lyshark     #看吧在权限上多出一个 s

ACL 访问控制

ACL 主要的目的是在提供传统的权限控制基础之上提供了更加细致的权限配置,ACL可以针对单一使用者单一文件或目录来进行读写执行等权限的规范,对于需要特殊权限的使用状况非常有帮助.

启动ACL支持: 由于ACL是Linux操作系统权限的额外支持项目,因此要使用ACL必须要手动开启,默认Centos系统是开启的.

[root@localhost ~]# dumpe2fs -h /dev/vdb
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /ghost
Filesystem UUID:          7b34e434-7e98-4480-9699-afef29afed2f
Filesystem magic number:  0xEF53
Filesystem revision
Filesystem features:      has_journal ext_attr resize_inode dir_index...
Filesystem flags:         signed_directory_hash 
--------------------------------------------------------------------
Default mount options:    user_xattr acl     #看到这句话说明开启了
--------------------------------------------------------------------
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              1310720

如果你的系统默认不会帮你开启ACL权限的支持,那你可以这样做,来手动开启ACL

[root@localhost ~]# mount -o remove,acl /dev/vdb
[root@localhost ~]# ll /dev/disk/by-uuid/
lrwxrwxrwx 1 root root  9 Jun 17 15:40 7b34e434-7e98-4480-9699-afef29afed2f -> ../../vdb
[root@localhost ~]# vim /etc/fstab
UUID=7b34e434-7e98-4480-9699-afef29afed2f /ghost  ext4 defaults,acl 1 1  #写入此行开机自启动

查看ACL权限: getfacl命令主要用来查询指定目录的权限,下面我们来看一下它的参数说明

[root@localhost ~]# getfacl --help
命令语法:[ getfacl [选项] 文件或目录 ]
        -p              #输出的权限掩码可直接作为指令来执行
        -a              #显示访问控制列表
        -d              #只显示默认访问控制列表
        -c              #忽略标题,只显示权限
        -R              #递归显示子目录
        -t              #以表格形式输出
        -n              #打印属主属组UID/GID

接下来我们将查看/lyshark目录所具备的权限,输出结果,具体解释输出说明.

[root@localhost /]# getfacl lyshark
# file: lyshark         #说明文件名称
# owner: root           #说明文件的所有者
# group: root           #说明文件的所属组
user::rw-               #用户列表是空的,代表所有者的权限
group::r--              #针对用户组的权限设置
other::r--              #针对其他人的权限设置
mask::r-x               #此文件默认有效权限(mask)

设置ACL权限: setfacl命令是用来在命令行里设置ACL权限,用来设置指定目录的权限,下面我们来看一下它的参数说明

[root@localhost ~]# setfacl --help
命令语法:[ setfacl [选项][ugo]:[用户][rwx] 文件或目录 ]
        -m              #添加ACL权限,不可与-x合用
        -x              #删除某用户的ACL权限,不可与-m合用
        -b              #清空所有ACL权限
        -R              #递归配置ACL,实现目录上ACL权限的递归
        -d              #设置默认ACL权限(传承)
        -k              #删除默认ACL权限参数

添加ACL权限:添加lyshark用户对root目录的rwx权限

[root@localhost ~]# setfacl -m u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx    #此处可以看到,用户这里多出来了lyshark用户,此时lyshark用户可以任意操作/root目录下的文件
group::r-x
mask::rwx
other::---

删除ACL权限:删除lyshark用户对root目录的rwx权限

[root@localhost ~]# setfacl -x u:lyshark /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x           #此处可以看到,用户lyshark的权限已被撤销了,此时再次访问/root目录会出现权限拒绝
group::r-x
mask::r-x
other::---

清空所有ACL权限:清空指定目录或文件的所有ACL配置

[root@localhost ~]# setfacl -b /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
other::---

递归设置ACL权限:实现对目录上的ACL权限的递归设置(目录)

[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---
#注释:如果不递归设置,那么普通用户无法在子目录下进行读写执行

对空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,且在/root目录下新建的文件lyshark用户都有rwx权限

[root@localhost ~]# setfacl -d -m u:lyshark:rwx /root/
[root@localhost ~]# setfacl -m d:u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---
default:user::r-x
default:user:lyshark:rwx   #这边可以看到lyshark的默认权限是rwx,root用户不管创建什么文件lyshark用户都有rwx权限
default:group::r-x
default:mask::rwx
default:other::---

对非空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,且在/root目录下新建的文件lyshark用户都有rwx权限

[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/   #递归设置ACL权限
[root@localhost ~]# setfacl -d -m u:lyshark:rwx /root/   #设置默认ACL权限
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---

设置最大有效权限mask(目录):为/root目录设置添加最大默认权限为rx,其他ACL权限不得超出此权限

[root@localhost ~]# setfacl -m m:rx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx        #effective:r-x    #虽然lyshark对root目录有rwx权限,但是我们设置了最大有效权限,所以lyshark用户只能读和执行
group::r-x
mask::r-x                                 #最大有效权限r-x
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---

Sudo用户授权

sudo是linux系统管理命令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,这样不仅减少了root用户的登录,和管理时间,同样也提高了安全性,sudo不是对shell的一个代替,它是面向每个命令的.

Sudo工作步骤
a.通过visudo命令或者vim /etc/sudoers来修改配置文件并对某用户进行授权
b.当普通用户执行/sbin或/usr/sbin下的命令时,系统会查询/etc/sudoers文件中是否有root对其的授权
c.当查询普通用户已拥有授权后,需要输入普通用户的密码来确认用户身份输入成功后,则执行对应已授权的命令

先来看一下sudo命令的常用参数:

[root@localhost ~]# sudo --help
命令语法:[ sudo [选项] 授权用户 ]
        -b              #在后台执行指令
        -H              #将HOME环境变量设为新身份的HOME环境变量
        -k              #结束密码的有效期限,也就是下次再执行sudo时便需要输入密码
        -l              #列出目前用户可执行与无法执行的指令
        -p              #改变询问密码的提示符号
        -s shell        #执行指定的shell
        -u 用户         #以指定的用户作为新的身份,若不加上此参数,则预设以root作为新的身份
        -v              #延长密码有效期限5分钟

给lyshark用户授予root的所有命令,此授权一般不会用比较危险,使用此授权起不到sudo的作用

vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL     
lyshark ALL=(ALL)       ALL   #写入参数
## Allows members of the 'sys' group to run networking, software,

授权lyshark用户只能够执行 /sbin/shutdown -r now 重启服务器

vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /sbin/shutdown -r now   #写入参数
## Allows members of the 'sys' group to run networking, software,

授权lyshark用户仅可以管理192.168.1.10的服务器,并让其可以使用Apache管理脚本

vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark 192.168.1.10=(ALL)  /etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest   #写入参数
## Allows members of the 'sys' group to run networking, software,

授权给lyshark用户,可以通过使用VIM编辑器,修改Apache配置文件

vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /bin/vim,/etc/httpd/conf/httpd.conf   #写入以下参数
## Allows members of the 'sys' group to run networking, software,

授权lyshark用户可以添加普通用户并能修改普通用户的密码,不能修改root的密码

vim /etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /usr/sbin/useradd                                              #让lyshark用户可以创建普通用户
lyshark ALL=(ALL)       /usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd ""      #让lyshark用户可以给新用户改密码,但不允许修改root用户的密码
## Allows members of the 'sys' group to run networking, software,

Selinux权限管理

SELinux 是由美国国家安全局(NSA)开发的,SELinux采用以策略规则指定特定程序读取特定文件,也就是强制访问控制(MAC),即使你是root那么在使用不同的程序时,你所能取得的权限并不一定是root,而得要看当时该程序的配置而定,如此一来,我们针对控制的『主体』变成了『程序』而不是使用者,从而极大地提升了系统的安全性。

Selinux权限介绍: 在使用命令之前,我们来看一下Selinux的几个字段,并且分别解释一下它们的含义.

[root@localhost ~]# ls -lZ
drwxr-xr-x. root root root:object_r:admin_home_t:s0 lyshark_dir
-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 passwd
                        ↑           ↑         ↑
                        Identify    Role      Type(最重要)
-----------------------------------------------
身份识别 (Identify)
root:代表的是ROOT的帐号身份
system_u:系统程序方面的标识,通常是进程
user_u:代表一般用户账号相关身份
-----------------------------------------------
角色段 (Role)
object_r:代表的是文件或目录等文件资源
system_r:代表的就是进程,不过一般用户也会被指明system_r
-----------------------------------------------
类型 (Type)
type:在文件资源(Object)上面称为类型(Type)
domain:在主体程序(Subject)则称为域(domain)

seinfo查询策略: 在进行上下文修改的时候我们需要先查询策略的类型,之后才能修改,查询可以使用seinfo命令。

[root@localhost ~]# yum install -y setools-libs setools-console
[root@localhost ~]# sestatus --help
[root@localhost ~]# seinfo --help
命令语法:[ seinfo [选项] ]
        -A              #列出所有,规则布尔值,角色,类型等.
        -t              #列出所有类型(type)
        -r              #列出所有角色(role)
        -u              #列出所有身份标识(user)
        -b              #列出所有规则种类(布尔值)

chcon设置上下文: chcon命令是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别

[root@localhost ~]# chcon --help
命令语法:[ chcon [选项] [上下文] 文件或目录 ]
        -R              #递归设置目录的权限
        -t              #设置安全上下文,例如(httpd_sys_content_t)
        -u              #后面接身份标识,例如(system_u)
        -r              #后面接角色,例如(system_r)

例如我们查询一下关于Samba共享文件的安全上下文,可以先执行seinfo -t |grep samba如下

[root@localhost ~]# seinfo -t |grep samba
   samba_secrets_t
   samba_spool_t
   samba_unconfined_script_exec_t
   samba_net_t
   samba_var_t
   samba_net_exec_t
   samba_net_tmp_t
   samba_unconfined_net_t
   samba_unconfined_script_t
   samba_unit_file_t
   sambagui_exec_t
   samba_share_t
   samba_initrc_exec_t
   sambagui_t
   samba_etc_t
   samba_log_t

这里我找到了samba_share_t 这条安全上下文,直接给lyshark_dir目录应用这条规则.

[root@localhost ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark_dir
[root@localhost ~]# chcon -R -t samba_share_t lyshark_dir/
[root@localhost ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 lyshark_dir

有时候我们不想一个个找,我们可以直接依照/var/www为模板,修改lyshark_dir的上下文.

[root@localhost ~]# ls -lhZ /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
[root@localhost ~]# chcon -R --reference=/var/www/ lyshark_dir/
[root@localhost ~]# ls -lhZ 
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 lyshark_dir/

当我们有一天配置出现了错误,此时我们可以使用restorecon -Rlyshark_dir目录恢复到默认状态.

[root@localhost ~]# ls -lhZ 
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 lyshark_dir
[root@localhost ~]# restorecon -R lyshark_dir/
[root@localhost ~]# ls -lhZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark_dir

Semanage放行端口: 放行指定的端口,可以使用semanage进行操作.

[root@localhost ~]# yum install -y policycoreutils-python
[root@localhost ~]# semanage port -l | grep 5000                  #查看5000端口
[root@localhost ~]# semanage port -l | grep http_port_t           #查看selinux针对http的策略开放的端口
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 5000   #放行5000端口,端口占用用-m参数即可
[root@localhost ~]# semanage port -d -t http_port_t -p tcp 5000   #关闭5000端口

布尔值查询与修改: 通过setsebool -P [0|1]开启httpd_use_nfs状态.

[root@localhost ~]# getsebool -a |grep httpd_use_nfs
httpd_use_nfs --> off
[root@localhost ~]# setsebool -P httpd_use_nfs=1
[root@localhost ~]# getsebool -a |grep httpd_use_nfs
httpd_use_nfs --> on

最后需要注意,有些系统管理员会将SeLinux设置为关闭状态,这样做是非常不推荐的,在SeLinux开启状态,就算网站被上传了一句话,该后门也无法被执行,如果关闭的话很明显会被日站,所以为了防止背黑锅,还是配置好SeLinux规则吧.

系统计划任务管理

at计划任务

at命令用于在指定时间执行命令,我们使用at这个命令来添加所要运行的工作,并将这个工作以文本格式方式写入/var/spool/at/目录内,该工作便能等待atd这个服务的取用与运行了,当然并不是任何人都可以执行定时任务的.

我们可以利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制
1.先找寻/etc/at.allow文件,写在这个文件中的使用者才能使用at没有在这个文件中的使用者则不能使用.
2.如果/etc/at.allow不存在,就寻找/etc/at.deny 若写在at.deny的使用者则不能使用at.
3.如果两个文件都不存在,那么只有 root 可以使用 at 这个命令.
4.系统默认会保留一个空的/etc/at.deny文件允许所有人使用at.

在介绍命令之前首先要先安装一下,并设置为开机自启动,接着看下配置命令:

[root@localhost ~]# yum install -y at
[root@localhost ~]# systemctl restart atd
[root@localhost ~]# systemctl enable atd
[root@localhost ~]# at --help
语法格式:[ at [选项] ]
        -m              #执行结束发送通知邮件(执行此命令的用户)
        atq             #查看计划任务
        atrm            #删除计划任务
        -c 工作号        #查看对应工作号的详细信息

当我们使用 at 时会进入一个 at shell 的环境来让用户执行工作命令,此时建议你最好使用绝对路径来执行你的命令,当我们执行了at命令的时候,就可以立即脱机啦,系统会帮我们执行.

定时1:在两天后的下午 5 点钟,执行/bin/ls命令

[root@localhost ~]# at 5pm+2 days
at> /bin/ls
at> CTRL +D
job 6 at Mon Oct  1 17:00:00 2018

定时2:在明天17点30分,输出时间到指定文件内

[root@localhost ~]# at 17:30 tomorrow
at> date >/root/22018.log
at> CTRL +D
job 7 at Sun Sep 30 17:30:00 2018

atq查询任务:通过使用 atq 命令查看系统中的计划任务

[root@localhost ~]# atq
4       Mon Oct  1 17:00:00 2018 a root
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

删除at任务:删除一个已设置的计划任务

[root@localhost ~]# atq
4       Mon Oct  1 17:00:00 2018 a root
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root
[root@localhost ~]# atrm 4
[root@localhost ~]# atq
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

显示指定at任务: 显示指定设置计划的任务内容

[root@localhost ~]# atq
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root
[root@localhost ~]# at -c 7
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=1; export XDG_SESSION_ID
....

其他小例子: 也可以对任务进行精确的控制.

Minute    at now + 5 minutes   任务在5分钟后运行
Hour      at now + 1 hour      任务在1小时后运行
Days      at now + 3 days      任务在3天后运行
Weeks     at now + 2 weeks     任务在两周后运行
Fixed     at midnight          任务在午夜运行
Fixed     at 10:30pm           任务在晚上10点30分
Fixed     at 23:59 12/31/2018 任务在2018年12月31号23点59分  

jobs工作管理

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务.该命令可以显示任务号及其对应的进程号.其中任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的,一个任务可以对应于一个或者多个进程号,jobs是在单一终端下同时执行多个任务.

[root@localhost ~]# jobs --help
语法格式:[ jobs [选项] ]
        -l          #显示工作进程PID
        -r          #列出后台正在运行的工作
        -s          #列出后台暂停的工作
        &           #将工作放入后台,nohup &
        ctrl+z      #将工作暂停并放入后台

命令放入后台:通过&符号将vim编辑器放入后台

[root@localhost ~]# vim lyshark.sh &
[1] 1294
[root@localhost ~]#
[1]+  Stopped                 vim lyshark.sh
[root@localhost ~]# jobs -l
[1]+  1294 Stopped (tty output)    vim lyshark.sh

杀死后台任务:终止序号是[1]的那个后台任务

[root@localhost ~]# jobs -l
[1]+  1294 Stopped (tty output)    vim lyshark.sh
[root@localhost ~]# kill -9 %1
[1]+  Stopped                 vim lyshark.sh
[1]+  Killed                  vim lyshark.sh
[root@localhost ~]# jobs -l

恢复暂停工作:使用fg命令,将后台暂停的工作恢复到前台,继续执行

[root@localhost ~]# jobs -l
[1]   1296 Stopped (tty output)    vim lyshark.sh
[2]-  1297 Stopped (tty output)    vim lyshark.sh
[3]+  1298 Stopped (tty output)    vim lyshark.sh
[root@localhost ~]# fg %1
vim lyshark.sh

激活后台工作:使用bg让后台工作脱离终端运行,就是激活工作

[root@localhost ~]# jobs -l
[2]-  1297 Stopped (tty output)    vim lyshark.sh
[3]+  1298 Stopped (tty output)    vim lyshark.sh
[root@localhost ~]# bg %2
[2]- vim lyshark.sh &
[2]+  Stopped                 vim lyshark.sh

crond循环任务

crontab命令被用来提交和管理用户的需要周期性执行的任务,该服务默认安装在系统中,crond进程每分钟会定期检查是否有要执行的任务,如果有则自动执行该任务,相对于at是仅运行一次的工作,循环运行的例行性工作的调度则是由crond这个系统服务来控制的,这个系统服务是默认启动的.

用户如果想添加计划任务的话,可以使用crontab命令设置,下面我们先来看两个配置文件.

/etc/cron.allow
此配置文件记录可以使用crontab任务的用户,若不在这个文件内的用户则不可以使用crontab
/etc/cron.deny
此配置文件记录了不可以使用crontab设定计划任务的用户列表

优先顺序/etc/cron.allow/etc/cron.deny要优先,这两个文件只选择一个来限制即可,一般来说,系统默认是保留/etc/cron.deny这个配置文件,使用crontab命令来新建工作调度时,该项任务就会被纪录到/var/spool/cron/里面去,crond运行的后都会被纪录到/var/log/cron日志里.

Linux 任务调度分为两类:系统任务调度和用户任务调度
1.系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘,日志清理等,如果想让所有用户都执行这些任务,可以将此任务写入/etc/crontab这个文件里,这样一来无论使用那个用户登录,都会执行这些任务.
2.用户定期要执行的工作,比如用户数据备份、定时邮件提醒等,用户可以使用crontab来指定自己的任务,所有用户定义的crontab文件都被保存在/var/spool/cron目录中.

crontab格式的含义: 用户所建立的crontab文件中,每一行都代表一项任务,格式与解释如下.

--------------------------------------------------------------------------------------
[分钟]     [小时]   [天]      [月]     [周]    [执行命令]
--------------------------------------------------------------------------------------
minute     hour     day      month     week   command         顺序:分 时 日 月 周
--------------------------------------------------------------------------------------
0-59       0-23     1-31      1-12     0-7    command         范围:数字范围
--------------------------------------------------------------------------------------
    minute            表示分钟,(1-59)
    hour              表示小时,(1-23)
    day               表示日期,(1-31)
    month             表示月份,(1-12)
    week              表示星期几(0-7)
    command           要执行的命令
--------------------------------------------------------------------------------------
在以上的各个字段中,还可以使用以下特殊字符:
    星号  *           代表所有可能的值
    逗号  ,           可以用逗号隔开的值指定一个列表范围
    中杠  -           可以用整数之间的中杠表示一个整数范围
    正斜线 /          可以用正斜线指定时间的间隔频率
--------------------------------------------------------------------------------------

下面是crontab命令的语法,以及常用参数,紧接着我来举几个小例子吧.

[root@localhost ~]# crontab --help
语法格式:[ crontab [选项] ]
        -e          #编辑计划任务
        -l          #查看已存在的计划任务
        -r          #删除计划任务
        -u<用户名>   #指定用户

周一到周五每天17:00,执行任务

0 17 * * 1-5 echo "1" > /proc/sys/vm/drop_caches

每周一、三、五的8点30分,执行任务

30 8 * * 1,3,5 echo "1" > /proc/sys/vm/drop_caches

8点到18点之间每隔2小时执行一次

0 8-18/2 * * * echo "1" > /proc/sys/vm/drop_caches

每隔3天执行一次计划任务

0 * */3 * * echo "1" > /proc/sys/vm/drop_caches

每分钟执行一次,计划任务

* * * * * echo "1" > /proc/sys/vm/drop_caches

每小时第3,和第15分钟执行一次

3,15 * * * * echo "1" > /proc/sys/vm/drop_caches

在上午8点到11点的,第3和第15分钟执行

3,15 8-11 * * * echo "1" > /proc/sys/vm/drop_caches

每隔两天的,上午8点到11点,的第3和第15分钟执行

3,15 8-11 */2 * * echo "1" > /proc/sys/vm/drop_caches

每个星期一的上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 echo "1" > /proc/sys/vm/drop_caches

每月1、10、22日的4 : 45重启smb

45 4 1,10,22 * * /etc/init.d/smb restart

系统进程资源管理

查看内存使用: free命令常用于查看系统内存的使用,命令如下:

[root@localhost ~]# free --help
语法格式:[ free [选项] ]
        -b              #以kb为单位显示
        -h              #以常用单位显示
        -t              #输出显示实体内存
#提示:我们可以使用 echo "1" > /proc/sys/vm/drop_caches 释放缓冲

查系统具体版本: uname 可以列出目前系统的内核版本、 主要硬件平台以及 CPU 类型等.

[root@localhost ~]# uname --help
语法格式:[ uname [选项] ]
        -a              #所有系统相关参数
        -s              #系统名称
        -r              #内核的版本
        -m              #本系统的硬件名称,例如 i686 或 x86_64 等
        -p              #CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
        -i              #硬件的平台 (ix86)

查系统负载: uptime命令能够打印系统总共运行了多长时间和系统的平均负载

[root@localhost ~]# uptime
 22:59:34 up 25 min,  1 user,  load average: 0.00, 0.01, 0.05

动态检测系统资源: vmstat命令动态的了解一下系统资源的运行

[root@localhost ~]# vmstat --help
语法格式:[ vmstat [选项] ]
        -a              #使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出
        -f              #启动到目前为止,系统复制 (fork) 的程序数
        -s              #将一些事件 (启动至目前为止) 导致的内存变化情况列表说明
        -S              #后面可以接单位,让显示的数据有单位,例如 K/M 取代 bytes 的容量
        -d              #列出磁盘的读写总量统计表
        -p              #后面列出分区,可显示分区的总量

查进程打开文件: lsof命令用于查看你进程开打的文件,打开文件的进程,是十分方便的系统监视工具

[root@localhost ~]# yum install -y lsof
[root@localhost ~]# lsof --help
语法格式:[ lsof [选项] ]
        -a              #列出打开文件存在的进程
        -c [进程名]      #列出指定进程所打开的文件
        -g              #列出GID号进程详情
        -p [进程号]      #列出指定进程号所打开的文件
        -u              #列出UID号进程详情

非交互查询进程状态: ps命令用于报告当前系统的进程状态,ps命令是最基本同时也是非常强大的进程查看命令

[root@localhost ~]# ps --help
语法格式:[ ps [选项] [PID] ]
        aux             #以BSD操作系统的格式输出
        ajfx            #以树形格式输出
        le              #以Linux标准格式输出
        -a              #显示一个终端的所有进程
        -u              #显示进程的归属用户及内存的使用情况
        -x              #显示没有控制终端的进程
        -l              #长格式显示,更加详细的信息
        -j              #工作格式显示
        -f              #做一个更完整的输出
        -e              #显示所有进程,与a的作用一致

交互式查询进程状态: top命令可以实时动态地查看系统的整体运行情况,用热键可以管理,使用方便.

[root@localhost ~]# top --help
语法格式:[ top [选项] [PID] ]
[非交互选项]
        -d 秒数          #指定刷新频率
        -b              #使用批处理模式,和-n结合将top的结果重定向到文本
        -n 次数          #指定top次数和-b结合
        -p              #指定查看某的PID的进程
        -s              #使top在安全模式下运行,避免在交互模式下出现错误
        -u 用户名        #只查看(监听)某一个用户的进程
------------------------------------------------------------------------------
[交互模式命令]
        P               #按照CPU使用率排序
        M               #按照内存使用率排序
        N               #按照PID号排序
        T               #按照cpu运算时间排序
        k               #按照PID号给予某一个进程信发送指令,可用于杀死进程
        r               #按照PID给某个进程重设优先级(Nice)值
        q               #退出交互模式

杀死指定进程: kill命令用来删除执行中的程序或工作,下面是kill命令的常用格式

[root@localhost ~]# kill --help
语法格式:[ kill [选项][信号] [PID] ]
        -a              #当处理当前进程时,不限制命令名和进程号的对应关系
        -l 信号         #若不加<信号>选项,则查看kill 所支持的信号
        -p              #只打印相关进程的进程号,而不发送任何信号
        -s 信号         #指定要送出的信息
        -u              #指定用户
[常用信号]
        1               #复位,重新加载配置
        15              #终止,正常退出
        9               #强制终止
        18              #继续
        19              #暂停

重启进程:使用kill -1重启一个syslog程序

[root@localhost ~]# ps aux | grep "syslog" | grep -v "grep" | awk '{print $2}'
1103
[root@localhost ~]# kill -1 $(ps aux | grep "syslog" | grep -v "grep" | awk '{print $2}')

强制终止指定程序:使用kill -9强制终止一个VIM程序

[root@localhost ~]# ps aux | grep "vim" | grep -v "grep" | awk '{print $2}'
11207
[root@localhost ~]# kill -9 $(ps aux | grep "vim" | grep -v "grep" | awk '{print $2}')

强制下线终端:pkill可以按照进程名杀死进程或远程终端,pkill和killall应用方法差不多

[root@localhost ~]# who
root     tty1         2018-09-28 22:03
root     pts/0        2018-09-28 22:01 (192.168.1.6)
[root@localhost ~]# pkill -9 -t tty1
[root@localhost ~]# who
root     pts/0        2018-09-28 22:01 (192.168.1.6)

根据进程名杀进程: killall命令可以直接通过进程名称来操作指定程序

[root@localhost ~]# yum install -y psmisc
[root@localhost ~]# killall -9 vim

调节进程优先级: nice命令可以调节系统中进程的优先级,只有Root用户有权限调节.

[root@localhost ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   1409   1405  0  80   0 - 28859 do_wai pts/0    00:00:00 bash
0 R     0   1502   1409  0  80   0 - 38300 -      pts/0    00:00:00 ps

上面我们可以看到PRI的存在,由于PRI是由内核动态调整的,我们使用者也无权去干涉PRI,如果要调整程序的优先运行序时,可以修改Nice值系统会根据Nice值进行调节,Nice值有正负之分,Nice可调整的范围是(-20-19),系统会将PRI的值和Nice相加,得到的结果越小优先值就越高.

PRI(new) = PRI(old) + Nice

使用nice:新执行vim程序,并赋予-5的权限

[root@localhost ~]# nice -n -5 vim &
[1] 1591
[root@localhost ~]# top -bn1 | grep vim
  1591 root      15  -5  148872   4520   2316 T  0.0  2.0   0:00.01 vim

使用renice:使用renice,给一个已经运行的进程修改nice值

[root@localhost ~]# jobs
[1]+  Stopped                 vim lyshark.sh
[root@localhost ~]# top -bn1 | grep vim
  1595 root      20   0  148872   4544   2340 T  0.0  2.0   0:00.01 vim
[root@localhost ~]# renice -5 1595
1595 (process ID) old priority 0, new priority -5
[root@localhost ~]# top -bn1 | grep vim
  1595 root      15  -5  148872   4544   2340 T  0.0  2.0   0:00.01 vim

系统网络配置管理

测试网络连通性: ping命令用来测试主机之间网络的连通性

[root@localhost ~]# ping --help
ping: invalid option -- '-'
语法格式:[ ping [选项] [IP或网址] ]
        -c [次数]        #探测时指定次数
        -S [大小]        #探测时指定数据包大小
        -i [秒数]        #探测时指定秒数
        -l [数值]        #设置在送出要求信息之前,先行发出的数据包
        -f               #极限检测模式
        -R               #探测时记录路由过程
        -q               #不显示指令执行过程

追踪数据包: traceroute命令用于追踪数据包的越点次数.

[root@localhost ~]# yum install -y traceroute
[root@localhost ~]# traceroute --help
语法格式:[ traceroute [选项] [网址或IP] ]
        -q [次数]       #指定每次的追踪次数
        -d              #使用Socket层级的排错功能
        -f[存活数值]     #设置第一个检测数据包的存活数值TTL的大小
        -I              #使用ICMP回应取代UDP资料信息

查询与配置网络参数: ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数

[root@localhost ~]# yum install -y net-tools
[root@localhost ~]# ifconfig --help
语法格式:[ ifconfig [选项] [参数列表] [IP或网址] ]
        add [地址]        #设置网络设备IPv6的ip地址
        del [地址]        #删除网络设备IPv6的IP地址
        up                #启动指定的网络设备
        down              #关闭指定的网络设备
        io_addr [I/O地址] #设置网络设备的I/O地址
        netmask [掩码]    #设置网络设备的子网掩码
        tunnel [地址]     #建立IPv4与IPv6之间的隧道通信地址

启动/关闭指定网卡:

[root@localhost ~]# ifconfig eth0 up     #开启网卡
[root@localhost ~]# ifconfig eth0 down   #关闭网卡
[root@localhost ~]# ifconfig eth0 arp    #开启网卡eth0的arp协议
[root@localhost ~]# ifconfig eth0 -arp   #关闭网卡eth0的arp协议
[root@localhost ~]# ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为1500bytes

临时分配IP地址/子接口:

[root@localhost ~]# ifconfig eth0 192.168.1.10
[root@localhost ~]# ifconfig eth0 192.168.1.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
# 在eth0上分配一个子接口
[root@localhost ~]# ifconfig eth0:0 192.168.1.10
[root@localhost ~]# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0

为网卡配置和删除IPv6地址:

[root@localhost ~]# ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
[root@localhost ~]# ifconfig eth0 del 33ffe:3240:800:1005::2/64    #为网卡eth0删除IPv6地址

查网络连接状态: Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,可让你得知整个Linux系统的网络情况.

[root@localhost ~]# netstat --help
语法格式:[ netstat [选项] ]
        -t              #列出TCP协议端口
        -u              #列出UPD协议端口
        -n              #使用IP地址和端口显示
        -l              #仅列出在监听状态网络服务
        -a              #列出所有的网络连接
        -r              #列出路由列表(route)
        -c              #持续列出网络状态
        -g              #显示多重广播功能群组组员名单
        -i              #显示网络接口列表
        -n              #直接使用ip地址,而不通过域名服务器
        -s              #显示网络工作信息统计表

列出所有端口(包括监听和未监听的):

[root@localhost ~]# netstat -a        #列出所有端口
[root@localhost ~]# netstat -at       #列出所有tcp端口
[root@localhost ~]# netstat -au       #列出所有udp端口
[root@localhost ~]# netstat -antp     #列出所有tcp端口
[root@localhost ~]# netstat -anup     #列出所有udp端口
[root@localhost ~]# netstat -autp     #列出所有tcp/udp端口

列出所有处于监听状态的Sockets:

[root@localhost ~]# netstat -l        #只显示监听端口
[root@localhost ~]# netstat -lt       #只列出所有监听tcp端口
[root@localhost ~]# netstat -lu       #只列出所有监听udp端口
[root@localhost ~]# netstat -lx       #只列出所有监听UNIX端口

显示每个协议的统计信息:

[root@localhost ~]# netstat -s        #显示所有端口的统计信息
[root@localhost ~]# netstat -st       #显示TCP端口的统计信息
[root@localhost ~]# netstat -su       #显示UDP端口的统计信息
[root@localhost ~]# netstat -pt       #输出显示PID进程号
[root@localhost ~]# netstat -i        #输出显示进程名称

查询与设置路由表: route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.

[root@localhost ~]# route --help
语法格式:[ route [选项] [地址] ]
        -A             #设置地址类型
        -C             #打印将Linux核心的路由缓存
        -v             #详细信息模式
        -n             #不执行DNS反查,以IP地址显示
        -e             #netstat格式显示路由表
        -net           #指定网络的路由表
        -host          #指定主机的路由表
        Add            #增加指定的路由记录
        Del            #删除指定的路由记录
        Target         #目的网络或目的主机
        gw             #设置默认网关
        mss            #设置TCP的最大区块长度(MSS)单位MB
        window         #指定通过路由表的TCP连接的TCP窗口大小
        dev            #路由记录所表示的网络接口

显示当前路由:使用route命令显示当前路由表.

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
U ————-> (Up)表示此路由当前为启动状态
H ————-> (Host)表示此网关为一主机
G ————-> (Gateway)表示此网关为一路由器
R ————-> (Reinstate Route)使用动态路由重新初始化的路由
D ————-> (Dynamically)此路由是动态性地写入
M ————-> (Modified)此路由是由路由守护程序或导向器动态修改
! ————-> (false)表示此路由当前为关闭状态

添加网关/设置网关:增加一条到达192.168.10.0的路由.

[root@localhost ~]# route add -net 192.168.10.0 netmask 255.255.255.0 dev ens32
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens32

屏蔽一条路由:增加一条屏蔽的路由,目的地址为192.168.10.0将被拒绝.

[root@localhost ~]# route add -net 192.168.10.0 netmask 255.255.255.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
192.168.10.0    -               255.255.255.0   !     0      -        0 -

删除路由记录:删除192.168.10.0这条路由记录.

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
192.168.10.0    -               255.255.255.0   !     0      -        0 -
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 ens32
[root@localhost ~]# route del -net 192.168.10.0 netmask 255.255.255.0
[root@localhost ~]# route del -net 192.168.10.0 netmask 255.255.255.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

添加/删除网关:添加设置默认网关,与删除默认网关

[root@localhost ~]# route add default gw 192.168.1.1
[root@localhost ~]# route del default gw 192.168.1.1
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 ens32
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

管理网络配置: nmcli 命令时默认的网络服务由NetworkManager提供,这是动态控制及配置网络的守护进程

查询网络连接:通过nmcli命令查询网络连接详情.

[root@localhost ~]# nmcli connection show          #显示所有网络连接
[root@localhost ~]# nmcli connection show ens32    #显示指定网卡的详情
[root@localhost ~]# nmcli dev status               #显示网络设备连接状态
[root@localhost ~]# nmcli dev show                 #显示所有网络设备的详情

启用与禁止网络连接:下面的命令用来启动和禁止连接网络.

[root@localhost ~]# nmcli connection up ens32      #启动ens32网卡
[root@localhost ~]# nmcli connection down ens32    #停止ens32网卡
[root@localhost ~]# nmcli connection del ens32     #删除网络连接的配置文件
[root@localhost ~]# nmcli connection reload ens32  #重新加载配置网络配置文件
[root@localhost ~]# nmcli net on/off               #启用/关闭所有的网络连接
[root@localhost ~]# nmcli con dis ens32            #禁用网络设备并防止自动激活
[root@localhost ~]# nmcli con add help             #查看添加网络连接配置的帮助

修改网络地址:修改网络连接单项参数.

nmcli con add con-name ens32 type ethernet ifname ens32 动态获取IP方式的网络连接配置
nmcli con add con-name ens32 ifname ens32 autoconnect yes type ethernet ip4 192.168.1.10 gw4 192.168.1.1
[root@localhost ~]# nmcli con mod 网卡名 connection.autoconnect yes                   #修改为自动连接
[root@localhost ~]# nmcli con mod 网卡名 ipv4.method manual                           #dhcp修改IP地址是静态还是DHCP
[root@localhost ~]# nmcli con mod 网卡名 ipv4.addresses "192.168.1.0/24 192.168.1.1"  #修改IP配置及网关
[root@localhost ~]# nmcli con mod 网卡名 ipv4.gateway 192.168.1.1                     #修改默认网关
[root@localhost ~]# nmcli con mod 网卡名 +ipv4.addresses 192.168.1./24                #添加第二个IP地址
[root@localhost ~]# nmcli con mod 网卡名 ipv4.dns 114.114.114.114                     #添加dns1
[root@localhost ~]# nmcli con mod 网卡名 +ipv4.dns  8.8.8.8                           #添加dns2
[root@localhost ~]# nmcli con mod 网卡名 -ipv4.dns  8.8.8.8                           #删除dns
nmcli con mod ————-> ifcfg-* 文件
ipv4.method manual ————-> BOOTPROTO=none
ipv4.method auto ————-> BOOTPROTO=dhcp
connection.id eth0 ————-> NAME=eth0
ipv4.addresses ————-> IPADDR0=192.168.1.10
192.168.1.0/24 ————-> PREFIX0=24
192.168.1.1 ————-> GATEWAY0=192.168.1.1
ipv4.dns 8.8.8.8 ————-> DNS0=8.8.8.8
pv4.dns-search example.com ————-> DOMAIN=example.com
pv4.ignore-auto-dns true ————-> PEERDNS=no
connection.autoconnect yes ————-> ONBOOT=yes
connection.interface-name eth0 ————-> DEVICE=eth0
802-3-ethernet.mac-address... ————-> HWADDR=...

配置一个IPV6地址: 使用上面的方法配置一个IPV6地址.

a.先查看一下网卡名称,看一下名称是否能够匹配.

[root@system1 ~]# nmcli connection 
名称 UUID 类型 设备 
eth2 3a73717e-65ab-93e8-b518-24f5af32dc0d 802-3-ethernet eth2 
eth1 9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04 802-3-ethernet eth1 
eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802-3-ethernet eth0

b.紧接着修改管理方式为auto,并配置上IP地址.

[root@localhost ~]# nmcli connection modify eth0 ipv6.method auto
[root@localhost ~]# nmcli connection modify eth0 ipv6.address "200e:ac18::e0a/64"
[root@localhost ~]# nmcli connection modify eth0 ipv6.method manual

c.重启服务,并查看配置是否生效inet6 200e:ac18::e0a.

[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig ens32
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.100 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::5054:ff:fe29:8298 prefixlen 64 scopeid 0x20<link>
inet6 200e:ac18::e0a prefixlen 64 scopeid 0x0<global>
ether 52:54:00:29:82:98 txqueuelen 1000 (Ethernet)
RX packets 5483 bytes 466334 (455.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2639 bytes 357765 (349.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

配置聚合网络: 给本机配置要给聚合网络,并使用eth1eth2接口,实现当eth1失效后自动切换到eth2.

a.拷贝配置文件模板,默认配置模板.

[root@localhost ~]# cd /usr/share/doc/teamd-1.9/example_ifcfgs/1
[root@localhost ~]# cp -a * /etc/sysconfig/network-scripts/

b.修改tteam_test0模板.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-team_test0
1 DEVICE="team_test0"
2 NAME=team_test0                  #添加本行
3 DEVICETYPE="Team"
4 ONBOOT="yes"                     #改为yes
5 BOOTPROTO=none
6 NETMASK=255.255.255.0            #修改
7 IPADDR=172.168.11.25             #修改
8 TEAM_CONFIG='{"runner": {"name": "activebackup"}}'  #修改成activebackup

d.修改eth1网卡,修改两处位置即可.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 
1 DEVICE="eth1"
2 NAME="eth1"                    #添加
3 DEVICETYPE="TeamPort"
4 ONBOOT="yes"                   #修改yes
5 TEAM_MASTER="team_test0"

d.修改eth2网卡,修改两处位置即可.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth2
1 DEVICE="eth2"
2 NAME="eth2"                    #添加
4 DEVICETYPE="TeamPort"
5 ONBOOT="yes"                   #修改yes
6 TEAM_MASTER="team_test0"
[root@localhost ~]# systemctl restart network

SSH远程连接服务: SSH为Linux系统下的远程连接命令,多用于远程管理Linux服务器资源.

[root@localhost ~]# ssh --help
语法格式:[ ssh [选项] [用户名]@[地址] ]
        -e      #支持反斜线控制的字符转换
        -q      #静默模式
        -i      #指定身份文件
        -o      #指定配置选项
        -X      #开启X11转发功能
        -y      #开启信任X11转发功能
        -1      #强制使用ssh协议版本1
        -2      #强制使用ssh协议版本2
        -4      #强制使用IPv4地址
        -6      #强制使用IPv6地址
        -C      #请求压缩所有数据
        -f      #后台执行ssh指令
        -N      #不执行远程指令
        -F      #指定ssh指令的配置文件
        -l      #指定连接远程服务器登录用户名
        -p      #指定远程服务器上的端口

sshd服务的配置文件默认保存在/etc/ssh/sshd_config,下面我们将介绍sshd_config配置参数.

port 22                                     #监听端口
addressFamily any                           #允许所有人链接
listenAddress 0.0.0.0                       #IPV4监听IP   0.0.0.0表示监听所有
listenAddress : :                           #IPV6监听IP
protocol 2                                  #使用二代协议
syslogFacility AUTHPRIV                     #日志认证等级
permitRootLogin yes                         #是否允许root登陆
passwordAuthentication yes                  #是否使用密码认证
permitEmptyPasswords no                     #是否允许空密码
loginGraceTime 2m                           #2分钟不输入后自动断开连接
printMotd yes                               #登陆后根据/etc/motd内容打印信息
printLastLog yes                            #输出最后一次登录信息
useDNS yes                                  #反查主机名,关闭后可提升登陆速度
gSSAPIAuthentication yes                    #GSS认证,关闭后可提升登陆速度
pidFile /var/run/sshd.pid                   #存放sshPID的地方
usePrivilegeSeparation sandbox/yes/no       #是否允许以较低权限运行
pubkeyAuthentication yes                    #使用公钥认证机制
authorizedKeysFile .ssh/auth                #公钥的存放位置
MaxAuthTries 5                              #密码最大尝试次数
MaxSessions 10                              #最大允许终端数

当我们需要登陆远程主机时,通过用户名密码即可登陆到远程主机,如下.

[root@localhost ~]# ssh root@192.168.1.5 -p 22
The authenticity of host 'host (192.168.1.5)' can't be established.
RSA key fingerprint is 94:ee:d7:e0:de:9f:ac:65:22:c1:22:2d:37:12:38:0d.
Are you sure you want to continue connecting (yes/no)?yes
root@192.168.1.5's password:

输入密码,则会自动将我们的登录信息记录到$HOME/.ssh/known_hosts文件里,则下次再登录则不会出现警告部分.

当然除了使用密码登录以外,还可以执行以下命令,系统会在/root/.ssh/id_rsa下面生成两个文件一个公钥一个私钥.

[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.22

通过ssh-copy-id命令将生成的公钥自动的拷贝到对方主机上,此时系统会将id_rsa.pub拷贝到对方/root目录,并会自动命名为authorized_keys,下次使用ssh登陆对方主机,无需密码即可登陆上了,如果无法登陆请确保以下配置是否开启.

[root@localhost ~]# ssh root@192.168.1.22
[root@localhost ~]# vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

SCP网络数据传输: SCP命令可以在Linux系统之间进行网络数据传输,命令参数如下:

[root@localhost ~]# scp --help
语法格式:[ scp [选项] [用户名]@[地址] ]
        -1      #强制scp命令使用协议ssh1
        -2      #强制scp命令使用协议ssh2
        -4      #强制scp命令只使用IPv4寻址
        -6      #强制scp命令只使用IPv6寻址
        -B      #使用批处理模式,过程中不询问
        -C      #允许压缩
        -p      #留原文件的修改时间,访问时间和访问权限
        -q      #不显示传输进度条
        -r      #传送文件夹
        -v      #详细方式显示输出
        -c      #以cipher加密传输
        -F      #指定一个替代的ssh配置文件
        -i      #传输时指定密钥文件
        -l      #限制传输带宽,以Kbit/s为单位
        -P      #指定传输端口
        -S      #指定加密传输时所使用的程序

本地文件传输到远程: 将本地的/etc/passwd拷贝到远程的/tmp目录下.

[root@localhost ~]# scp /etc/passwd root@192.168.1.22:/tmp/
root@192.168.1.22's password:
passwd                                                              100%  898   876.6KB/s   00:00

远程文件传输到本地: 将远程的/etc/shadow拷贝到本地的/tmp目录下.

[root@localhost ~]# scp root@192.168.1.22:/etc/shadow /tmp/
root@192.168.1.22's password:
shadow                                                               100%  714   741.2KB/s   00:00

远程目录拷贝到本地: 把远程的/etc整个目录,拷贝到本机的/tmp目录下.

[root@localhost ~]# scp -r root@192.168.1.22:/etc/ /tmp/
root@192.168.1.22's password:
fstab                                                                100%  465   188.1KB/s   00:00
crypttab                                                             100%    0     0.0KB/s   00:00
mtab                                                                 100%    0     0.0KB/s   00:00

系统磁盘配置管理

基本磁盘操作

查询磁盘参数(ext): dumpe2fs命令用于打印Linux文件系统的超级块和块组信息,下面我们先来看一下它的具体参数吧.

[root@localhost ~]# dumpe2fs --help
命令语法:[ dumpe2fs [选项] 磁盘路径 ]
        -b              #打印文件系统中预留的块信息
        -h              #仅显示超级块信息
        -i              #从指定的文件系统映像文件中读取文件系统信息
        -x              #以16进制格式打印信息块成员
        -ob 超级块      #指定检查文件系统时使用的超级块
        -OB 块大小      #检查文件系统时使用的指定的块大小

通过dumpe2fs -h显示指定/dev/sdb分区的详细参数,该命令只能查询ext格式文件系统.

[root@localhost ~]# dumpe2fs -h /dev/sdb
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>                  #文件分区的名字(Label)
Filesystem UUID:          5dc23dc0-8245-4113-b40a-4cb09ad9f4de   #文件系统的UUID
Default mount options:    user_xattr acl           #默认挂载的参数
Filesystem state:         clean                    #这个文件系统是没有问题的(clean)
Filesystem OS type:       Linux                    #文件系统类型是Linux
Inode count:              1310720                  #Inode的总数
Block count:              5242880                  #Block的总数
Reserved block count:     262144
Free blocks:              5116558                  #剩余Blocks数量
Free inodes:              1310709                  #剩余Inodes数量
First block:              0
Block size:               4096                     #每个Block块的大小
First inode:              11
Inode size:               256                      #每个Inodes块的大小

查询磁盘参数(xfs): 如果要查询XFS格式的分区,南无就需要使用xfs_info这条命令了.

[root@localhost ~]# xfs_info /dev/sda1 
meta-data=/dev/sda1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

查询磁盘分区信息: df命令用于显示磁盘分区上的可使用的磁盘空间,默认显示单位为KB.

[root@localhost ~]# df --help
命令语法:[ df [选项] ]
        -a              #列出所有的文件系统,包括/proc等系统
        -k              #以KB为单位,显示各文件系统
        -m              #以MB为单位,显示各文件系统
        -h              #以常用单位显示文件系统大小
        -H              #以M=1000替代M=1024显示数据
        -T              #显示文件系统类型
        -i              #不用硬盘容量,以Inode数量来显示

以通用格式显示系统文件信息,也是生产环境中的常用查询方式.

[root@localhost ~]# df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs        17G  1.2G   16G   7% /
devtmpfs              devtmpfs   98M     0   98M   0% /dev
tmpfs                 tmpfs     110M     0  110M   0% /dev/shm
tmpfs                 tmpfs     110M  5.5M  104M   6% /run
tmpfs                 tmpfs     110M     0  110M   0% /sys/fs/cgroup
/dev/sr0              iso9660   4.4G  4.4G     0 100% /mnt
/dev/sda1             xfs      1014M  130M  885M  13% /boot
tmpfs                 tmpfs      22M     0   22M   0% /run/user/0
/dev/sdb              ext4       20G   45M   19G   1% /lyshark

统计文件总大小: du命令也是查看使用空间的,du命令可对文件和目录磁盘使用的空间的查看

[root@localhost ~]# du --help
命令语法:[ du [选项] 文件或目录 ]
        -a              #列出所有的文件与目录容量
        -h              #以常用单位显示容量信息
        -s              #只列出总容量,而不统计每个个别目录占用容量
        -S              #不包括子目录下的总计,区别于 -s
        -m              #以MB为单位显示
        -k              #以KB为单位显示

通过du -sh显示目录的总容量,通过指定文件的总大小.

[root@localhost ~]# du -sh /etc/
31M     /etc/
[root@localhost ~]# du -sh /usr/bin/
63M     /usr/bin/

查所有可用分区设备: lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系.

[root@localhost ~]# yum install util-linux-ng
[root@localhost ~]# lsblk --hlep
命令语法:[ lsblk [选项] ]
        -a              #显示所有设备
        -m              #显示权限信息
        -l              #使用列表格式显示
        -n              #不显示标题
        -o 列名         #输出指定列
        -P              #以键和值的方式显示
        -t              #使用拓展格式输出
        -r              #使用原始格式输出

使用lsblk -t显示磁盘信息,并显示其下的所有分区信息.

[root@localhost ~]# lsblk -t
NAME          ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED    RQ-SIZE   RA WSAME
sda                   0    512      0     512     512    1 deadline     128 4096   32M
├─sda1                0    512      0     512     512    1 deadline     128 4096   32M
└─sda2                0    512      0     512     512    1 deadline     128 4096   32M
  ├─rhel-root         0    512      0     512     512    1              128 4096   32M
  └─rhel-swap         0    512      0     512     512    1              128 4096   32M
sdb                   0    512      0     512     512    1 deadline     128 4096    0B
sr0                   0   2048      0    2048    2048    1 deadline     128  128    0B

更改/设置磁盘卷标名: e2label命令用来设置第二扩展文件系统的卷标,此命令无参数直接看使用技巧.

[root@localhost ~]# dumpe2fs -h /dev/sdb |grep "Filesystem volume name"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
[root@localhost ~]# e2label /dev/sdb "lyshark desk"
[root@localhost ~]# dumpe2fs -h /dev/sdb |grep "Filesystem volume name"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   lyshark desk

检查修复文件系统: fsck命令用于检查并修复文件系统中的错误,当文件系统发生错误,可用fsck指令尝试加以修复.

[root@localhost ~]# fsck --help
命令语法:[ fsck [选项] 磁盘路径 ]
        -a              #自动修复文件系统,不询问
        -A              #依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统
        -t 类型         #指定检查文件系统类型
        -V              #显示指令执行过程

检查并修复/dev/sdb分区文件系统,并指定格式为ext4,注意:检查时应该先卸载分区.

[root@localhost ~]# fsck -t ext4 -a /dev/sdb
fsck from util-linux 2.23.2
lyshark_desk: clean, 11/1310720 files, 126322/5242880 blocks

磁盘格式化命令: mkfs命令用于在设备上创建Linux文件系统.

[root@localhost ~]# mkfs -help
命令语法:[ mkfs [文件类型] 磁盘路径 ]
        -t ext2          #格式化为ext2
        -t ext3          #格式化为ext3
        -t ext4          #格式化为ext4
[root@localhost ~]# mkfs.
mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs xfs_group
[root@localhost ~]# mkfs -t ext4 /dev/sdb

挂载与卸载磁盘: mount命令用于加载文件系统到指定的加载点,umount则与之相反是卸载命令.

[root@localhost ~]# mount --help
命令语法:[ mount [选项] [原盘符] [挂载到] ]
        -t ext2          #格式化为ext2
        -a               #根据/etc/fstab配置,重新挂载一遍
        -l               #显示已挂载文件系统列表
        -t               #指定挂载类型(ext2/ext3/vfat/reiserfs/iso9660)
        -L               #通过文件系统的卷标名称进行挂载
        -r               #将文件系统加载为只读模式
        -v               #输出指令执行详细信息
        -o               #指定额外挂载参数(ro,rw只读读写/exec,noexec是否可执行/remount 重新挂载)

挂载光盘 /dev/sr0 挂载到 /mnt 目录下

[root@localhost ~]# mount -t iso9660 /dev/sr0 /mnt/

挂载硬盘,挂载时指定语系为 iocharset=cp950 挂载到 /mnt/flash

[root@localhost ~]# mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash

将根分区重新挂载,并加上读写权限

[root@localhost ~]# mount -o remount,rw,auto  /

将/home这个目录,临时挂载到/tmp/home下

[root@localhost ~]# mount --bind /home/ /tmp/home/

利用卷标名来挂载

[root@localhost home]# mount -L "LyShark_Disk" /tmp/disk/

挂载一个ISO镜像,例如Centos.iso

[root@localhost ~]# mount -o loop /root/Centos.iso /mnt/centos_dvd

卸载磁盘或任意外部介质

[root@localhost home]# umount -v /dev/sr0

设置开机自动挂载,打开/etc/fstab写入以下内容,这里千万别写错

[root@localhost ~]# ls -l /dev/disk/by-uuid/
[root@localhost ~]# cat /etc/fstab
/dev/sdb1 /sdb1  ext4   defaults 0 0
[root@localhost ~]# mount -a
--------------------------------------------------------------------------------
1.设备文件名(UUID)
2.挂载点
3.文件系统类型
4.挂载特殊选项
5.是否备份: 0不备份 1每天备份 2不定期备份
6.是否检查磁盘状态: 0不检查 1启动时检查 2启动后检查

磁盘分区 Fdisk

fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区,它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣.

[root@localhost ~]# fdisk -l                         #查看系统所有硬盘及分区
[root@localhost ~]# fdisk 磁盘设备名(/dev/sda)        #创建或修改磁盘的分区结构
[root@localhost ~]# fdisk /dev/sd*
Welcome to fdisk (util-linux 2.23.2)
Command action
    p:打印分区表
    n:新建一个新分区
    d:删除一个分区
    t:更改分区类型(82=交换分区)
    m:输出菜单
    q:退出不保存
    w:把分区写进分区表,保存并退出
Command (m for help):
注:若报错Device or resource busy. The kernel still uses the old table.The new table will be used at the next reboot。则需要重启系统,重新加载硬盘,才能进一步操作。 
partprobe   强制读取所有分区
⦁当出现上述情况时,也可不必重启,问题导致原因为内核正在使用分区表,那么我们可以是用partprobe强制读取所有分区达到不需要重启从而解决设备占用的问题。
命令没有请安装:parted-2.*-*-*.rpm

1.查看磁盘,查看是否有新的磁盘且没有被格式化的.

[root@localhost ~]# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 Sep 21 07:26 /dev/sda
brw-rw---- 1 root disk 8,  1 Sep 21 07:26 /dev/sda1
brw-rw---- 1 root disk 8,  2 Sep 21 07:26 /dev/sda2
brw-rw---- 1 root disk 8, 16 Sep 21 07:26 /dev/sdb
[root@localhost ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 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: 0x000cc3ff
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    20971519     9436160   8e  Linux LVM
↓ 此处就是我们的新磁盘,且没有被格式化
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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

2.输入相应盘符进入分区界面

[root@localhost ~]# 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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5b3d4ae9.
Command (m for help):

3.开始分区,下面将逐个解释其分区含义

[root@localhost ~]# 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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x5b3d4ae9.
Command (m for help): p                                                #打印当前分区信息
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x5b3d4ae9
   Device Boot      Start         End      Blocks   Id  System
--------------------------------------------------------------------------------
[划分主分区]
Command (m for help): n                                              #新建一个分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)                       #创建一个主分区
   e   extended                                                      #创建一个逻辑分区
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048): 2048                     #默认从哪里开始划分
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +5G   #指定划分5个GB
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p                                               #打印分区情况
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x5b3d4ae9
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux        #此处可看到一个主分区了
--------------------------------------------------------------------------------
[划分拓展分区]
Command (m for help): n                                              #继续创建分区
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e                                                #这次选择创建逻辑分区
Partition number (2-4, default 2): 2                                 #默认从2开始
First sector (10487808-20971519, default 10487808): 10487808         #默认开始无需动
Last sector, +sectors or +size{K,M,G} (10487808-20971519, default 20971519):   #由于是拓展分区,所以这里不能指定大小
Using default value 20971519
Partition 2 of type Extended and of size 5 GiB is set
Command (m for help): p
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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: 0x5b3d4ae9
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux
/dev/sdb2        10487808    20971519     5241856    5  Extended        #这里可以看到已经有一个拓展结构了,接下来分区
--------------------------------------------------------------------------------
[在拓展分区的基础上划分逻辑分区]
Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)                                       #这里选择l新建逻辑分区
Select (default p): l
Adding logical partition 5
First sector (10489856-20971519, default 10489856): 10489856           #默认开始位置
Last sector, +sectors or +size{K,M,G} (10489856-20971519, default 20971519):  #划分全部空间
Using default value 20971519
Partition 5 of type Linux and of size 5 GiB is set
Command (m for help): w                                              #保存分区表并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#

4.接下来使用fdisk -l可以查看分区情况

[root@localhost ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes, 20971520 sectors            #这是/dev/sda逻辑磁盘
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: 0x000cc3ff
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    20971519     9436160   8e  Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors            #这是/dev/sdb逻辑磁盘
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: 0x5b3d4ae9
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux          #这就是刚刚划分的主分区
/dev/sdb2        10487808    20971519     5241856    5  Extended       #这是拓展结构
/dev/sdb5        10489856    20971519     5240832   83  Linux          #这是逻辑分区

磁盘分区 Parted

parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同它支持调整分区的大小,作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型,但是它可以处理最常见的分区格式,包括:ext2、ext3、fat16、fat32、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交换分区.

1.parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区,fdisk命令对于大于2T的分区无法划分.
2.大于2.2TB的存储空间用fdisk不支持,需要采用parted来分区,所以用fdisk无法看到parted划分的GPT格式的分区.

[root@localhost ~]# parted
(parted) help
  mklabel,mktable LABEL-TYPE               创建新的磁盘卷标(分区表)
  mkpart PART-TYPE [FS-TYPE] START END     创建一个分区
  print [devices|free|list,all|NUMBER]     打印当前分区信息
  quit                                     exit program
  rm NUMBER                                删除一个分区
  select DEVICE                            选择需要编辑的设备
  toggle [NUMBER [FLAG]]                   切换分区表状态
(parted)

1.磁盘参数解释

--------------------------------------------------------------------------------
[root@localhost ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
                          ↓ 磁盘参数
Model: VMware, VMware Virtual S (scsi)
                 ↓ 磁盘大小
Disk /dev/sdb: 10.7GB
                                ↓ 扇区大小
Sector size (logical/physical): 512B/512B
Partition Table: msdos  ← 分区表格式
Disk Flags:
   1     2     3    4     5       6            7       
Number  Start  End  Size  Type  File system  Flags
(parted)
1.Number:分区号
2.Start:分区起始位置,这里不再像fdisk用柱面表示,而是使用byte更加直观
3.End:分区结束位置
4.Size:分区大小
5.Type:分区类型
6.FileSystem:文件系统类型,parted不支持格式化成ext4,但能识别
7.标志(flags):分区标记
--------------------------------------------------------------------------------

2.将分区表格式修改成GPT

(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number  Start  End  Size  Type  File system  Flags
(parted) mklabel msdos    #原格式是mbr
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be
lost. Do you want to continue?
Yes/No? Yes
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt    #新格式是gpe
Disk Flags:
Number  Start  End  Size  File system  Name  Flags
(parted)

3.创建一个分区

(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number  Start  End  Size  File system  Name  Flags
(parted) mkpart                        #创建分区
Partition name?  []? disk1             #分区名
File system type?  [ext2]? ext2        #分区格式,parted只能创建ext2,这里我们出去格式化吧
Start? 1MB                             #磁盘开始位置
End? 2000MB                            #磁盘结束为止
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  2000MB  1999MB  ext2         disk1            #此处已创建完成
(parted) q

磁盘分区 Swap

swap命令用于创建交换空间(包括交换文件和交换分区)

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           218M        112M         22M        5.1M         82M         69M
Swap:          1.0G        520K        1.0G
[root@localhost ~]# dd if=/dev/zero of=/tmp/swap bs=1024 count=100000
100000+0 records in
100000+0 records out
102400000 bytes (102 MB) copied, 2.6988 s, 37.9 MB/s
[root@localhost ~]# mkswap /tmp/swap
Setting up swapspace version 1, size = 99996 KiB
no label, UUID=7d7f22ed-466e-4205-8efe-1b6184dc5e1b
[root@localhost ~]# swapon /tmp/swap
swapon: /tmp/swap: insecure permissions 0644, 0600 suggested.
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           218M        109M        3.2M        2.8M        105M         75M
Swap:          1.1G        2.8M        1.1G
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Sep 18 09:05:06 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=13d5ccc2-52db-4aec-963a-f88e8edcf01c /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
UUID=7d7f22ed-466e-4205-8efe-1b6184dc5e1b swap swap defaults 0 0
[root@localhost ~]# swapoff /tmp/swap
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           218M        109M        5.5M        2.8M        103M         75M
Swap:          1.0G        2.7M        1.0G

高级文件系统管理

Quota 配置磁盘配额

由于Linux是一个多用户管理的操作系统,而Linux默认情况下并不限制每个用户使用磁盘空间的大小,假如某个用户疏忽或者恶意占满磁盘空间,将导致系统磁盘无法写入甚至崩溃,为了保证系统磁盘的有足够的剩余空间,我们需要对用户和组进行磁盘空间使用限制.

⦁配额作用:限制用户和组,对磁盘空间的使用量,限制用户和组,在磁盘内创建文件的个数
⦁软限制:低级限制,超出部分会有宽限天数,宽限天数到期后超出部分被清空,软限制不能超过硬限制
⦁硬限制:绝对限制,此限制不会被突破,达到指定限制条件后将无法继续使用更多磁盘空间
⦁宽限天数:当有数据超过软限制后,超出部分会被计时,宽限天数到期后超出部分数据将被清空,宽限天数默认是7天

注:磁盘配额是针对分区进行设置的,无法实现用户在系统中共计只能使用50MB磁盘空间,只能设置某用户在/home分区能使用50M这样的限制.切记:磁盘配额是针对分区的!

格式化新分区: 格式化/dev/sdb新分区,并检查分区是否支持磁盘配额.

[root@localhost ~]# yum install -y quota
[root@localhost ~]# mkfs.ext4 /dev/sdb
[root@localhost ~]# cat /boot/config-3.10.0-693.el7.x86_64 | grep "CONFIG_QUOTA"
[root@localhost ~]# dumpe2fs -h /dev/sdb | grep "Default mount options"
dumpe2fs 1.42.9 (28-Dec-2013)
Default mount options:    user_xattr acl
#检查结果中是否包含,usrquota,grpquota两个属性

挂载并检测分区: 挂载格式化好的分区,并检查分区是否支持配额(主要看有没有usrquota,grpquota参数)

[root@localhost ~]# mount /dev/sdb /quot/
[root@localhost ~]# cat /proc/mounts |grep "/dev/sdb"
/dev/sdb1 /sdb1 ext4 rw,relatime,data=ordered 0 0
#上面没有看到相关权限,此时我们要重新挂载磁盘,并加上权限
[root@localhost ~]# mount -o remount,usrquota,grpquota /dev/sdb

上方的设置为临时挂载,设置开机自启动的方式是写入/etc/fstab文件,如下写法.

[root@localhost ~]# cat /etc/fstab
/dev/sdb /quot   ext4   defaults,usrquota,grpquota  0 0
[root@localhost ~]# mount -a

生成配额文件: 使用quotacheck -ugv 生成配额文件,生成后的配额配置文件保存在/dev/sdb里面.

[root@localhost ~]# quotacheck -ugv /dev/sdb
语法格式:[ quota [选项] [分区名] ]
        -a      #扫描/etc/mtab文件中所有启用磁盘配额功能的分区.如果加入此参数,命令后面就不需要加入分区名了
        -u      #建立用户配额的配置文件,即生成aquota.user
        -g      #建立组配额的配置文件,即aquota.group
        -v      #显示扫描过程
        -c      #清除原有的配置文件,重新建立新的配置文件

编辑配额限制单一用户: 使用交互方式,给lyshark用户设置软限制100M硬限制200M

[root@localhost ~]# edquota -u lyshark
Disk quotas for user lyshark (uid 1000):
     ↓文件系统             (空余)       软(容量)   硬(容量)    I节点      软(数)   硬(数)
  Filesystem              blocks       soft       hard     inodes     soft     hard
  /dev/sdb                  0          100M       200M          0        0        0

编辑配额限制用户组: 使用交互方式,给tomwang组,设置软限制1000M硬限制2000M

[root@localhost ~]# edquota -g tomwang
Disk quotas for group temp (gid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb                          0       1000M     2000M         0        0        0

非交互方式限制用户: 使用非交互方式,设置用户superroot的软限制为100M硬限制为200M

setquota -u 用户名     软(容)  硬(容) 软(数) 硬(数)  分区名
setquota -u superroot  100M   200M     0      0    /dev/sdb

使用模板用户配置: 有时候我们不想挨个配置,可以以lyshark用户为模板,赋予toms账户相同的限制条件

[root@localhost ~]# edquota -p lyshark -u toms
#edquota  -p 模板用户 -u 目标用户

启动/关闭磁盘配额: 配置好以后,直接执行quotaon -augv命令即可开启配额,使磁盘配额生效.

[root@localhost ~]# quotaon -augv
语法格式:[ quotaon [选项] [分区名] ]
        -a      #根据/etc/mtab文件启动所有分区的磁盘配额(不写分区名)
        -u      #启动用户的磁盘配额
        -g      #启动组的磁盘配额
        -v      #显示启动过程信息
[root@localhost ~]# quotaoff -augv
语法格式:[ quotaoff [选项] [分区名] ]
        -a      #根据/etc/mtab文件关闭所有分区的磁盘配额(不写分区名)
        -u      #关闭用户的磁盘配额
        -g      #关闭组的磁盘配额
        -v      #显示关闭过程信息

查看分区磁盘配额: 最后配置好就是查看了,查看/dev/sdb分区配额可执行以下命令.

[root@localhost ~]# repquota -ugvs /dev/sdb
语法格式:[ repquota [选项] [分区名] ]
        -u      #查询用户配额
        -g      #查询组配额
        -v      #显示详情
        -s      #以常见单位显示

LVM 逻辑卷管理器

LVM逻辑卷管理,是Linux对磁盘分区进行管理的一种机制,普通磁盘无法实现动态扩展,而LVM就是将物理磁盘融合成一个巨大的存储池,用户可以按需求动态的调整磁盘的容量,使磁盘容量可控.

LVM的组成部分:
⦁ 物理卷(PV,Physical Volume):由磁盘或分区转化而成
⦁ 卷组(VG,Volume Group):将多个物理卷组合在一起组成了卷组,组成同一个卷组的可以是同一个硬盘的不同分区,也可以是不同硬盘上的不同分区,我们通常把卷组理解为一块硬盘.
⦁ 逻辑卷(LV,Logical Volume):把卷组理解为硬盘的话,那么我们的逻辑卷则是硬盘上的分区,逻辑卷可以进行格式化,存储数据.
⦁ 物理扩展(PE,Physical Extend):PE卷组的最小存储单元,PE所在的位置是VG卷组,即硬盘上,那么我们可以把PE理解为硬盘上的扇区,默认是4MB,可自由配置.

创建/移除物理卷(PV): 使用系统中存在的/dev/sdb /dev/sdc磁盘,并将两个磁盘加入到PV物理卷组中.

[root@localhost ~]# ll /dev/sd[b-z]
brw-rw---- 1 root disk 8, 16 Sep 21 22:04 /dev/sdb
brw-rw---- 1 root disk 8, 32 Sep 21 22:04 /dev/sdc
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc           # 此处拿2块硬盘创建
[root@localhost ~]# pvremove /dev/sdc                    # 移除/dev/sdd磁盘
[root@localhost ~]# pvs                                  #查询创建好的硬盘
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sda2  centos lvm2 a--  <9.00g     0
  /dev/sdb          lvm2 ---  10.00g 10.00g

创建/移除卷组(VG): 通过命令创建与移除卷组成员,此处配置过程较多,此处将依次介绍下.

创建VG卷组: 创建VG卷组,VG卷组要在PV物理卷中选择,创建命令如下.

vgcreate -s [指定PE大小] [VG卷组名] [分区路径] [分区路径][.....]
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize  PFree
  /dev/sda2  centos lvm2 a--  <9.00g     0
  /dev/sdb          lvm2 ---  10.00g 10.00g
  /dev/sdc          lvm2 ---  10.00g 10.00g
[root@localhost ~]# vgcreate -s 4M my_vg /dev/sdb /dev/sdc        #此处就是创建一个VG卷组
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   1   2   0 wz--n- <9.00g     0
  my_vg    2   0   0 wz--n- 19.99g 19.99g                         #这就是VG卷组,名字是my_vg

添加新的PV到VG卷组: 给当前my_vg卷组添加新的PV,也就是扩展卷组

vgextend [卷组名] [物理卷分区]
[root@localhost ~]# vgextend my_vg /dev/sdd                 #添加一个PV到指定卷组
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--   <9.00g      0
  /dev/sdb   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdc   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdd   my_vg  lvm2 a--  <10.00g <10.00g               #已被划分到my_vg卷组

移除单个PV 在VG卷组里移除一个PV,将/dev/sdd从my_vg卷组里移除

vgreduce [卷组名] [物理卷分区]
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--   <9.00g      0
  /dev/sdb   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdc   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdd   my_vg  lvm2 a--  <10.00g <10.00g
[root@localhost ~]# vgreduce my_vg /dev/sdd                #将/dev/sdd从my_vg卷组里移除
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--   <9.00g      0
  /dev/sdb   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdc   my_vg  lvm2 a--  <10.00g <10.00g
  /dev/sdd          lvm2 ---   10.00g  10.00g

移除整个VG卷组: 将创建的my_vg彻底移除

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   1   2   0 wz--n- <9.00g     0
  my_vg    2   0   0 wz--n- 19.99g 19.99g
[root@localhost ~]# vgremove my_vg                    #移除整个卷组
  Volume group "my_vg" successfully removed
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   1   2   0 wz--n- <9.00g    0

移除空闲的VG: 将卷组中空闲的VG从PV中移除

vgreduce -a [卷组名]
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n-  <9.00g      0
  my_vg    3   0   0 wz--n- <29.99g <29.99g
[root@localhost ~]# vgreduce -a my_vg                 #只移除空卷组
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n-  <9.00g      0
  my_vg    1   0   0 wz--n- <10.00g <10.00g

创建/移除/扩展/缩小 LV逻辑卷:

创建LVM逻辑卷: 创建一个LVM逻辑卷名字是my_lv并从my_vg中划分空间,划分10G

lvcreate -L [指定大小] -n [LV名字] [VG卷组:从哪个卷组里划分]
[root@localhost ~]# lvs
  LV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <8.00g
  swap centos -wi-ao----  1.00g
[root@localhost ~]# lvcreate -L 10G -n my_lv my_vg            #创建LVM逻辑卷
[root@localhost ~]# lvs
  LV    VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  centos -wi-ao---- <8.00g
  swap  centos -wi-ao----  1.00g
  my_lv my_vg  -wi-a----- 10.00g

格式化并挂载LVM: 测试LVM是否正常工作,在创建好LVM以后需要手动格式化

[root@localhost ~]# mkdir /LVM                            #首先创建一个挂载点
[root@localhost ~]# mkfs.ext4 /dev/my_vg/my_lv            #格式化LVM分区
[root@localhost ~]# mount /dev/my_vg/my_lv /LVM/          #挂载LVM

LV容量增加(扩容): 将LV的容量增加5G的空间,需要注意扩展要先扩展LVM,然后再扩展文件系统

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.0G  1.2G  6.9G  15% /
/dev/sda1               1014M  130M  885M  13% /boot
/dev/mapper/my_vg-my_lv  9.8G   37M  9.2G   1% /LVM                  ←此处是10G
[root@localhost ~]# lvextend -L +5G /dev/my_vg/my_lv                 #执行增加命令,从VG卷组划分5G
[root@localhost ~]# resize2fs -f /dev/my_vg/my_lv                    #扩展文件系统
[root@localhost ~]# df -h                                            #验证扩展结果
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.0G  1.2G  6.9G  15% /
/dev/sda1               1014M  130M  885M  13% /boot
/dev/mapper/my_vg-my_lv   15G   41M   14G   1% /LVM                  ←此处已经从10G 增加到15G

LV容量缩小(收缩): 将LV的容量缩小5G的空间,缩小要先卸载分区并检查分区,然后缩小文件系统,最后再缩小LVM

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.0G  1.2G  6.9G  15% /
/dev/sda1               1014M  130M  885M  13% /boot
/dev/mapper/my_vg-my_lv   15G   41M   14G   1% /LVM                 ←此处显示15G空间
[root@localhost ~]# umount /dev/my_vg/my_lv                         #卸载LVM卷组
[root@localhost ~]# e2fsck -f /dev/my_vg/my_lv                      #检查文件系统
[root@localhost ~]# resize2fs -f /dev/my_vg/my_lv 10G(减小后的大小)   #缩小文件系统
[root@localhost ~]# lvreduce -L 10G /dev/my_vg/my_lv                 #缩小LVM
Do you really want to reduce my_vg/my_lv? [y/n]: y                   #输入y
[root@localhost ~]# mount /dev/my_vg/my_lv /LVM/                    #挂载
[root@localhost ~]# df -h                                           #再次查看分区变化
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.0G  1.2G  6.9G  15% /
/dev/sda1               1014M  130M  885M  13% /boot
/dev/mapper/my_vg-my_lv  9.8G   37M  9.2G   1% /LVM                 ←此处已经从15G变成10G

拍摄/恢复快照: LVM支持快照的拍摄与恢复,快照拍摄可以使用lvcreate命令,回复的话直接复制快照数据即可.

lvcreate [-s 快照] -n [快照名] -L [快照大小] [指定分区] 
[root@localhost LVM]# lvcreate -s -n mylv_back -L 200M /dev/my_vg/my_lv            #给/LVM目录拍摄快照
[root@localhost LVM]# lvs                                                          #查看快照
  LV        VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root      centos -wi-ao----  <8.00g
  swap      centos -wi-ao----   1.00g
  my_lv     my_vg  owi-aos---  10.00g
  mylv_back my_vg  swi-a-s--- 200.00m      my_lv  0.01                             ←此处就是快照
# 以下是恢复快照的方法
[root@localhost LVM]# rm -fr *                                #模拟被删除
[root@localhost LVM]# mkdir /back                             #创建挂载点
[root@localhost LVM]# mount /dev/my_vg/mylv_back /back/       #挂载备份文件
[root@localhost LVM]# cp -a /back/* ./                        #复制备份文件
[root@localhost LVM]# ls

RAID 磁盘冗余阵列

独立磁盘构成的具有冗余能力的阵列,RAID磁盘阵列主要为了保证硬件损坏的情况下业务不会终止,无法防止误操作.

RAID 0 没有奇偶校验的 (条带卷)
RAID 0 提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求

RAID 1 独立磁盘冗余阵 (镜像卷)
RAID 1 通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据.当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能.

RAID10 (镜象阵列条带)
Raid 10 是一个Raid1与Raid0的组合体,它是利用奇偶校验实现条带集镜像,所以它继承了Raid0的快速和Raid1的安全.

RAID5 分布式奇偶校验的独立磁盘结构(最少3块)
RAID 5 是一种存储性能,数据安全,和存储成本,兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.

Mdadm命令解析:

[root@localhost ~]# mdadm --help
mdadm --create --auto=yes /dev/md[0-9] --raid-devices=[0-n] \
--level=[015] --spare-devices=[0-n] /dev/sd[a-z]
        --create               #新建RAID参数
        --auto=yes             #默认配置
        --raid-devices=N     #磁盘阵列数
        --spare-devices=N    #备份磁盘数
        --level [015]          #阵列等级
        mdadm --detail       #查询阵列信息

构建一个RAID5:

[root@localhost ~]# yum install -y mdadm
[root@localhost ~]# ls -l /dev/sd[b-z]
brw-rw---- 1 root disk 8, 16 Sep 21 23:06 /dev/sdb
brw-rw---- 1 root disk 8, 32 Sep 21 23:06 /dev/sdc
brw-rw---- 1 root disk 8, 48 Sep 21 23:06 /dev/sdd
brw-rw---- 1 root disk 8, 64 Sep 21 23:04 /dev/sde
[root@localhost ~]# mdadm --create --auto=yes /dev/md0 --level=5 \
> --raid-devices=3 --spare-devices=1 /dev/sd{b,c,d,e}                  #创建一个RAID,其中接口是/dev/md0,等级是RAID5
mdadm: Defaulting to version 1.2 metadata                              #主磁盘数3,备份盘数1,提供sd{b,c,d,e}磁盘
mdadm: array /dev/md0 started.
[root@localhost ~]# mdadm --detail /dev/md0                            #查看阵列信息
/dev/md0:   ←设备文件名
           Version : 1.2
     Creation Time : Fri Sep 21 23:19:09 2018   ←创建日期
        Raid Level : raid5                      ←RAID等级
        Array Size : 20953088 (19.98 GiB 21.46 GB)  ←可用空间
     Used Dev Size : 10476544 (9.99 GiB 10.73 GB)   ←每个设备可用空间
      Raid Devices : 3       ←RAID设备数量
     Total Devices : 4       ←全部设备数量
       Persistence : Superblock is persistent
       Update Time : Fri Sep 21 23:19:26 2018
             State : clean, degraded, recovering
    Active Devices : 3   ←启动磁盘
   Working Devices : 4   ←可用磁盘
    Failed Devices : 0   ←错误磁盘
     Spare Devices : 1   ←预备磁盘
            Layout : left-symmetric
        Chunk Size : 512K
Consistency Policy : resync
    Rebuild Status : 34% complete
              UUID : 2ee2bcd5:c5189354:d3810252:23c2d5a8   ←此设备UUID

格式化/dev/md0并挂载使用

[root@localhost ~]# mkfs -t ext4 /dev/md0    #格式化
[root@localhost ~]# mkdir /RAID              #新建挂载目录
[root@localhost ~]# mount /dev/md0 /RAID/    #挂载设备
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.0G  1.2G  6.9G  15% /
devtmpfs                  98M     0   98M   0% /dev
/dev/sr0                 4.2G  4.2G     0 100% /mnt
/dev/md0                  20G   45M   19G   1% /RAID    ←此处可看到挂载成功

RAID仿真救援模式: 此处模拟磁盘损坏,并查看自动替换情况.

mdadm --manage /dev/md[0-9] --add 设备 --remove 设备 --fail 设备
    --add     #将后面的设备加入md中
    --remove  #移除设备
    --fail    #设置出错磁盘
------------------------------------------------------------
[root@localhost /]# mdadm --manage /dev/md0 --fail /dev/sdb         #将/dev/sdb标注为错误
[root@localhost /]# mdadm --detail /dev/md0                         #查看一下状态
/dev/md0:
           Version : 1.2
     Creation Time : Fri Sep 21 23:19:09 2018
        Raid Level : raid5
        Array Size : 20953088 (19.98 GiB 21.46 GB)
     Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
      Raid Devices : 3
     Total Devices : 4
       Persistence : Superblock is persistent
       Update Time : Fri Sep 21 23:50:12 2018
             State : clean, degraded, recovering
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 1  ← 出错磁盘一个
     Spare Devices : 1
            Layout : left-symmetric
        Chunk Size : 512K
Consistency Policy : resync
    Rebuild Status : 5% complete     ←此处需要注意,他正在恢复数据,等到100%时又可以正常工作
              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : 2ee2bcd5:c5189354:d3810252:23c2d5a8
            Events : 20
    Number   Major   Minor   RaidDevice State
       3       8       64        0      spare rebuilding   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       0       8       16        -      faulty   /dev/sdb   ← 出错磁盘
[root@localhost /]# mdadm --manage /dev/md0 --remove /dev/sdb            #移除这个坏掉的磁盘
mdadm: hot removed /dev/sdb from /dev/md0
[root@localhost /]# mdadm --manage /dev/md0 --add /dev/sdb               #添加一个新的磁盘
mdadm: added /dev/sdb

系统防火墙的配置

Iptables 防火墙

Iptables的前身叫ipfirewall,这是一个作者从FreeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具,虽然现在新版系统中早已不在使用Iptables了,但时至今日其还具有顽强的生命力.

替换系统默认防火墙: 在Centos7系统中默认防火墙管理工具不是iptables,执行命令替换一下.

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# yum install -y iptables iptables-services
[root@localhost ~]# systemctl restart iptables
[root@localhost ~]# systemctl enable iptables

查询规则: 使用 -L -n --line-numbers 参数查看防火墙默认配置规则.

[root@localhost ~]# iptables -L -n --line-numbers
[root@localhost ~]# iptables -F                     # 临时清空规则
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

设置默认拒绝: 设置默认拒绝规则,把 INPUT 链设置为默认拒绝,也就是拒绝所有连接请求.

[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)       #这里可以看出INPUT链已变成DROP
num  target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

开启ICMP: 在默认规则拒绝的情况下,设置开启ICMP测试,允许主机ping通.

[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

允许SSH连接: 在默认拒绝的情况下,设置开启22号端口,允许远程ssh连接到本机.

[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:22

删除指定规则: 在默认拒绝的情况下,删除INPUT链,第2条数据,删除ICMP规则.

[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
[root@localhost ~]# iptables -D INPUT 2
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

指定允许网段访问: 在默认拒绝的情况下,设置只允许192.168.1.0/24网段的主机访问本机的22号端口.

[root@localhost ~]# iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -s 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp dpt:22
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp spt:22

拒绝访问指定端口: 在INPUT规则链中,添加拒绝所有人访问本机的8888号端口.

[root@localhost ~]# iptables -I INPUT -p tcp --dport 8888 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 reject-with icmp-port-unreachable
2    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp dpt:22

拒绝访问指定主机网段的端口: 在INPUT规则链中,添加拒绝192.168.1.20主机访问本机的80端口.

[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.1.20 --dport 80 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    REJECT     tcp  --  192.168.1.20         0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable
2    REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 reject-with icmp-port-unreachable
3    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp dpt:22

拒绝访问指定端口范围: 在INPUT规则链中,添加拒绝所有主机访问本机1000-2000端口.

[root@localhost ~]# iptables -A INPUT -p tcp --dport 1000:2000 -j REJECT
[root@localhost ~]# iptables -A INPUT -p udp --dport 1000:2000 -j REJECT
[root@localhost ~]# iptables -L -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    REJECT     tcp  --  192.168.1.20         0.0.0.0/0            tcp dpt:80 reject-with icmp-port-unreachable
2    REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 reject-with icmp-port-unreachable
3    ACCEPT     tcp  --  192.168.1.0/24       0.0.0.0/0            tcp dpt:22
4    REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpts:1000:2000 reject-with icmp-port-unreachable
5    REJECT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpts:1000:2000 reject-with icmp-port-unreachable

SNAT-源地址转换公网>: 从本地发出的数据包,经过SNAT后,会自动伪装成公网的IP,并以公网IP访问指定服务.

#例:将本地 192.168.1.1 的请求自动伪装成外网地址 59.110.167.234
[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens32 -s 192.168.1.1 -j SNAT --to-source 59.110.167.234
  -o                  #指定外网接口,此处为ens32
  -s                  #指定内网口地址,此处为192.168.1.1
  --to-source         #外网口的地址

DNAT-目标地址转换内网>: 从公网接收的数据包,经过DNAT后,会自动将数据包转到指定的内网主机.

#例:将请求 59.110.167.234 且端口为 80 的数据包,自动映射到内网 192.168.1.10
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens32 -d 59.110.167.234 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
  --to-destination     #内网口地址,此处为192.168.1.1
  -i                   #绑定外网接口,此处为ens32
  -d                   #外网地址,此处为8.8.8.8
  -dport               #内网端口,此处为80

配置基本防火墙规则: 我们可以在新安装的系统中依次执行下方代码,来配置一个基本的防火墙规则.

# 删除已有规则
iptables --delete-chain
iptables --flush
# 默认禁止进,允许出,允许回环网卡
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连接的通行
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 限制80端口443端口的单个IP的最大连接数为10
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -I INPUT -p tcp --dport 443 -m connlimit --connlimit-above 10 -j DROP
# 允许80(HTTP)/873(RSYNC)/443(HTTPS)/20,21(FTP)/25(SMTP)端口的连接
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
# 允许SSH端口的连接,放行SSH端口
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 允许ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT 
iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
# 放行允许DNS解析端口
iptables -A OUTPUT -p udp -m udp -d 8.8.8.8 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp -d 114.114.114.114 --dport 53 -j ACCEPT
# 保存规则
iptables-save

其他常用总结: 下面是收藏的一些生成环境下常用规则的配置.

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT    #放行80端口
iptables -t filter -I INPUT -p tcp --dport 443-j ACCEPT    #插入在顶端一条放行443端口的规则
iptables -t filter -I INPUT 2 -p tcp --dport 443 -j ACCEPT #在第二列插入一条443放行规则
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP      #丢弃80端口的请求
iptables -I INPUT 2 -p icmp -j DROP                        #丢弃ICMP请求
iptables -t filter -D INPUT 3                              #删除第三条规则
iptables -t filter -P INPUT DROP                           #设置默认规则,拒绝所有
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT    #放行80口
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT   #放行22口
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT    #放行22口
iptables -A FORWARD -s 192.168.1.10 -j REJECT              #拒绝IP的转发请求
iptables -I INPUT -s 10.20.30.0/24 -j DROP                 #丢弃IP网段的入站请求
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP        #丢弃从eth1网卡流入,且地址匹配的数据包
iptables -A INPUT -o eth0 -s 192.168.1.0/24 -j DROP        #丢弃从eth0网卡流出,且地址匹配的数据包
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT           #放行20-21端口的数据包
iptables -I INPUT -p tcp -m multiport --dport 80-90,85 -j ACCEPT
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.100 -j ACCEPT

firewall 防火墙

在Centos7系统中默认集成了许多防火墙,其中firewalld服务是默认的防火墙工具,它拥有基于CLI和基于GUI的两种工作方式,相比于iptables防火墙firewall支持动态更新的技术并且加入的区域(zone)相关的概念.简单来说,区域就是firewall预先准备了几套防火墙策略的集合,从而实现防火墙之间策列的快速切换技术,从而极大地提升了防火墙的快速切换应用效率.

区域默认策略规则
trusted允许所有数据包
home拒绝流入流量,但是与ssh,mdns,ipp-client,dhcpv6-client服务则允许通过
internal等同于home区域
work拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过
public拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过
external拒绝流入流量,但是与ssh服务相关则允许通过
dmz拒绝流入流量,但是与ssh服务相关则允许通过
block拒绝流入流量,除非与流出的流量相关
drop拒绝流入流量,除非与流出的流量相关

状态显示相关:

[root@localhost ~]# firewall-cmd --state                       #显示运行状态
[root@localhost ~]# firewall-cmd --get-zones                   #显示所有zone区域
[root@localhost ~]# firewall-cmd --get-active-zones            #显示当前使用的区域
[root@localhost ~]# firewall-cmd --get-default-zone            #显示默认使用的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32 #查看ens32网口的区域
[root@localhost ~]# firewall-cmd --zone=public --list-ports    #显示public区域所有开放的端口

常用配置相关:

[root@localhost ~]# firewall-cmd --panic-on           #拒绝所有包
[root@localhost ~]# firewall-cmd --panic-off          #取消拒绝状态
[root@localhost ~]# firewall-cmd --query-panic        #查看是否拒绝

查询服务相关:

[root@localhost ~]# firewall-cmd --get-services                 #显示服务列表
[root@localhost ~]# firewall-cmd --list-service                 #查询当前放行服务
[root@localhost ~]# firewall-cmd --reload                       #重新加载防火墙
[root@localhost ~]# firewall-cmd --add-service=nfs              #临时允许nfs服务通过
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent  #永久允许nfs服务通过

端口管理相关:

[root@localhost ~]# firewall-cmd --add-port=443/tcp                 #临时开启443端口
[root@localhost ~]# firewall-cmd --add-port=3306/tcp --permanent    #永久开启3306端口
[root@localhost ~]# firewall-cmd --remove-port=443/tcp              #删除443端口
[root@localhost ~]# firewall-cmd --list-all                         #显示所有端口列表
[root@localhost ~]# firewall-cmd --add-service=mysql                #开放mysql端口
[root@localhost ~]# firewall-cmd --remove-service=http              #阻止http端口
[root@localhost ~]# firewall-cmd --list-services                    #查看开放的服务
[root@localhost ~]# firewall-cmd --add-port=3306/tcp                #开放通过tcp访问3306
[root@localhost ~]# firewall-cmd --remove-port=80/tcp               #阻止通过tcp访问3306
[root@localhost ~]# firewall-cmd --add-port=233/udp                 #开放通过udp访问233
[root@localhost ~]# firewall-cmd --list-ports                       #查看开放的端口

端口转发:

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080                         #将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1.1               #将80端口的流量转发至192.168.1.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1:toport=8080     #将80端口的流量转发至192.168.1.1的8080

区域查询: 查询firewall服务当前所使用的区域.

[root@localhost ~]# firewall-cmd --get-default-zone
public

特定区域查询: 查看ens32网卡的所在区域信息.

[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public

修改默认区域: 修改ens32的public区域到external区域,并永久生效.

[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32 --permanent
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
external

设置默认区域: 把当前服务的默认区域设置为external.

[root@localhost ~]# firewall-cmd --get-default-zone
public
[root@localhost ~]# firewall-cmd --set-default-zone=external
success
[root@localhost ~]# firewall-cmd --get-default-zone
external

请求查询: 查询public区域是否允许请求SSH和HTTPS协议的流量.

[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@localhost ~]# firewall-cmd --zone=public --query-service=https
no

允许请求设置: 把public区域的https请求,永久允许通过.

[root@localhost ~]# firewall-cmd --zone=public --add-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --add-service=https --permanent
success

拒绝请求设置: 把public区域的https请求,设置为永久拒绝.

[root@localhost ~]# firewall-cmd --zone=public --remove-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanent
success

放行端口: 临时放行8080端口,和8081端口.

[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp

端口转发:192.168.1.0/24网络中的系统,访问本地端口5423将被转发到本地的80端口.

[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=5423 protocol=tcp to-port=80' --permanent

放行端口: 另一种放行方法放行本地的3260端口.

[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 port port=3260 protocol=tcp accept'

放行服务: 另一种方法,放行https服务数据包通过.

[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 service name=httpd accept'
[root@localhost ~]# firewall-cmd --list-rich-rule
rule family="ipv4" source address="192.168.1.0/24" service name="https" accept

其他服务:

# 允许/移除 192.168.1.10 所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" drop' --permanent
# 允许/移除 192.168.2.0/24(0-255)所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent

https://www.cnblogs.com/LyShark/archive/2020/01/31/12246632.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论