Linux系统日常管理

监控系统的状态:

w:查看当前系统负载:

Linux w命令用于显示目前登入系统的用户信息。

执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。

单独执行 w 指令会显示所有的用户,也可指定用户名称,仅显示某位用户的相关信息。

语法:w \[ - fhlsuV ][用户名称]

参数说明

  • -f (from): 开启或关闭显示用户从何处登入系统。
  • -h (no-header): 不显示各栏位的标题信息列。
  • -l : 使用详细格式列表,此为预设值。
  • -s (short): 使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
  • -i(ip-addr): 显示IP地址代替主机名。
  • -u(no-current):  忽略执行程序的名称,以及该程序耗费CPU时间的信息。
  • -V (version): 显示版本信息。

使用实例:

显示当前用户:

1
2
3
4
[root@cao ~]# w  //显示当前用户,不显示登录位置
21:55:19 up 16:33, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
hadoop pts/1 192.168.171.1 21:50 7.00s 0.08s 0.26s sshd: hadoop [priv

第一行从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载。第二行开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪里登录的等等。

我们最应该关注的应该是第一行中的 ‘load average:’ 后面的三个数值。

第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值。这个值的意义是,单位时间段内CPU活动进程数。当然这个值越大就说明服务器压力越大。一般情况下这个值只要不超过服务器的cpu数量就没有关系,如果服务器cpu数量为8,那么这个值若小于8,就说明当前服务器没有压力,否则就要关注一下了。

查看cpu信息:

可通过cat /proc/cpuinfo 查看cpu的信息。

可以使用这个命令: grep -c 'processor' /proc/cpuinfo 而如何看几颗物理cpu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@cao ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
stepping : 3
microcode : 0xba
cpu MHz : 2400.002
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes

不显示登录位置:

1
2
3
4
[root@cao ~]# w -f
21:56:47 up 16:34, 1 user, load average: 0.00, 0.01, 0.05
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
hadoop pts/1 21:50 7.00s 0.08s 0.26s sshd: hadoop [priv]

以精简模式显示:

1
2
3
4
[root@cao ~]# w -s
21:57:27 up 16:35, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM IDLE WHAT
hadoop pts/1 192.168.171.1 7.00s sshd: hadoop [priv]

vmstat监控系统的状态:

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、IO读写、CPU活动等进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

语法:vmstat(选项)(参数)

选项:

-a(active):显示活动内页;
-f(forks):显示启动后创建的进程总数;
-m(slabs):显示slab信息;
-n(one-header):头信息仅显示一次;
-s(stats):以表格方式显示事件计数器和内存状态;
-d(disk):报告磁盘状态;
-p(partition):显示指定的硬盘分区状态;
-S(unit):输出信息的单位。

参数

(delay)事件间隔:状态信息刷新的时间间隔;

(count)次数:显示报告的

使用实例:

不加任何参数。vmstat命令只输出一条记录,这个数据是自系统上次重启之后到现在的平均数值。

1
2
3
4
[root@cao ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 795972 2116 612752 0 0 2 1 20 18 0 0 100 0 0

字段说明:

Procs(显示进程相关信息)

  • r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
  • b:表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了;

Memory(内存相关信息)

  • swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
  • free: 空闲物理内存大小。
  • buff: 用作缓冲的内存大小,(即将写入磁盘的)。
  • cache: 用作缓存的内存大小,(从磁盘中读取的);如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap(内存交换情况)

  • si: 每秒从交换区写到内存的大小,由磁盘调入内存。
  • so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)磁盘使用情况

  • bi: 每秒读取的块数
  • bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统 显示采集间隔内发生的中断次数)

  • in: 每秒中断数,包括时钟中断。
  • cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

  • us: 用户进程执行时间百分比(user time)

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

  • sy: 内核系统进程执行时间百分比(system time)

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

  • wa: IO等待时间百分比

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

  • id: 空闲时间百分比

一般关注r b si so bi bo wa

使用 vmstat 查看系统状态的时候,通常都是使用这样的形式来看的:

1
[root@localhost ~]# vmstat 1 5

或者:

1
[root@localhost ~]# vmstat 1

前面表示,每隔一秒钟打印一次状态,共打印5次,而后面的表示每隔1秒打印一次状态,一直打印,除非我们按 Ctrl + c 结束。

显示活动与非活动的内存:

vmstat -a

图:显示活动与非活动的内存

显示各种事件计数器表和内存统计信息,这显示不重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@cao ~]# vmstat -s
1865308 K total memory
454440 K used memory
500496 K active memory
285084 K inactive memory
796020 K free memory
2116 K buffer memory
612732 K swap cache
2097148 K total swap
0 K used swap
2097148 K free swap
8641 non-nice user cpu ticks
73 nice user cpu ticks
24467 system cpu ticks
24617409 idle cpu ticks
1999 IO-wait cpu ticks
0 IRQ cpu ticks
814 softirq cpu ticks
0 stolen cpu ticks
528466 pages paged in
159234 pages paged out
0 pages swapped in
0 pages swapped out
5039370 interrupts
4392272 CPU context switches
1530566527 boot time
21873 forks

top显示进程所占系统资源:

top命令用于实时显示 process 的动态。

语法

1
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

参数说明

  • d(delay time) : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s。
  • q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行。
  • c(commadn line) : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来。
  • s(Secure mode) : 安全模式,将交谈式指令取消, 避免潜在的危机。
  • i (Idle tasks): 不显示任何闲置 (idle) 或无用 (zombie) 的行程。
  • n : 更新的次数,完成后将会退出 top
  • b (Bold hilite): 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内

这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统资源(CPU,内存,磁盘IO等)最高的进程放到最前面。top命令打印出了很多信息,包括系统负载(loadaverage)、进程数(Tasks)、cpu使用情况、内存使用情况以及交换分区使用情况。其实上面这些内容可以通过其他命令来查看,所以用top重点查看的还是下面的进程使用系统资源详细状况。这部分东西反映的东西还是比较多的,不过需要您关注的也就是几项:%CPU, %MEM, COMMAND 这些项目所代表的意义,RES 这一项为进程所占内存大小,而 %MEM 为使用内存百分比。在 top 状态下,按 “shift + m”, 可以按照内存使用大小排序。按数字 ‘1’ 可以列出各颗cpu的使用状态。

top

图:top命令显示结果

以累积模式显示程序信息

1
# top -S

设置信息更新次数

1
2
3
top -n 2

//表示更新两次后终止更新显示

设置信息更新时间

1
2
3
# top -d 3

//表示更新周期为3秒

显示指定的进程信息

1
2
3
# top -p 139

//显示进程号为139的进程信息,CPU、内存占用率等

显示更新十次后退出

1
top -n 10

将更新显示二次的结果输入到名称为 top.log 的档案里

1
top -n 2 -b < top.log

常用的一个命令 top -bn1 它表示非动态打印系统资源使用情况,可以用在shell脚本中.

sar 监控系统状态:

sar (System Activity Reporter系统活动情况报告)命令很强大,它可以监控系统所有资源状态,比如平均负载、网卡流量、磁盘状态、内存使用等等。它不同于其他系统状态监控工具的地方在于,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。如果您系统没有安装这个命令,请使用 yum install -y sysstat 命令安装。初次使用sar命令会报错,那是因为sar工具还没有生成相应的数据库文件(时时监控就不会了,因为不用去查询那个库文件)。它的数据库文件在 “/var/log/sa/” 目录下,默认保存一个月。

语法:sar [ 选项 ][ <时间间隔> [ <次数> ] ]

常用选项:

-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。

-A:所有报告的总和

-u:输出CPU使用情况的统计信息

-v:输出inode、文件和其他内核表的统计信息

-d:输出每一个块设备的活动信息

-r:输出内存和交换空间的统计信息

-b:显示I/O和传送速率的统计信息

-q:查看历史负载

-a:文件读写情况

-c:输出进程统计信息,每秒创建的进程数

-R:输出内存页面的统计信息

-y:终端设备活动情况

-w:输出系统交换活动信息

-n :报告网络状态。

使用实例:

查看网卡流量:sar -n DEV,这是显示流量历史。可通过sar -n DEV 1 5 查看实时流量。

sar -n

图:查看网卡流量信息

IFACE这列表示设备名称,rxpck/s 表示每秒进入收取的包的数量,txpck/s 表示每秒发送出去的包的数量,rxbyt/s 表示每秒收取的数据量(单位Byte),txbyt/s表示每秒发送的数据量。后面几列不需要关注。如果有一天所管理的服务器丢包非常严重,那么就应该看一看这个网卡流量是否异常了,如果rxpck/s 那一列的数值大于4000,或者rxbyt/s那列大于5,000,000则很有可能是被攻击了,正常的服务器网卡流量不会高于这么多,除非是自己在拷贝数据。

另外也可以使用命令 sar -n DEV -f /var/log/sa/sa24 查看看某一天的网卡流量历史,使用-f选项,后面跟文件名,如果系统是Redhat或者CentOS那么sar的库文件一定是在/var/log/sa/目录下的。

CPU资源监控:

例如,每3秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令:sar -u -o test 3 3

sar -u

图:sar -u查看cpu使用情况

输出项说明:

CPU:all 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

如果要查看二进制文件test中的内容,需键入如下sar命令:

sar -u -f test

内存和交换空间监控:

例如,每3秒采样一次,连续采样3次,监控内存分页:

sar -r

图:内存信息

输出项说明:

kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.

kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

free查看内存使用状况:

free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

语法:free [-bkmotV][-s <间隔秒数>]

参数说明

-b (bytes): 以Byte为单位显示内存使用情况。

-k (Kilo): 以KB为单位显示内存使用情况。

-m (mega): 以MB为单位显示内存使用情况。

-s<间隔秒数>  持续观察内存使用状况。

-h(human):以可阅读的方式显示。

-t (total): 显示内存总和列。

-V(version):  显示版本信息。

使用示例:

显示内存使用情况:

free -h

图;内存使用情况

以总和的形式显示内存使用信息:

free -t

图:以总和的形式显示内存信息

ps查看系统进程:

ps命令用于显示当前进程 (process) 的状态。

语法:ps [options]

常用的参数解释:

  • -A(all): 列出所有的行程
  • -w 显示加宽可以显示较多的资讯
  • -au 显示较详细的资讯
  • -aux 显示所有包含其他使用者的行程
  • au(x) 输出格式 :
  • USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的记忆体使用率
  • VSZ: 占用的虚拟记忆体大小
  • RSS: 占用的记忆体大小
  • TTY: 终端的次要装置号码 (minor device number of tty)
  • STAT: 该行程的状态:
    • D: 不可中断的进程 (通常为IO)
    • R: 正在执行中
    • S: 已经中断的进程,通常情况下,系统中大部分进程都是这个状态
    • s :主进程
    • l: 多线程进程
    • T: 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10 如果我们按一下ctrl -z
      让他暂停,那么我们用ps查看就会显示T这个状态
    • Z: 不存在但暂时无法消除。僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。
    • W: 没有足够的记忆体分页可分配
    • <: 高优先序的行程
    • N: 低优先序的行程
    • L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
    • + 代表在前台运行的进程
  • START: 行程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令

使用示例:

查看系统的进程信息:

可以使用ps -aux 或者 ps -elf 查看。

pa -aux

图:查看系统所有的进程

PID:进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程,如果想终止某一个进程,则用 ‘kill 进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill -9 进程pid

显示指定用户的进程信息:

ps -u root //只显示root用户的信息

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# 
[root@localhost ~]# ps -u root
PID TTY TIME CMD
1 ? 00:00:03 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:01 rcu_sched
10 ? 00:00:00 lru-add-drain
11 ? 00:00:00 watchdog/0

连同管道符使用,可以查看某个进程的数量:

ps -grep

图:查看进程

在查看进程个数时要减1,因为使用grep命令时,grep命令本身也算一个。

netstat查看网络状况:

netstat命令用来打印网络连接状况、系统所开放端口、路由表等信息。

语法:netstat 参数

常用参数:

-a(all): 显示所有连线中的Socket。

-l(listening): 显示监控中的服务器的Socket。

-n(numeric):直接使用IP地址,而不通过域名服务器。

-p(programs): 显示正在使用Socket程序识别码和程序名称。

使用示例:

打印当前系统启动哪些端口:netstat -lnp(常用)

netstat -lnp

图:打印当前系统启动的端口号

打印网络连接状况:netstat -an(常用):

netstat -an

图:显示网络连接状况

显示网络统计信息:netstat -s.

抓包工具tcpdump:

常用的命令:tcpdump -nn -i eth0

-n:对地址以数字方式显示,否则显示为主机名。就是不做主机名解析。

-nn:除了-n的作用外,还把端口号显示为数值,否则显示端口服务名。

-i(interface):指定要监听的接口。

-c:指定要包的数量。

Linux网络相关:

ifconfig查看网卡IP:

ifconfig类似与windows的ipconfig,不加任何选项和参数只打印当前网卡的IP相关信息(子网掩码、网关等)。

在Linux设置IP需要去修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0了,如果是eth1那么配置文件是/etc/sysconfig/network-scripts/ifcfg-eth1.

如果Linux上有多个网卡,而只想重启某一个网卡的话,可以使用这个命令:

1
[root@localhost ~]# ifdown eth0; ifup eth0

ifdown 即停掉网卡,ifup即启动网卡。有一点要提醒的是,如果我们远程登录服务器,当使用ifdown eth0这个命令的时候,很有可能后面的命令ifup eth0不会被运行,这样导致我们断网而无法连接服务器,所以请尽量使用 service network restart 这个命令来重启网卡。

给一个网卡设置多个IP:

在linux系统中,网卡是可以设定多重IP的。

1
2
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33\:1

然后编辑ifcfg-ens33:1 这个配置文件,内容如下,一定要注意 DEVICE 这里要写成 “ens33:1”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost network-scripts]# cat ifcfg-ens33:1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.171.129
NETMASK=255.255.255.0
GATEWAY=192.168.1.255
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33:1
UUID=60370590-730b-4981-b6e0-9aa43074b522
DEVICE=ens33:1
ONBOOT=yes

编辑好后,重启网卡:

ifdown ens33:1 && ifup ens33:1

然后查看网卡ip:

多ip

图:多个IP

查看网卡连接状态:

1
2
3
4
5
[root@localhost network-scripts]# mii-tool ens33
ens33: negotiated 1000baseT-FD flow-control, link ok
[root@localhost network-scripts]# mii-tool ens33:1
ens33:1: negotiated 1000baseT-FD flow-control, link ok
[root@localhost network-scripts]# mii-tool lo

只要看到 “link ok” 就说明网卡为连接状态,如果显示 “no link” 说明网卡坏掉了或者没有连接网线。

更改主机名:

当装完系统后,默认主机名为localhost,使用hostname就可以知道linux的主机名是什么:同样使用hostname可以更改主机名。

不过这样的更改只是保存在内存中,重启后,还会失效。所需要去配置文件:etc/sysconfig/network

1
2
3
4
5
6
[root@cao ~]# hostname
cao
[root@cao ~]# cat /etc/sysconfig/network
# Created by anaconda
NETWORK=yes
HOSTNAME=cao.localdomain

设置DNS:

在配置文件etc/resolv.conf 中写入dns地址即可。

1
2
3
4
5
[root@localhost ~]# cat /etc/resolv.conf 
; generated by /usr/sbin/dhclient-script
search localdomain
nameserver 192.168.171.2
[root@localhost ~]#

resolv.conf有它固有的格式,一定要写成 “nameserver IP” 的格式,上面那行以 ‘;’ 为开头的行是一行注释,没有实际意义,建议写两个或多个namserver
,默认会用第一个namserver去解析域名,当第一个解析不到时会使用第二个。在linux下面有一个特殊的文件/etc/hosts也能解析域名,不过是需要我们手动在里面添加IP+域名这些内容,它的作用是临时解析某个域名,非常有用。

1
2
3
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

/etc/hosts 的格式很简单,每一行作为一条记录,分成两部分,第一部分是IP,第二部分是域名。关于hosts文件,有几点需要注意:

1)一个IP后面可以跟多个域名,可以是几十个甚至上百个;

2)每行只能有一个IP,也就是说一个域名不能对应多个IP;

3)如果有多行中出现相同的域名(前面IP不一样),会按最前面出现的记录来解析。

Linux的防火墙:

selinux:

Selinux是Redhat/CentOS系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁琐所以几乎没有人去真正应用它。所以装完系统,我们一般都要把selinux关闭,以免引起不必要的麻烦。关闭selinux的方法为,使
“SELINUX=disabled”, 默认为 enforcing

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

将enforcing修改为disabled后,保存。重启机器方可生效。临时关闭selinux的命令为:setenforce 0, 可以使用fetenforce 来获取当前selinux的状态。

iptables:

Iptables是linux上特有的防火墙机制,其功能非常强大。

语法: iptables(选项)(参数)

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-t(table)<表>:指定要操纵的表;
-A(append):向规则链中添加条目;
-D(delete):从规则链中删除条目;
-i(insert):向规则链中插入条目;
-R(replace):替换规则链中的条目;
-L(list):显示规则链中已有的条目;
-F(flush):清除规则链中已有的条目;
-Z(zero):清空规则链中的数据包计算器和字节计数器;
-N(new):创建新的用户自定义规则链;
-P(policy):定义规则链中的默认目标;
-h(help):显示帮助信息;
-p(protocol):指定要匹配的数据包协议类型;
-s(source):指定要匹配的数据包源ip地址;
-j(jump target)<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口

iptables命令选项输入顺序:

1
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

表名包括:

  • raw:高级功能,如:网址过滤。
  • mangle:数据包修改(QOS),用于实现服务质量。
  • net:地址转换,用于网关路由器。
  • filter:包过滤,用于防火墙规则。

规则链名包括:

  • INPUT链:处理输入数据包。
  • OUTPUT链:处理输出数据包。
  • PORWARD链:处理转发数据包。
  • PREROUTING链:用于目标地址转换(DNAT)。
  • POSTOUTING链:用于源地址转换(SNAT)。

动作包括:

  • accept:接收数据包。
  • DROP:丢弃数据包。
  • REDIRECT:重定向、映射、透明代理。
  • SNAT:源地址转换。
  • DNAT:目标地址转换。
  • MASQUERADE:IP伪装(NAT),用于ADSL。
  • LOG:日志记录。

CentOS上默认是设有iptables规则的,这个规则虽然很安全,但是对于我们来说没有用,反而会造成某些影响,所以建议先清除规则,然后把清除后的规则保存一下。

使用示例:

清除已有的iptables规则:

1
2
3
iptables -F
iptables -X
iptables -Z

开放指定的端口

1
2
3
4
5
6
7
8
9
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问

屏蔽IP

1
2
3
4
iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是

查看已添加的iptables规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0

删除已添加的iptables规则

将所有iptables以序号标记显示,执行:

1
iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

1
iptables -D INPUT 8

Linux系统的任务计划:

定时任务(cron job)被用于安排那些需要被周期性执行的命令。关于cron任务计划功能的操作都是通过crontab这个命令来完成的。crontab 是用来安装、卸载或者列出定时任务列表的命令。其中常用的选项有:

-u :指定某个用户,不加-u选项则为当前用户;

-e :制定计划任务;

-l :列出计划任务;

-r :删除计划任务。

创建一个任务计划:

1
2
[root@localhost ~]# crontab -e
no crontab for root - using an empty one

使用 crontab -e 来进行编写任务计划,这实际上是使用vim工具打开了crontab的配置文件,我们写下如下内容:

1
01 10 05 06 3 echo "ok" > /root/cron.log

每个字段的数字分表表示什么呢?从左到右,依次为:分,时,日,月,周,命令行。而上面的例子的含义是:在6月5日(这一天必须是星期3)的10点01分执行命令 echo "ok" > /root/cron.log

crontab -e 实际上是打开了 “/var/spool/cron/username” (如果是root则打开的是/var/spool/cron/root)这个文件。使用的是vim编辑器,所以要保存的话则在命令模式下输入:wq即可。但是,您千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用 crontab -e 来编辑。查看已经设定的任务计划使用 crontab -l 命令:

1
2
[root@localhost ~]# crontab -l
01 10 05 06 3 echo "ok" > /root/cron.log

删除计划任务要用 crontab -r

1
2
3
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
20 1 * * *  echo "" >/var/log/slow.log
#每天凌晨1点20分清除/var/log/slow.log这个文件

0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh
#每周日3点执行 “/bin/sh /usr/local/sbin/backup.sh”

10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh
#每月14号4点10分执行 “/bin/sh /usr/local/sbin/backup_month.sh”

0 */8 * * * ntpdate time.windows.com
#每隔8小时执行 “ntpdate time.windows.com”

0 1,12,18 * * /bin/sh /usr/local/sbin/test.sh
#每天的1点,12点,18点执行 “/bin/sh /usr/local/sbin/test.sh”

0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh
#每天的9点到18点执行 “/bin/sh /usr/local/sbin/test2.sh”

可通过serfvice crond status 查看crond服务是否启动。如果没启动通过service crond start 来启动。

Linux的系统服务管理:

如果对windows非常熟悉的话,肯定配置过开机启动的服务,有些服务我们日常用不到则要把它停掉,一来可以节省资源,二来可以减少安全隐患。在linux上同样也有相关的工具来管理系统的服务。

ntsysv服务配置工具:

什么是ntsysv呢?ntsysv -> NeWT + SysV ,它是使用 newt 库的 SysV 风格的 runlevel 配置工具,Red Hat公司遵循GPL规则所开发的程序,它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,设置系统的各种服务。

直接运行命令 ntsysv 回车后弹出一个配置界面:

ntsysv

图:管理界面

按键盘的上下方向键可以调节红色光标,按空格可以选择开启或者不开启,如果前面的中括号内显示有 * 则表示开启否则不开启。通过这个工具也可以看到目前系统中所有的服务。建议除 “crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl” 外其他服务全部停掉。选择好后,按 “tab” 键选择 “确定”, 然后回车,需要重启机器才能生效。

chkconfig服务管理工具:

chkconfig是管理系统服务(service)的命令行工具。所谓系统服务(service),就是随系统启动而启动,随系统关闭而关闭的程序。

chkconfig可以更新(启动或停止)和查询系统服务(service)运行级信息。更简单一点,chkconfig是一个用于维护/etc/rc[0-6].d目录的命令行工具。

Linux系统所有的预设服务可以查看/etc/init.d/目录得到:

1
2
[root@localhost init.d]# ls
functions iptables netconsole network README

其实这就是系统所有的预设服务了。为什么这样讲,因为系统预设服务都是可以通过这样的命令实现 service 服务名 start|stop|restart
这里的服务名就是/etc/init.d/目录下的这些文件了。除了可以使用 service crond start 启动crond外,还可以使用 /etc/init.d/crond start 来启动。

可使用chkconfig --list 列出所有的服务及每个级别是否开启:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost init.d]# chkconfig --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。

要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。

netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关

这里的级别(0,1,2,3,4,5,6)就是 /etc/inittab 里面的那几个启动级别了,0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;在一般的Linux系统实现中,都使用了2、3、4、5几个级别,在CentOS系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示图形登录方式。我们可以使用grep命令把我们想要看的服务过滤出来。

更改每个级别是否开启:

--level 指定级别,后面是服务名,然后是off或者on,–level` 后还可以跟多个级别:另外还可以省略级别,默认是针对2,3,4,5级别操作:

1
2
3
[root@localhost init.d]# chkconfig --level 2 network off
[root@localhost init.d]# chkconfig --list | grep network
network 0:关 1:关 2:关 3:开 4:开 5:开 6:关

chkconfig 还有一个功能就是可以把某个服务加入到系统服务,即可以使用 service 服务名 start 这样的形式,并且可以在 chkconfig --list 中查找到。当然也能删除掉:

1
chkconfig --del 服务名

Linux系统日志:

日志主要的功能有:审计和监测,还可以实时的监测系统状态,监测和追踪侵入者等等。

常查看的日志文件为/var/log/message, 它是核心系统日志文件,包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息,比如某个人的身份切换为root以及用户自定义安装的软件(apache)的日志也会在这里列出。通常,/var/log/messages是在做故障诊断时首先要查看的文件。同时系统有一个日志轮询的机制,每星期切换一个日志,变成message.xxxxxxxx,
message.xxxxxxxx, … messages.xxxxxxxx 连同messages一共有5个这样的日志文件。这里的xxxxxxxx就是按照日期的格式生成的文件,在CentOS5里,这个后缀并不是日期而是数字1,2,3,4. 这是通过logrotate工具的控制来实现的,它的配置文件是/etc/logrotate.conf如果没有特殊需求请不要修改这个配置文件。

/var/log/messages是由syslogd这个守护进程产生的,如果停掉这个服务则系统不会产生/var/log/messages,所以这个服务不要停。Syslogd服务的配置文件为/etc/syslog.conf这个文件定义了日志的级别。

除了关注/var/log/messages外,还应该多关注一下 dmesg 这个命令,它可以显示系统的启动信息,如果某个硬件有问题(比如说网卡)用这个命令也是可以看到的。

命令last:查看登录Linux历史信息

1
2
3
4
5
[root@localhost log]# last | head -n4
hadoop pts/2 192.168.171.1 Thu Jul 5 20:43 still logged in
hadoop pts/1 92.168.171.1 Thu Jul 5 17:37 still logged in
hadoop pts/2 192.168.171.1 Thu Jul 5 17:28 - 17:28 (00:00)
root pts/1 192.168.171.1 Thu Jul 5 16:05 - 17:37 (01:32)

last命令用来查看登录Linux历史信息,从左至右依次为账户名称、登录终端、登录客户端ip、登录日期及时长。last命令输出的信息实际上是读取了二进制日志文件/var/log/wtmp, 只是这个文件不能直接使用cat, vim, head, tail等工具查看。

另外一个和登陆信息有关的日志文件为/var/log/secure, 该日志文件记录验证和授权等方面的信息,比如ssh登陆系统成功或者失败,都会把相关信息记录在这个日志里。

xargs与exec:

xargs应用:

1
2
3
[root@localhost ~]# echo "121212121" > 123.txt
[root@localhost ~]# ls 123.txt | xargs cat
121212121

xargs的作用就是把管道符前面的输出作为xargs后面的命令的输入它的好处在于可以把本来两步或者多步才能完成的任务简单一步就能完成。xargs常常和find命令一起使用,比如,查找当前目录创建时间大于10天的文件,然后再删除。[root@localhost ~]# find . -mtime +10 |xargs rm

现在有一个这样的需求,查找当前目录下所有.txt的文件,然后把这些.txt的文件变成.txt_bak。正常情况下,我们不得不写脚本去实现,但是使用xargs就一步。

1
2
3
4
5
6
7
8
[root@localhost ~]# ls
123.txt Desktop Downloads Pictures Templates Videos
abc.txt Documents Music Public test.txt
[root@localhost ~]# ls *.txt | xargs -n1 -i{} mv {} {}_bak
[root@localhost ~]# ls
123.txt_bak Desktop Downloads Pictures Templates Videos
abc.txt_bak Documents Music Public test.txt_bak
[root@localhost ~]#

xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{}把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak。

exec应用:

使用find命令时,经常使用一个选项就是这个-exec了,可以达到和xargs同样的效果。比如,查找当前目录创建时间大于10天的文件并删除:

1
[root@localhost ~]# find . -mtime +10 -exec rm -rf {} \;

这个命令中也是把{}作为前面find出来的文件的替代符,后面的 \; 的脱意符,不然shell会把分号作为该行命令的结尾。这个-exec有时候也挺实用的,它同样可以实现刚刚上面批量更改文件名的需求:

1
2
3
4
5
[root@localhost test]# ls
1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak 5.txt_bak
[root@localhost test]# find ./*_bak -exec mv {} {}_bak \;
[root@localhost test]# ls
1.txt_bak_bak 2.txt_bak_bak 3.txt_bak_bak 4.txt_bak_bak 5.txt_bak_bak

screen工具介绍:

有时候,我们也许会有这样的需求,要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?可以把命令或者脚本丢到后台运行,不过也不保险。可以使用下面的两种方法来解决:

1. 使用nohup

1
2
3
4
5
6
[root@localhost ~]# cat /usr/local/sbin/sleep.sh
#! /bin/bash
sleep 1000
[root@localhost ~]# nohup sh /usr/local/sbin/sleep.sh &
[1] 19997
[root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"

直接加一个 ‘&’ 虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在前面加上 nohup 就没有问题了,nohup的作用就是不挂断地运行命令。

2. screen工具的使用

简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的SSH连接窗口那样。

1)打开一个会话,直接输入screen命令然后回车,进入screen会话窗口。如果你没有screen命令,请用 yum install -y screen 安装。

1
2
[root@localhost ~]# screen
[root@localhost ~]#

2)screen -ls 查看已经打开的screen会话

1
2
3
4
[root@localhost ~]# screen -ls
There is a screen on:
20001.pts-0.localhost (Attached)
1 Socket in /var/run/screen/S-root.

3)Ctrl +a 再按d退出该screen会话,只是退出,并没有结束。结束的话输入Ctrl +d 或者输入exit

4)退出后还想再次登录某个screen会话,使用screen -r [screen 编号],这个编号就是上例中那个20001. 当只有一个screen会话时,后面的编号是可以省略的。当有某个需要长时间运行的命令或者脚本时就打开一个screen会话,然后运行该任务。按ctrl +a 再按d退出会话,不影响终端窗口上的任何操作。


坚持原创技术分享,您的支持将鼓励我继续创作!