2020-11-20

			第十三章Linux系统管理技巧

13.1.1 使用w命令查看当前的系统负载

第1行从左至右显示的信息依次为:时间、系统运行时间、登录用户数、平均负载。
第2行开始的所有行则是告诉我们:当前登录的用户名及其登录地址等。
最应该关注第1行中的load average:后面的3个数值:
第1个数值表示1分钟内系统的平均负载值,
第2个数值表示5分钟内系统的平均负载值,
第3个数值表示15分钟内系统的平均负载值。我们着重看第1个值,它表示单位时间段内使用CPU的活动进程数(在这里其实就是1分钟内),值越大就说明服务器压力越大。一般情况下,这个值只要不超过服务器的CPU数量就没有关系。如果服务器的CPU数量为8,那么值小于8就说明当前服务器没有压力;否则就要关注一下了。
查看服务器有几个CPU的方法如下所示:

上例中,/proc/cpuinfo这个文件记录了CPU的详细信息。目前市面上的服务器有很多是2颗多核CPU,在Linux看来,它就是2*n个CPU(这里的n为单颗物理CPU上有几核)。假如n是4,则查看这个文件时会显示8段类似的信息,而最后一段信息的processor:后面会显示7。所以查看当前系统有几个CPU,我们可以使用命令grep-c‘processor'/proc/cpuinfo。然而查看有几颗物理CPU时,则需要查看关键字physical id。
13.1.2 用vmstat命令监控系统的状态

• procs显示进程的相关信息。
■ r(run):表示运行或等待CPU时间片的进程数。该数值如果长期大于服务器CPU的个数,则说明CPU资源不够用了。
■ b(block):表示等待资源的进程数,这个资源指的是/0、内存等。
• memory显示内存的相关信息。
■swpd:表示切换到交换分区中的内存数量,单位为KB。
■ free:表示当前空闲的内存数量,单位为KB。
■ buff:表示(即将写入磁盘的)缓冲大小,单位为KB。
■ cache:表示(从磁盘中读取的)缓存大小,单位为KB。
• swap显示内存的交换情况。
■ si:表示由交换区写入内存的数据量,单位为KB。
■so:表示由内存写入交换区的数据量,单位为KB。
• io显示磁盘的使用情况。
■ bi:表示从块设备读取数据的量(读磁盘),单位为KB。
■ bo:表示从块设备写入数据的量(写磁盘),单位为KB。
• system显示采集间隔内发生的中断次数。
■in:表示在某一时间间隔内观测到的每秒设备的中断次数。
■cs:表示每秒产生的上下文切换次数。
• cpu显示CPU的使用状态。
■ us:显示用户下所花费CPU的时间百分比。
■ sy:显示系统花费CPU的时间百分比。■ id:表示CPU处于空闲状态的时间百分比
• ■ wa:表示I/0等待所占用CPU的时间百分比。
■ st:表示被偷走的CPU所占百分比(一般都为0,不用关注)。
13.1.3 用top命令显示进程所占的系统资源

top命令用于动态监控进程所占的系统资源,每隔三秒变一次。它会把占用系统资源最高的进程放到最前面。RES为进程所占内存大小,%MEM为使用内存的百分比。在top状态下,按shift+m可以按照内存使用大小排序,按数字1可以列出所有核cpu的使用状态,按q退出top。
命令top -bn1,表示非动态打印系统资源的使用情况,一次性输出所有信息。可以用在shell脚本中。

13.1.4 用sar命令监控系统状态

1 查看网卡流量 sar -n DEV 命令

实时查看网卡流量 sar -n DEV 1 5

2 查看历史负载 sar -q

13.1.5 用nload查看网卡流量
系统默认没有安装,需要安装
#yum install -y epel-release; yum install -y nload

13.1.6 用free命令产看内存使用情况

 total:内存总大小。
 used:真正使用的实际内存大小。
 free:剩余物理内存大小(没有被分配,纯剩余)。
 shared:共享内存大小。
 buff/cache:分配给buffer和cache的内存总共有多大。
 available:系统可使用内存有多大,它包含了free。
其中,total=used+free+buff/cache。available是由free这部分内存和buff/cache还未被占用的那部分内存组成。
free -m:以mb为单位打印内存使用状况
free -g:以gb为单位打印内存使用状况
free -h:自动调节合适的单位显示。

13.1.7 用ps命令查看系统进程
ps与top相似,但是ps是专门显示系统进程的命令。ps aux与pa -elf显示的信息基本上是一样的。

 PID:表示进程的id。终止某个进程可以使用“kill 进程的pid”,强制终止可以使用“kill -9 进程的pid”
 STAT:进程的状态。进程状态分为以下几种:
D:不能中断的进程
R:正在运行的进程
S:已经中断的进程
s:主进程
T:已经停止或者暂停的进程
W:没有足够的内存页分配(内核2.6xx以后不可用)
X:已经死掉的进程
Z:僵尸进程,杀不掉打不死的垃圾进程
<:高优先级进程
N:低优先级进程
L:在内存中被锁了内存分页
l:多线程进程
+:在前台运行的进程,比如在当前终端执行ps aux就是前台进程。

ps连同管道符一起使用,用来查看某个进程或者它的数量。这里的3不准确,应该减掉1,因为使用grep命令时,grep命令本身也是一个进程,

13.1.8 用netstat命令查看网络状况
netstat命令用来打印网络连接状况,系统所开放端口,路由表等信息(安装net-tools)。
 打印网络连接状况netstat -an

 netstat -lnp打印当前系统启动哪些端口
上面一部分是tcp/ip,下面是监听的socket(unix开头的行)

 netstat -ntpl只看tcp的,不看socket

13.2 抓包工具
想查看某个网卡上都有哪些数据包,尤其当你初步判定服务器上由流量攻击时,使用抓包工具来抓取数据包就可以知道有哪些ip在攻击了
13.2.1 tcpdump工具
-i:选项后面跟设备名称
-nn:让第三列和第四列显示成“ip+端口号”的形式,不加-nn选项则显示“主机名+服务名称”
-c:指定抓包数量,抓够了自动退出

回车之后会一直刷屏,刷屏越快说明网卡上的数据包越多。我们只需要关注第三列和第四列,他们显示的信息为哪一个ip+端口号在连接哪一个ip+端口号。

 -c指定抓包数量:
 指定只抓22端口的包:

 指定抓tcp的包,但是不要22端口的:

 只抓22和53端口的包:

13.3.2 给一个网卡设定多个ip
设置过程如下:

要加上转义字符\把:转义,不然无法识别,然后编辑这个配置文件

改一下NAME,DEVICE,IPADDR,设置完毕重启网卡。查看网卡ip

13.3.3 查看网卡连接状态

这里显示link ok,说明网卡为连接状态。如果显示no link,说明网卡坏了或者没有连接网线。
除此之外,ethtool命令也可以查看网卡状态,如果网卡没有连接,最后一行link detected显示为no。

13.3.4 更改主机名
使用hostname命令可以查看主机名

使用如下命令更改主机名:

13.3.5 设置DNS
DNS是用来解析域名的,平时访问一个网站都是直接输入一个网址,而dns把这个网址解析到一个ip。在linux下设置dns只需要把dns地址写到配置文件/etc/resolv.conf中即可。

在定义网卡配置文件时,有一行是DNS1=114.114.114.114,就是因为这行配置,该配置文件里就有了nameserver的ip地址。resolv.conf有它固定的格式,一定要写成nameserver ip的格式。建议写两个或多个nameserver,系统默认使用第一个nameserver去解析域名,第一个解析不成功会使用第二个。
如果只是临时修改DNS IP地址,就直接修改/etc/resolv.conf;如果是永久生效的话,就要修改网卡的配置文件。
在linux下还有一个特殊文件/etc/hosts也能解析域名,我们需要在里面手动添加ip和域名这些内容。它的作用是临时解析某个域名,非常有用。

在下面添加一行192.168.188.1 www.baidu.com。保存文件后再ping一下www.baidu.com 就会连接到192.168.188.1了。
关于hosts文件,有几点需要注意:
 一个ip后面可以跟多个域名,可以是几十个甚至上百个。
 每一行只能有一个ip,也就是说一个域名不能对应多个ip。
 如果有多行中出现相同的域名(对应的ip不一样),会按照最前面出现的记录来解析。

13.4 linux的防火墙
13.4.1 SElinux
selinux是linux系统特有的安全机制,这种机制限制太多,配置繁琐,安装完系统,一般要关闭它。临时关闭selinux的方法为:

如果想要永久关闭需要更改配置文件/etc/selinux/config,需要把SELINUX=enforcing改成SELINUX=disabled。更改完该配置文件重启系统方可生效。可以使用getenforce命令获得当前selinux的状态。默认会输出enforcing,临时关闭selinux后在使用这个命令会输出permissive

13.4.2 netfilter
之前的centos版本的防火墙为netfilter,centos7的防火墙为firewalld。关闭firewalld,开启之前的iptables。
 关闭firewalld服务
 禁止firewalld服务开机启动
 安装iptables-services,这样就可以使用之前版本的iptables了
 让它开机启动
 启动iptables服务

现在就可以使用之前版本的iptables了,centos上默认没有iptables的规则,这个没啥用,反倒有影响,所以我们先清除规则,然后把清除后的规则保存一下。

-nvL表示查看规则,-F表示清除当前规则(临时清除),再使用service iptables save命令保存一下规则。

1.netfilter的5个表
 filter表主要用于过滤包,该表内建三个链:INPUT,OUTPUT,FORWARD。INPUT作用于进入本机的包,OUTPUT链作用于本机送出的包,FOEWARD作用于跟本机无关的包。
 nat表主要用于网络地址转换,有三个链:PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址(如果需要),OUTPUT链改变本地产生的包的目的地址,POSTROUTING链是在包即将离开防火墙时改变其源地址。
 mangle表主要用于给数据包做标记,然后根据标记去操作相应的包。
 raw表可以实现不追踪某些数据包
 security表用于强制访问控制(MAC)的网络规则
2.netfilter的5个链
 PREROUTING:数据包进入路由表之前
 INPUT:通过路由表后目的地为本机
 FOREARDING:通过路由表后,目的地不为本机
 OUTPUT:由本机产生,向外转发
 POSTROUTIONG:发送到网卡接口之前

3.iptables基本语法
(1)查看规则以及清除规则
-t:后面跟表名,如果不加,则打印filter表的相关信息
-nvL:查看该表的规则
-n:不针对ip反解析主机名
-L:表示列出
-v:表示列出的信息更加详细
-F:把所有规则全部删除,如果不加-t指定表,默认只清除filter表的规则
-Z:表示把包以及流量计数器置零

(2)增加/删除一条规则
-A/-D:表示增加/删除一条规则
-I:插入一条规则,与-A一样
-p:表示指定协议,可以是tcp,udp,icmp
–dport:必须跟-p一起用,表示指定目标端口
–sport:必须跟-p一起用,表示指定源端口
-s:表示指定源ip(可以是一个ip段)
-d:表示指定目的ip(可以是一个ip段)
-j:后面跟动作,其中ACCEPT表示允许包,DROP表示丢掉包,REJECT表示拒绝包。
-i:表示指定网卡

插入一条规则,把来自1.1.1.1的所有数据包丢掉:

删除刚刚插入的规则(删除规则时,必须和插入的规则一致,只有-I和-D不一样):

把来自2.2.2.2并且是tcp协议到本机80端口的数据包丢掉:

把发送到10.0.1.14的22端口的数据包丢掉:

把来自192.168.1.0/24这个网段且作用在eth0上的包放行:

想删除某条规则,但又不容易掌握创建时的规则,可以先查看iptables规则:

然后删除某一条规则,使用此命令:(-D后面依次跟链名,规则nmu号)

iptables -P表示预设策略,-P后面跟链名,策略内容或为DROP,或为ACCEPT(默认)。如果在连接远程服务器,执行这个命令会断开。策略一旦设定后,只有使用命令iptables -P INPUT ACCEPT才能恢复成原始状态。
#iptables -P INPUT DROP
如何设定iptables规则(例):
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.188.0/24开通22端口,对所有网段开放80端口,对所有网段开通21端口。
写成脚本形式:
#cat /usr/local/sbin/iptables.sh
#! /bin/bash
ipt=“/usr/sbin/iptables”
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -s 192.168.188.0/24 -p tcp –dport 22 -j ACCEPT
$ipt -A INPUT -p tcp –dport 80 -j ACCEPT
$ipt -A INPUT -p tcp –dport 21 -j ACCEPT
完成脚本编写后,直接运行/bin/sh /usr/local/sbin/iptables.sh即可。

关于icmp的包有一个常见的应用:

这里—icmp-type要跟-p icmp一起使用。这个8指的是能在本机ping通其他机器,二其他机器不能ping通本机。

4.nat表的应用
假设机器上有两块网卡eth0和eth1,其中eth0的ip为10.0.2.68,eth1的ip为192.168.1.1。eth0连接了因特网,eth1没有连接。有另一台机器(192.168.1.2)和eth1互通,如何设置才能让连接eth1的这台机器连接因特网,和10.0.2.68互通呢?
echo1 “1” > /proc/sys/net/ipv4/ip_forward //打开路由转发功能
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASOUERADE //对nat表做ip转发,-o选项后跟设备名,表示出口的网卡;MASOUERADE表示伪装

5.保存和备份iptables规则
咱们设定的防火墙规则只保存在内存中,没有保存到某个文件中,系统重启后以前设定的规则就没有了,所以设定好规则后要先保存:

有时需要清除防火墙的所有规则,可以使用iptables -F,但最好还是停止防火墙服务,防火墙就失效了,但是一旦重新设定规则,防火墙服务会自动开启,停止防火墙服务:
#service iptables stop
备份防火墙规则的方法:
#sh /usr/local/sbin/iptables.sh
#iptables-save > myipt.rule
先执行一下刚才的iptables脚本,将它重定向到一个文件里。想要恢复这些规则,使用命令:
#iptables-restore < myipt.rule

13.4.3 firewalld
关闭iptables,打开firewalld

firewalld有两个基础概念,分别是zone和service,每一个zone里面有不同的iptables规则,默认有九个zone,centos7默认的zone为public。获取系统所有的zone,命令如下:

查看系统默认的zone:

9个zone:
 drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
 block(限制):任何接收的网络连接都被IPv4的icmp-host-prohibited 信息和IPv6的icmp6-adm-prohibited信息所拒绝。
 public(公共):在公共区域内使用,不能相信网络内的其他计算机不会对你的计算机造成危害,只能接收经过选取的连接。
 external(外部):特别是为路由器启用了伪装功能的外部网。你不能信任来自网络的其他计算,不能相信它们不会对你的计算机造成危害,只能接收经过选择的连接。
 dmz(非军事区):用于你的非军事区内的计算机,此区域内可公开访问,可以有限地进入你的内部网络,仅仅接收经过选择的连接。
 work(工作):用于工作区。你可以基本相信网络内的其他计算机不会危害你的计算机。仅仅接受经过选择的连接。
 home(家庭):用于家庭网络。你可以基本信任网络内的其他计算机不会危害你的计算机。仅仅接收经过选择的连接。
 internal (内部):用于内部网络。你可以基本上信任网络内的其他计算机不会威胁你的计算机。仅仅接受经过选择的连接。
 trusted(信任):可接受所有的网络连接。

对于以上9个zone简单了解即可,阿铭相信你在日常工作中使用它们的机会不会太多。下面介绍 几个关于zone的命令:
设定默认的zone为work

查看指定网卡所在的zone

给指定网卡设置zone

针对网卡更改zone

针对网卡删除zone

查看系统所有网卡所在的zone

列出当前系统所有的service

13.5 Linux系统的任务计划
13.5.1 命令crontab
-u 表示指定某个用户,不加-u选项则为当前目录
-e 表示制定计划任务
-l 表示列出计划任务
-r 表示删除计划任务
创建一个任务:
#crontab -e编写内容:

这里每个字段的数字从左到右依次为:分、时、日、月、周和命令行。上例表 示在6月5日(这一天必须是星期三)的10点01分执行命令: echo “ok” > /root/cron.1og。
查看已经设定的任务计划使用crontab -l命令

删除任务计划要使用crontab -r命令,这个删除选项最好还是少用,因为它会- - 下子把全部计划 都删除掉。如果你想只删除一条计划, 可以使用-e选项进人crontab进行编辑。-e选项用法如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过Java中的日期时间类 `LocalDate` 和 `LocalDateTime` 来实现该功能。 首先,我们需要将时间段转换为 `LocalDateTime` 对象,然后将时间部分设置为 00:00:00 或 23:59:59,最后遍历每一天,获取每一天的开始时间和结束时间。 以下是代码示例: ```java import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class TimeUtils { public static void main(String[] args) { String startStr = "2020-11-20 09:09:09"; String endStr = "2021-10-09 10:10:10"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime start = LocalDateTime.parse(startStr, formatter); LocalDateTime end = LocalDateTime.parse(endStr, formatter); // 将时间部分设置为 00:00:00 或 23:59:59 LocalDateTime startOfDay = start.with(LocalTime.MIN); LocalDateTime endOfDay = end.with(LocalTime.MAX); // 遍历每一天,获取每一天的开始时间和结束时间 LocalDate startDate = startOfDay.toLocalDate(); LocalDate endDate = endOfDay.toLocalDate(); while (!startDate.isAfter(endDate)) { LocalDateTime startOfDayOfDate = startDate.atStartOfDay(); LocalDateTime endOfDayOfDate = startDate.atTime(LocalTime.MAX); System.out.println("Start time of " + startDate + ": " + startOfDayOfDate); System.out.println("End time of " + startDate + ": " + endOfDayOfDate); startDate = startDate.plusDays(1); } } } ``` 输出结果如下: ``` Start time of 2020-11-20: 2020-11-20T00:00 End time of 2020-11-20: 2020-11-20T23:59:59.999999999 Start time of 2020-11-21: 2020-11-21T00:00 End time of 2020-11-21: 2020-11-21T23:59:59.999999999 ... Start time of 2021-10-09: 2021-10-09T00:00 End time of 2021-10-09: 2021-10-09T23:59:59.999999999 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值