Linux入门到精通
一、绪论
1.1、简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
常见市面的Linux操作系统有redhat、centos、ubuntu、Fedora等等
1.2、启动过程
1、BIOS
BIOS(Basic Input/Output System),基本输入输出系统,计算机开机的时候,细心的童鞋可能会发现这个单词。该系统存储于主板的ROM芯片上,计算机在开机时,最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。详细的BIOS功能,这边就不说了,BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。
主要检查:主板,CPU,内存,磁盘,网卡,声卡,显卡,鼠标,键盘,显示器等
2、MBR
MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。
3、GRUB
GRUB(Grand Unified Bootloader),多系统启动程序,其执行过程可分为三个步骤:
Stage1:这个其实就是MBR,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
Stage1_5:该步骤就是为了识别文件系统
Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
4、Kernel
Kernel,内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。讲内核启动,应该先讲下initrd这个文件,initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。
Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。
5、Init
init,初始化,顾名思义,该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):
1、激活udev和selinux;2、根据/etc/sysctl.conf文件,来设定内核参数;3、设定系统时钟;4、装载硬盘映射;5、启用交换分区;6、设置主机名;7、根文件系统检测,并以读写方式重新挂载根文件系统;8、激活RAID和LVM设备;9、启用磁盘配额;10、根据/etc/fstab,检查并挂载其他文件系统;11、清理过期的锁和PID文件
执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。
6、Runlevel
runlevel,运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种
-
0:关机模式
-
1:单一用户模式(直接以管理员身份进入)
-
2:多用户模式(无网络)
-
3:多用户模式(命令行)
-
4:保留
-
5:多用户模式(图形界面)
-
6:重启
7、用户登录
一般来说,用户的登录方式有三种:
(1)命令行登录
(2)ssh登录
(3)图形界面登录
这三种情况,都有自己的方式对用户进行认证。
(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(linux还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序(linux还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
8、进入 login shell
linux默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。
(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。
~/.bash_profile
~/.bash_login
~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。
(2)ssh登录:与第一种情况完全相同。
(3)图形界面登录:只加载 /etc/profile 和 /.profile。也就是说,/.bash_profile 不管有没有,都不会运行。
二、时间同步
2.1、chrony
1、ntp服务器搭建
yum -y install chrony
vi /etc/chrony.conf
....
#server用户客户端指向,上层NTP服务器
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
....
#允许那个IP或网络访问NTP
allow 192.168.0.0/16
#拒绝那个IP或网络访问NTP
deny 192.169.0.0/16
#设置NTP服务器的层数量
local stratum 10
....
2、启动
systemctl restart chronyd
systemctl enable chronyd
3、客户端
yum -y install chrony
vi /etc/chrony.conf
server 192.168.110.237 iburst
systemctl restart chronyd
systemctl enable chronyd
2.2、ntpdate
1、安装工具
yum -y install ntp ntpdate
2、同步网络时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
# 加入到crontab
*/5 * * * * /usr/sbin/ntpdate time2.aliyun.com
2.3、国内好用时间服务器
cn.ntp.org.cn #中国
edu.ntp.org.cn #中国教育网
ntp1.aliyun.com #阿里云
ntp2.aliyun.com #阿里云
cn.pool.ntp.org #最常用的国内NTP服务器
三、磁盘分区
分区方式
- fdisk
分区大小范围1-2T - parted
不限制
3.1、fdisk
fdisk分区工具用来建立msdos分区方案,其交互模式中的主要指令如下:
- m:列出指令帮助
- p:查看当前的分区表信息
- n:新建分区
- d:删除分区
- t:更改分区标识
- q:放弃分区更改并退出
- w:保存对分区表所做的更改
命令:
fdisk /dev/sdb
提示:
最大分区只能为2TB,大于2TB需要用parted
3.2、parted
交互
[root@localhost ~]# parted /dev/sdb # 使用parted来对GPT磁盘操作,进入交互式模式
GNU Parted 1.8.1 Using /dev/sdb Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) mklabel gpt # 将MBR磁盘格式化为GPT
(parted) print #打印当前分区
(parted) mkpart primary 0 4.5TB # 分一个4.5T的主分区
(parted) mkpart primary 4.5TB 12TB # 分一个7.5T的主分区
(parted) print #打印当前分区
(parted) quit 退出
Information: Don’t forget to update /etc/fstab, if necessary.
1
非交互
parted /dev/sdb mklabel gpt (新硬盘sdb 使用mklabel改变磁盘为gpt)
parted /dev/sdb mkpart primary 0 2048000 (分区2T,起始0开始到结束大小m)
parted /dev/sdb mkpart primary 2048001 4096000
parted /dev/sdb p (查看)
3.3、格式化
#格式化已经分好的区
mkfs.ext4 /dev/sdb1
mkfs.xfs /dev/sdb1
#挂载
mount /dev/sdb1 /mnt
四、逻辑卷LVM
- 命令
LVM创建工具的基本用法
vgcreate 卷组名 物理设备.. ..
lvcreate -L 大小 -n 逻辑卷名 卷组名
4.1、创建卷组
1)新建名为systemvg的卷组
vgcreate systemvg /dev/vdb1
2)确认结果
vgscan
4.2、创建逻辑卷
1)新建名为vo的逻辑卷
lvcreate -L 180MiB -n vo systemvg
2)确认结果
lvscan
4.3、格式化及挂载使用
1)格式化逻辑卷/dev/systemvg/vo
mkfs.ext4 /dev/systemvg/vo
2)挂载逻辑卷/dev/systemvg/vo
mount /dev/systemvg/vo
4.4、扩展逻辑卷的大小
1、确认逻辑卷vo的信息
1)找出逻辑卷所在卷组
lvscan
2)查看该卷组的剩余空间是否可满足扩展需要
vgdisplay systemvg
2、扩展卷组
1)将提前准备的分区/dev/vdb5添加到卷组systemvg
vgextend systemvg /dev/vdb5
2)确认卷组新的大小
vgdisplay systemvg
3、扩展逻辑卷大小
1)将逻辑卷/dev/systemvg/vo的大小调整为300MiB
lvextend -L 300MiB /dev/systemvg/vo
2)确认调整结果
lvscan
3)刷新文件系统大小
确认逻辑卷vo上的文件系统类型:
blkid /dev /systemvg/vo
选择合适的工具刷新大小:
resize2fs /dev/systemvg/vo
提示:ext4选择resize2fs,xfs选择xfs_growfs
4.5、调整现有磁盘的分区
五、搭建本地yum源
提示:
镜像地址:https://renwole.com/linux-mirror-download/download-centos-linux-iso-images
5.1、http搭建方式
yum -y install httpd
mkdir /var/www/html/centos7
mount /data/iso/CentOS-7-x86_64-Everything-1810.iso /var/www/html/centos7
systemctl restart httpd
systemctl enable httpd
5.2、ftp搭建方式
yum -y install vsftpd
mkdir /var/ftp/centos7
mount /data/iso/CentOS-7-x86_64-Everything-1810.iso /var/www/html/centos7
systemctl restart vsftpd
systemctl enable vsftpd
5.3、客户端配置
vi /etc/yum.repos.d/Local_CenOS7.6.repo
[centos7]
name=centos7.6
baseurl=http://172.16.37.34/centos7
#baseurl=ftp://172.16.37.34/centos7
#baseurl=file:///mnt
gpgcheck=0
enable=1
六、网络配置
6.1、配置静态ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#动态/static静态 一定要改成静态
BOOTPROTO="dhcp"
#激活网卡
ONBOOT=yes
#静态IP 一定要跟你本地IP同一网段
IPADDR=192.168.203.129
#子网掩码
NETMASK=255.255.255.0
# 网关
GATEWAY=192.168.203.2
DNS1=199.29.29.29
七、制作RPM包
7.1、安装rpm-build软件
1、安装rpm-build软件包
[root@web1 ~]# yum -y install rpm-build
2、生成rpmbuild目录结构
[root@web1 ~]# rpmbuild -ba nginx.spec //会报错,没有文件或目录
[root@web1 ~]# ls /root/rpmbuild //自动生成的目录结构
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
3、准备工作,将源码软件复制到SOURCES目录
[root@web1 ~]# cp nginx-1.12.2.tar.gz /root/rpmbuild/SOURCES/
4、创建并修改SPEC配置文件
[root@web1 ~]# vim /root/rpmbuild/SPECS/nginx.spec
Name:nginx
Version:1.12.2
Release: 10
Summary: Nginx is a web server software.
License:GPL
URL: www.test.com
Source0:nginx-1.12.2.tar.gz
#BuildRequires:
#Requires:
%description
nginx [engine x] is an HTTP and reverse proxy server.
%post
useradd nginx //非必需操作:安装后脚本(创建账户)
%prep
%setup –q //自动解压源码包,并cd进入目录
%build
./configure
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
%files
%doc
/usr/local/nginx/* //对哪些文件与目录打包
%changelog
7.2、使用配置文件创建RPM包
1、安装依赖软件包
[root@web1 ~]# yum -y install gcc pcre-devel openssl-devel
2、rpmbuild创建RPM软件包
[root@web1 ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
[root@web1 ~]# ls /root/rpmbuild/RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
[root@web1 ~]# rpm -qpi RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
Name : nginx Relocations: (not relocatable)
Version : 1.12.2 Vendor: (none)
Release : 10 Build Date: Mon 02 May 2016 02:30:53 AM PDT
Install Date: (not installed) Build Host: localhost
Group : Applications/Internet Source RPM: nginx-1.8.0-1.src.rpm
Size : 721243 License: GPL
Signature : (none)
URL : www.nginx.org
Summary : Nginx is a web server software.
Description :
nginx [engine x] is an HTTP and reverse proxy server.
[root@web1 ~]# rpm -qpl nginx-1.12.2-10.x86_64.rpm
/usr
/usr/local
/usr/local/nginx
/usr/local/nginx/conf
/usr/local/nginx/conf/fastcgi.conf
/usr/local/nginx/conf/fastcgi.conf.default
/usr/local/nginx/conf/fastcgi_params
/usr/local/nginx/conf/fastcgi_params.default
/usr/local/nginx/conf/koi-utf
/usr/local/nginx/conf/koi-win
/usr/local/nginx/conf/mime.types
/usr/local/nginx/conf/mime.types.default
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf.default
/usr/local/nginx/conf/scgi_params
/usr/local/nginx/conf/scgi_params.default
/usr/local/nginx/conf/uwsgi_params
/usr/local/nginx/conf/uwsgi_params.default
/usr/local/nginx/conf/win-utf
/usr/local/nginx/html
/usr/local/nginx/html/50x.html
/usr/local/nginx/html/index.html
/usr/local/nginx/logs
/usr/local/nginx/sbin
/usr/local/nginx/sbin/nginx
7.3、安装、卸载软件
[root@web1 ~]# rpm -ivh RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
[root@web1 ~]# rpm -qa |grep nginx
[root@web1 ~]# /usr/local/nginx/sbin/nginx
[root@web1 ~]# curl http://127.0.0.1/
八、防火墙
8.1、iptables
8.2、firewalld
1、防火墙安全概述
在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理方式。
对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较的麻烦,并且对网络有一定要求,所以学习成本较高。但firewalld的学习对网络并没有那么高的要求,相对iptables来说要简单不少,所以建议刚接触CentOS7系统的人员直接学习Firewalld。
需要注意的是:如果开启防火墙工具,并且没有配置任何允许的规则,那么从外部访问防火墙设备默认会被阻止,但是如果直接从防火墙内部往外部流出的流量默认会被允许。
firewalld 只能做和IP/Port相关的限制,web相关的限制无法实现。
2、防火墙使用区域管理
1.防火墙区域
区域选项 | 默认规则策略 |
---|---|
trusted | 允许所有的数据包流入流出 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 |
internal | 等同于home区域 |
work | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
提示:
- trusted: 白名单
- public:默认
- drop:黑名单
2.防火墙参数
参数 | 作用 |
---|---|
zone区域相关指令 | |
--get-default-zone | 获取默认的区域名称 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
-get-zones | 显示总共可用的区域 |
services服务相关命令 | |
--get-services | 列出服务列表中所有可管理的服务 |
--add-service= | 设置默认区域允许该填加服务的流量 |
--remove-service= | 设置默认区域不允许该删除服务的流量 |
Port端口相关指令 | |
--add-port=<端口号/协议> | 设置默认区域允许该填加端口的流量 |
--remove-port=<端口号/协议> | 置默认区域不允许该删除端口的流量 |
Interface网站相关指令 | |
--add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
--change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
其他相关指令 | |
--list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
3、防火墙配置策略
为了能正常使用firewalld服务和相关工具去管理防火墙,必须启动firewalld服务,同时关闭以前旧的防火墙相关服务,需要注意firewalld的规则分为两种状态:
runtime运行时: 修改规则马上生效,但如果重启服务则马上失效,测试建议。
permanent持久配置: 修改规则后需要reload重载服务才会生效,生产建议。
1.禁用防火墙
#1. 禁用旧版防火墙服务或保证没启动
[root@web01 ~]# systemctl mask iptables
Created symlink from /etc/systemd/system/iptables.service to /dev/null.
[root@web01 ~]# systemctl mask ip6tables
Created symlink from /etc/systemd/system/ip6tables.service to /dev/null.
#2. 启动firewalld防火墙,并加入开机自启动服务
[root@m01 ~]# systemctl start firewalld
[root@m01 ~]# systemctl enable firewalld
#3.取消禁用防火墙
[root@web01 ~]# systemctl unmask iptables
2.启动防火墙#
systemctl start firewalld
systemctl enable firewall
3.firewalld 常用命令
#1.查看默认使用的区域
firewall-cmd --get-default-zone
#2.查看默认区域的规则
firewall-cmd --list-all
public (active) #区域名字(活跃的在使用的)
target: default #状态:默认
icmp-block-inversion: no #ICMP
interfaces: eth0 eth1 #区域绑定的网卡
sources: #允许的源IP
services: ssh dhcpv6-client #允许的服务
ports: #允许的端口
protocols: #允许的协议
masquerade: no #IP伪装
forward-ports: #端口转发
source-ports: #来源端口
icmp-blocks: #icmp块
rich rules: #富规则
#3.查看指定区域的规则
firewall-cmd --list-all --zone=drop
#4.查询某区域是否允许某服务
firewall-cmd --zone=public --query-service=ssh
#5.重启防火墙
firewall-cmd --reload
#6.同时配置多个服务
firewall-cmd --add-service={ssh,httpd}
4.配置测试
#移除public区域所有操作
[root@web01 services]# firewall-cmd --remove-service=ssh
success
[root@web01 services]# firewall-cmd --remove-service=dhcpv6-client
success
#配置允许的网段到trusted区域
[root@web01 services]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
success
4、防火墙配置放行策略
1.firewalld放行服务#
#放行mysql服务(firewalld已存在的服务)
[root@web01 ~]# firewall-cmd --add-service=mysql
success
#放行nginx服务(firewalld中不存在的服务)
[root@web01 ~]# cd /usr/lib/firewalld/services
[root@web01 services]# cp mysql.xml nginx.xml
[root@web01 services]# vim nginx.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Nginx</short>
<description>Nginx Server</description>
<port protocol="tcp" port="80"/>
</service>
[root@web01 services]# firewall-cmd --reload
success
[root@web01 services]# firewall-cmd --add-service=nginx
success
[root@web01 services]#
2.firewalld放行端口#
[root@web01 services]# firewall-cmd --add-port=80/tcp
[root@web01 services]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports: 80/tcp 80/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
3.firewalld放行网段#
[root@web01 services]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
5、防火墙端口转发策略
端口转发是指传统的目标地址映射,实现外网访问内网资源,firewalld转发命令格式为:
firewalld-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
如果需要将本地的10.0.0.7:5555端口转发至后端172.16.1.8:22端口
# 注意:
如果本地没有开启防火墙的ip伪装功能,那将不会对地址进行转换,源地址不会被转换为内网网段,依然是以外网网段转发至内网机器,则内网收到消息,
返回请求到原本的src,也就是源,则会发现源是外网的ip,没有被10.0.0.7转换,则无法将请求发送出去。
#1.配置端口转发
[root@web01 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=5555:proto=tcp:toport=22:toaddr=172.16.1.8
success
[root@web01 ~]# firewall-cmd --reload
#2.开启IP伪装
[root@web01 ~]# firewall-cmd --add-masquerade
success
[root@web01 ~]# firewall-cmd --add-masquerade --permanent
success
#3.测试访问
[root@m01 ~]# ssh 10.0.0.7 -p5555
root@10.0.0.7's password:
Last login: Tue Jul 7 01:06:01 2020 from 172.16.1.7
[root@web02 ~]#
6、防火墙富规则
firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的,下面为firewalld富语言规则帮助手册
1.富规则语法#
[root@web01 ~]# man firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
# 按照下方语法配置富规则即可
rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop
2.实例一:#
要求:比如允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问22端口#
#允许10.0.0.1主机能够访问http服务
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 service name=http accept'
success
#允许172.16.1.0/24能访问22端口
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=22 protocol=tcp accept'
success
3.实例二:默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器#
[root@lb02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=22 protocol=tcp drop'
4.实例三:使用firewalld,允许所有人能访问http,https服务,但只有10.0.0.1主机可以访问ssh服务#
[root@lb02 ~]# firewall-cmd --add-service={http,https}
[root@lb02 ~]# firewall-cmd --remove-service=ssh
[root@lb02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 port port=22 protocol=tcp accept'
5.当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口#
[root@lb02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7'
7、防火墙内部共享上网
1.开启防火墙IP伪装#
[root@web01 ~]# firewall-cmd --add-masquerade --permanent
success
[root@web01 ~]# firewall-cmd --add-masquerade
success
2.防火墙开启内核转发(如果是Centos6,需要配置)#
[root@web01 ~]# sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
#配置内核转发
[root@m01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#在CentOS6中开启之后生效命令
[root@m01 ~]# sysctl -p
#查看内核转发是否开启
[root@m01 ~]# sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
3.配置没有外网的机器网关地址#
[root@web01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
#添加配置
GATEWAY=172.16.1.7 #防火墙内网地址
DNS1=223.5.5.5
#重启网卡
[root@web01 ~]# ifdown eth1
[root@web01 ~]# ifup eth1
九、cron计划任务
vi /etc/crontab
分 时 日 月 周 任务命令行(绝对路径)
在表示各段的时间点时,除了明确的数值以外,还可以参考以下形式:
*:匹配范围内任意时间
,:分隔多个不连续的时间点
-:指定连续时间范围
/n:指定时间频率,每n ...
命令:
crontab -e -u jluo
systemctl restart crond
systemctl enable crond
例如:
每一小时执行一次脚本
* */1 * * * /data/app/script/autodellogs.sh
十、基本安全加固
10.1、账号安全
1、修改用户zhangsan的账户属性,设置为2019-12-31日失效(禁止登录)
chage命令的语法格式:
chage –l 账户名称 //查看账户信息
chage –E 时间 账户名称 //修改账户有效期
失效的用户将无法登录
使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间):
[root@proxy ~]# useradd zhangsan
[root@proxy ~]# chage -E 2015-05-15 zhangsan
2、定义默认有效期
/etc/login.defs这个配置文件,决定了账户密码的默认有效期。
[root@proxy ~]# cat /etc/login.defs
PASS_MAX_DAYS 99999 //密码最长有效期
PASS_MIN_DAYS 0 //密码最短有效期
PASS_MIN_LEN 5 //密码最短长度
PASS_WARN_AGE 7 //密码过期前几天提示警告信息
UID_MIN 1000 //UID最小值
UID_MAX 60000 //UID最大值
3、锁定用户账号
1)使用passwd或usermod命令将用户zhangsan的账户锁定。
[root@proxy ~]# passwd -l zhangsan //锁定用户账号lock
锁定用户 zhangsan 的密码。
passwd: 操作成功
[root@proxy ~]# passwd -S zhangsan //查看状态status
zhangsan LK 2018-02-22 0 99999 7 -1 (密码已被锁定。)
2)验证用户zhangsan已无法登录,说明锁定生效
输入正确的用户名、密码,始终提示“Login incorrect”,无法登录。
3)解除对用户zhangsan的锁定
[root@proxy ~]# passwd -u zhangsan //解锁用户账号
解锁用户 zhangsan 的密码 。
passwd: 操作成功
[root@proxy ~]# passwd -S zhangsan //查看状态
zhangsan PS 2018-08-14 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)
10.2、修改tty登录的提示信息,隐藏系统版本
1、设置显示登录信息
账户在登录Linux系统时,默认会显示登陆信息(包括操作系统内核信息)
/etc/issue、/etc/issue.net这个配置文件里保存的就是这些登陆信息,修改该文件防止内核信息泄露。
[root@proxy ~]# cat /etc/issue //确认原始文件
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Kernel \r on an \m
[root@proxy ~]# cp /etc/issue /etc/issue.origin //备份文件
[root@proxy ~]# vim /etc/issue //修改文件内容
Windows Server 2012 Enterprise R2
NT 6.2 Hybrid
2、测试版本伪装效果
退出已登录的tty终端,或者重启Linux系统,刷新后的终端提示信息会变成自定义的文本内容,如下所示。
10.3、磁盘安全
对于操作系统来说,文件系统也可以通过添加额外属性来提高性能与安全性。
[root@proxy ~]# cat /etc/fstab
/dev/vda1 /boot xfs defaults,noexec 0 0
/dev/vda3 /home xfs defaults,noatime 0 0
备注:
noexec属性可以让分区下的所有程序都不可执行,包括病毒与木马
noatime让分区下的所有文件都不再更新atime时间,atime时间为文件的访问时间
10.4、配置文件锁定
用户配置文件锁定
针对/etc/passwd、/etc/resolv.conf、/etc/hosts 、/etc/shadow 、/etc/group和/etc/gshadow进行chattr +i保护,进一步提供系统用户管理安全。
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/resolv.conf、/etc/hosts
1、语法格式:
# chattr +i 文件名 //锁定文件(无法修改、删除等)
# chattr -i 文件名 //解锁文件
# chattr +a 文件名 //锁定后文件仅可追加
# chattr -a 文件名 //解锁文件
# lsattr 文件名 //查看文件特殊属性
2、使用+i锁定文件,使用lsattr查看属性
[root@proxy ~]# chattr +i /etc/resolv.conf
[root@proxy ~]# lsattr /etc/resolv.conf
----i---------- /etc/resolv.conf
3、使用+a锁定文件(仅可追加),使用lsattr查看属性
[root@proxy ~]# chattr +a /etc/hosts
[root@proxy ~]# lsattr /etc/hosts
-----a---------- /etc/hosts
4、测试文件锁定效果
[root@proxy ~]# rm -rf /etc/resolv.conf
rm: 无法删除"/etc/resolv.conf": 不允许的操作
[root@proxy ~]# echo xyz > /etc/resolv.conf
-bash: resolv.conf: 权限不够
[root@proxy ~]# rm -rf /etc/hosts //失败
[root@proxy ~]# echo "192.168.4.1 xyz" > /etc/hosts //失败
[root@proxy ~]# echo "192.168.4.1 xyz" >> /etc/hosts //成功
10.5、history历史命令
1、概述
- 当执行命令后,系统默认会在内存记录执行过的命令
- 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history
- 登录shell时,会读取命令历史文件中记录下的命令加载到内存中
- 登录进shell后新执行的命令只会记录在内存的缓存区中;这些命令会用户正常退出时“追加”至命令历史文件中
- 利用命令历史。可以用它来重复执行命令,提高输入效率
2、命令:history
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
-c: 清空命令历史
-d offset: 删除历史中指定的第offset个命令
n: 显示最近的n条历史
-a: 追加本次会话新执行的命令历史列表至历史文件
-r: 读历史文件附加到历史列表
-w: 保存历史列表到指定的历史文件
-n: 读历史文件中未读过的行到历史列表
-p: 展开历史参数成多行,但不存在历史列表中
-s: 展开历史参数成一行,附加在历史列表后
3、命令历史相关环境变量
环境变量可以 export 变量名="值" 形式存放在 /etc/profile 或 ~/.bash_profile
- HISTSIZE:命令历史记录的条数
- HISTFILE:指定历史文件,默认为~/.bash_history
- HISTFILESIZE:命令历史文件记录历史的条数
- HISTTIMEFORMAT="%F %T whoami" 显示时间和用户
- HISTIGNORE="str1:str2*:…" 忽略str1命令,str2开头的历史
- HISTCONTROL:控制命令历史的记录方式
ignoredups 是默认值,可忽略重复的命令,连续且相同为“重复”
ignorespace 忽略所有以空白开头的命令
ignoreboth 相当于ignoredups, ignorespace的组合
erasedups 删除重复命令
4、实战
配置
vi /etc/profile
....
#命令历史记录的条数
HISTSIZE=500
#显示时间和用户
HISTTIMEFORMAT="%F %T `whoami`"
#忽略mysql*命令,user*开头的历史
HISTIGNORE="mysql*:user*"
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL HISTTIMEFORMA HISTIGNORE
....
source /etc/profile
#只允许增加,不允许删除
chattr +a .bash_history
测试
[root@mindoc ~]# history
4 2021-11-23 14:48:00 roothistory
5 2021-11-23 14:48:44 rootvim /etc/profile
6 2021-11-23 14:56:03 rootsource /etc/profile
7 2021-11-23 14:56:38 roothistory
[root@mindoc ~]# useradd test1
[root@mindoc ~]# history
4 2021-11-23 14:48:00 roothistory
5 2021-11-23 14:48:44 rootvim /etc/profile
6 2021-11-23 14:56:03 rootsource /etc/profile
7 2021-11-23 14:56:38 roothistory
8 2021-11-23 14:58:01 rootmysql -uroot
9 2021-11-23 14:58:04 roothistory
[root@mindoc ~]# cat .bash_history
#1637650074
> .bash_history
#1637650076
history
#1637650080
history
#1637650124
vim /etc/profile
#1637650563
source /etc/profile
#1637650598
history
#1637650681
mysql -uroot
#1637650684
history
10.6、ssh配置优化
修改之前,需要将/etc/ssh/sshd_config备份一个,比如/etc/ssh/sshd_config.old, 主要优化如下参数:
Port 12011
PermitRootLogin no
UseDNS no
#防止ssh客户端超时#
ClientAliveInterval 30
ClientAliveCountMax 99
GSSAuthentication no
10.7、sudo权限控制
一般是root都在管理人员手中,而运维或者开发都划分其他对应权限,但建议都不能切换root,同时取消useradd、userdel、passwd以及chattr命令的授权。
echo '111111' | passwd admin --stdin
最大的sudo权限分配:
admin ALL=NOPASSWD:ALL
大的sudo权限分配:
admin ALL=NOPASSWD:ALL,!/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root,!/bin/su,!/bin/su -
比较大的sudo权限分配:
admin ALL=NOPASSWD:ALL,!/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root,!/bin/bash,!/bin/su,!/bin/su -
一般sudo权限分配:
admin ALL=NOPASSWD:ALL,!/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root,!/bin/bash,!/usr/bin/useradd,!/usr/bin/userdel,!/usr/bin/chattr,!/bin/su,!/bin/su -
十一、常用命令
11.2、监控类
1、vmstat
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat工具提供了一种低开销的系统性能观察方式。因为vmstat本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat输出结果。
1、命令参数
-
-a:显示活跃和非活跃内存
-
-f:显示从系统启动至今的fork数量 。
-
-m:显示slabinfo
-
-n:只在开始时显示一次各字段名称。
-
-s:显示内存相关统计信息及多种系统活动数量。
-
delay:刷新时间间隔。如果不指定,只显示一条结果。
-
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-
-d:显示磁盘相关统计信息。
-
-p:显示指定磁盘分区统计信息
-
-S:使用指定单位显示。参数有 k 、K 、m 、M,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-
-V:显示vmstat版本信息。
2、实战
说明:
procs:
-
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
-
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
-
memory:
-
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
-
free 当前的空闲页面列表中内存数量(k表示)
-
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
-
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap:
-
si 由内存进入内存交换区数量
-
so由内存交换区进入内存数量。
IO:
-
bi 从块设备读入数据的总量(读磁盘)(每秒kb)
-
bo 块设备写入数据的总量(写磁盘)(每秒kb)
-
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
-
system 显示采集间隔内发生的中断数:
-
in 列表示在某一时间间隔中观测到的每秒设备中断数。
-
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
cpu 表示cpu的使用状态:
-
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
-
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
-
id 列显示了cpu处在空闲状态的时间百分比
-
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
2、iostat
11.2、压缩类
1、zip
zip [选项] 文件名.zip /xxx/路径xxx/文件
常用参数选项如下:
- -v :可视化操作,显示压缩的执行过程,默认就是可视化
- -q : 静默操作,不显示指令执行过程
- -r :表示递归打包包含子目录的全部内容
- -d :从压缩文件内删除指定的文件
- -n :n为一个数字,压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好
- -e :加密压缩文件
- -u :追加文件到zip压缩包中
演示示例:
zip -vr etc.zip /etc/ #压缩/etc/目录,压缩文件名为etc.zip
zip -d myfile.zip smart.txt #删除压缩文件中的指定文件
zip -e passwd.zip /etc/passwd #加密压缩,需要输入密码
zip -u passwd.zip mypasww.txt #追加mypasww.txt文件到压缩包中
2、tar
十二、数据同步
12.1、rsync基本用法
本地同步操作:
rsync [选项...] 本地目录1 本地目录2
rsync [选项...] 本地目录1/ 本地目录2
rsync同步工具的常用选项:
-n:测试同步过程,不做实际修改
--delete:删除目标文件夹内多余的文档
-a:归档模式,相当于-rlptgoD
-v:显示详细操作信息
-z:传输过程中启用压缩/解压
12.2、rsync+SSH同步
列出 SSH 服务端资源
rsync user@host:远程目录/
rsync+SSH远程同步操作:
rsync [...] user@host:远程目录 本地目录
rsync [...] 本地目录 user@host:远程目录
12.3、使用inotifywait工具
inotifywait监控操作:
inotifywait [选项] 目标文件夹
inotifywait常用命令选项:
-m,持续监控(捕获一个事件后不退出)
-r,递归监控、包括子目录及文件
-q,减少屏幕输出信息
-e,指定监视的 modify、move、create、delete、attrib 等事件类别
notifywait与rsync的结合,主要思路
while inotifywait监控操作
do
需要执行的rsy nc同步操作
done
编写镜像同步脚本并测试效果
vim /root/isync.sh
#! /bin/bash
FROM_DIR="/var/www/html/"
RSYNC_CMD="rsync - az --delete $FROM_DIR root@192.168.4.207:/var/www/html"
while inotifywait - rqq - e modify ,move,create,delete,attrib $FROM_DIR
do
$RSYNC_CMD
done &
[ root@svr7 ~] # chmod +x /root/isync.sh
十三、后端存储
13.1、NFS
1、安装软件
#服务端
yum -y install nfs-utils rpcbind
#客户端
yum -y install nfs-utils rpcbind
2、服务端配置共享
- 需要作为NFS共享发布的有/data/app、/data/web这两个目录:
[root@nfs-server ~]# mkdir /data/app -p
[root@nfs-server ~]# mkdir /data/web -p
[root@nfs-server ~]# ls -ld /data/app /data/web
drwxr-xr-x. 2 root root 6 6月 1 20:06 /data/app
drwxr-xr-x. 2 root root 6 6月 1 20:06 /data/web
//写入测试数据
[root@nfs-server ~]# echo app > /data/app/app.txt
[root@nfs-server ~]# echo web > /data/web/web.txt
默认情况下,来自NFS客户端的root用户会被自动降权为普通用户,若要保留其root权限,注意应添加no_root_squash控制参数(没有该参数,默认root会被自动降级为普通账户);另外,限制只读的参数为ro、可读可写为rw,相关配置操作如下所示:
[root@nfs-server ~]# vim /etc/exports
/data/app 192.168.2.121(rw,no_root_squash)
/data/web 192.168.2.121(ro)
- 启动NFS共享相关服务,确认共享列表
依次启动rpcbiind、nfs服务:
[root@nfs-server ~]# systemctl restart rpcbind ; systemctl enable rpcbind
[root@nfs-server ~]# systemctl restart nfs ; systemctl enable nfs
- 使用showmount命令查看本机发布的NFS共享列表
[root@nfs-server ~]# showmount -e localhost
Export list for localhost:
/data/web 192.168.2.121
/data/app 192.168.2.121
[root@nfs-server ~]# showmount -e 192.168.2.120
Export list for 192.168.2.120:
/data/web 192.168.2.121
/data/app 192.168.2.121
3、客户端挂载NFS
- 启用NFS共享支持服务
客户机访问NFS共享也需要rpcbind服务的支持,需确保此服务已开启
[root@nfs-client ~]# systemctl restart rpcbind ; systemctl enable rpcbind
- 查看服务器提供的NFS共享列表
[root@nfs-client ~]# showmount -e 192.168.2.120
Export list for 192.168.2.120:
/data/web 192.168.2.121
/data/app 192.168.2.121
- 客户机挂载
[root@nfs-client ~]# mkdir /data/app -p
[root@nfs-client ~]# mkdir /data/web -p
//临时挂载
[root@nfs-client ~]# mount -t nfs 192.168.2.120:/data/web /data/web
[root@nfs-client ~]# mount -t nfs 192.168.2.120:/data/app /data/app
//永久挂载
[root@nfs-client ~]# vim /etc/fstab
192.168.2.120:/data/web /data/web nfs defaults,_rnetdev 1 1
192.168.2.120:/data/app /data/app nfs defaults,_rnetdev 1 1
备注:第1个1表示备份文件系统,第2个1表示从/分区的顺序开始fsck磁盘检测,0表示不检测。
_rnetdev 表示主机无法挂载直接跳过,避免无法挂载主机无法启动
[root@nfs-client ~]# mount -a
[root@nfs-client ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
192.168.2.120:/data/web 50G 13G 38G 25% /data/web
192.168.2.120:/data/app 50G 13G 38G 25% /data/app
- 验证/data/app可读可写权限
[root@nfs-client ~]# cd /data/app/
[root@nfs-client app]#
[root@nfs-client app]# ls
app.txt
[root@nfs-client app]# cat app.txt
app
[root@nfs-client app]# echo 'NFS write test' > test.txt
[root@nfs-client app]# ls
app.txt test.txt
[root@nfs-client app]# cat test.txt
NFS write test
//nfs-server主机查看文件多了文件test.txt
[root@nfs-server ~]# cd /data/app/
[root@nfs-server app]# ls
app.txt test.txt
[root@nfs-server app]# cat test.txt
NFS write test
- 验证/data/web可读权限
[root@nfs-client app]# cd /data/web/
[root@nfs-client web]# ls
web.txt
[root@nfs-client web]# cat web.txt
web
[root@nfs-client web]# echo 'test' > test.txt
-bash: test.txt: 只读文件系统
//nfs-server主机写入文件
[root@nfs-server app]# cd /data/web/
[root@nfs-server web]# echo 'nfs-server write data test' > test.txt
[root@nfs-server web]# ls
test.txt web.txt
[root@nfs-server web]# cat test.txt
nfs-server write data test
//客户机nfs-client查看
[root@nfs-client web]# ls
test.txt web.txt
[root@nfs-client web]# cat test.txt
nfs-server write data test
备注:
当在服务器运行df -h 卡死的时候,很有可能是nfs的原因。
1)在客户端找到挂载的服务器的ip及挂载目录
[root@nfs-client web]# cat /etc/fstab
2)进入服务器查看/etc/export查看服务器都挂载了那些客户端或通过 showmount -e 服务端IP 来查看客户端挂载的目录。
3)重启nfs
[root@nfs-server web]# systemctl restart nfs
4)现在客户端就可以操作了,先卸载之前的挂载
umount /data/app
umount /data/web
5)重新挂载
mount -t nfs 服务器IP:/服务器目录 客户端挂载目录
提示:
1)Centos 7下挂载nfs 提示mount.nfs: an incorrect mount option was specified
mount -t nfs -o nfsvers=3,vers=3 10.10.200.227:/home/nfs /mnt/
2)Linux umount设备时出现device is busy解决方法
#/u06为挂载目录
[root@DB-Server u06]# fuser -m /u06
/u06: 10584
[root@DB-Server u06]# kill -9 10584
[root@DB-Server ~]# umount /dev/VolGroup03/LogVol00
13.2、iscsi
13.3、ceph
十四、内核参数优化
14.1、进程级句柄优化
vim /etc/security/limits.conf
# End of file
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
另外需要注意,进程级参数优化还需要修改文件:
/etc/security/limits.d/*-nproc.conf 这个会影响到参数。查看某一个进程的limits可以通过cat /proc/pid/limits查看。默认这个文件参数推荐设置:
vi /etc/security/limits.d/*-nproc.conf
* soft nproc 65535
root soft nproc unlimited
14.2、系统级句柄优化
修改/etc/sysctl.conf添加如下参数:
fs.file-max=65535
内核参数优化(这个是非常重要的)。具体优化的文件为/etc/sysctl.conf,后尾追加优化参数:
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.conf.lo.arp_announce=2
net.ipv4.tcp_synack_retries = 2 #参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1 #表示在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_max_syn_backlog = 262144 #这个参数表示TCP三次握手建立阶段接受SYN请求列队的最大长度,默认1024,将其设置的大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的链接请求。
net.ipv4.tcp_syncookies = 1 #解决syn攻击,用于设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理。
net.ipv4.tcp_tw_reuse = 1 #参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在;
net.ipv4.tcp_timestamps = 1 #开启时间戳,配合tcp复用。如遇到局域网内的其他机器由于时间戳不同导致无法连接服务器,有可能是这个参数导致。注:阿里的slb会清理掉tcp_timestamps
net.ipv4.tcp_tw_recycle = 1 #这个参数用于设置启用timewait快速回收
net.ipv4.tcp_max_tw_buckets = 6000 #参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1 #当服务器主动关闭链接时,选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。
net.ipv4.tcp_keepalive_time = 600 #当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。
net.ipv4.ip_local_port_range = 1024 65000#定义UDP和TCP链接的本地端口的取值范围。
fs.file-max=65535 #表示最大可以打开的句柄数;
kernel.pid_max=1000000 #调整最大进程数
十五、开机自启脚本
15.1、rc.local
在linux各项服务启动完毕之后,会运行/etc/rc.d/rc.local这个文件,所以把我们需要运行的脚本放在这里面就行了。
(ps:/etc/rc.local和/etc/rc.d/rc.local是同一个文件,软链接而已)
# cat /mnt/Autorun_script.sh
date > /tmp/bootup.txt
hostname >> /tmp/bootup.txt
echo `whoami` >> /tmp/bootup.txt
将/mnt/Autorun_script.sh这个脚本放到/etc/rc.d/rc.local这个文件最后一行,最后为了保险起见,别忘了加一个权限
chmod +x /mnt/Autorun_script.sh
chmod +x /etc/rc.d/rc.local
15.2、crontab计划任务
大家知道,crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。
我们可以自己设置计划任务时间,然后编写对应的脚本。但是,有个特殊的任务,叫作 @reboot ,我们其实也可以直接从它的字面意义看出来,这个任务就是在系统重启之后自动运行某个脚本。
那它将运行的是什么脚本呢?我们如何去设置这个脚本呢?我们可以通过 crontab -e 来设置。
$ crontab -e
@reboot /mnt/Autorun_script.sh
然后,直接重启即可。运行的效果跟上面类似。
15.3、使用systemd
以上介绍的两种方法,在任何 Linux 系统上都可以使用。但本方法仅适用于 systemd 系统。如何区分是不是 systemd 系统?很简单,只需运行 ps aux 命令,查看 pid 为 1 的进程是不是 systemd 。Ubuntu是systemd系统。
为了实现目的,我们需要创建一个 systemd 启动服务,并把它放置在 /etc/systemd/system/ 目录下。
我们创建的 systemd 启动服务如下。请注意,这时后缀是 .service ,而不是 .sh 。
vim auto_run_script.service
[Unit]
Description=Run a Custom Script at Startup
After=default.target
[Service]
ExecStart=/mnt/Autorun_script.sh
[Install]
WantedBy=default.target
从服务的内容可以看出来,我们最终还是会调用 /mnt/Autorun_script.sh 这个脚本。
然后,我们再把这个脚本放置在 /etc/systemd/systerm/ 目录下,之后我们再运行下面两条命令来更新 systemd 配置文件,并启动服务。
systemctl daemon-reload
systemctl enable auto_run_script.service
15.4、在/etc/profile.d/下写.sh文件
在/etc/profile.d/下写.sh文件,reboot即可
/etc/profile会遍历/etc/profile.d/*.sh
另外,几个脚本的区别:
-
/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
-
/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc)。
-
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,设置一些环境变量,执行用户的.bashrc文件。
-
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。你可以在这里设置你的个性化终端了,就像下面这样
-
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是”父子”关系。
-
~/.bash_profile: 是交互式、login 方式进入 bash 运行的。~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
15.5、编辑/etc/init.d/下文件
使用chkconfig管理,编辑/etc/init.d/下文件即可
路由配置
临时配置
ip route add default via 子网网关 dev 网卡名称 table 路由表名称
ip route add 子网网段 dev 网卡名称 table 路由表名称
ip rule add from 网卡地址 table 路由表名称
命令示例:
ip route add default via 10.0.0.1 dev eth0 table 10
ip route add 10.0.0.0/24 dev eth0 table 10
ip rule add from 10.0.0.115 table 10
ip rule
ip route show table 主网卡路由表名称
ip route show table 扩展网卡路由表名称
命令示例:
ip rule
ip route show table 10
ping -I 源端云服务器主网卡地址 目的端云服务器地址
命令示例:
ping -I 10.0.0.115 10.0.2.12
配置永久路由
vi /etc/rc.local
sleep 5
ip route flush table 10
ip route add default via 10.0.0.1 dev eth0 table 10
ip route add 10.0.0.0/24 dev eth0 table 10
ip rule add from 10.0.0.115 table 10
chmod +x /etc/rc.local
服务搭建
DNS
可参考:DNS服务搭建
zookeeper
可参考:zookeeper集群部署
tomcat
可参考:Tomcat实战之路
nginx
可参考:nginx入门到实战
apollo
可参考:Apollo分布式集群部署
Linux监控
prometheus
可参考:prometheus监控实战
zabbix
可参考:zabbix企业监控
漏洞修复
OpenSSH ssh-agent远程代码执行漏洞(CVE-2023-38408)
vi updateOpenssh.sh
#!/bin/bash
#
#########################################################
# Function :openssh-9.6p1 update #
# Platform :Centos7.X #
# Version :2.0 #
# Date :2022-05-01 #
#########################################################
clear
export LANG="en_US.UTF-8"
#修改1:此处的zlib原来的版本zlib-1.2提示下载失败,改完最新版本号可正常下载,
#最新版本可在此地址查看:https://www.zlib.net/,截止本文修改日期最新版本为1.3.1
#openssl和openssh下载不同的版本在此处修改版本号即可
zlib_version="zlib-1.3.1"
openssl_version="openssl-1.1.1q"
openssh_version="openssh-9.6p1"
#安装包地址,这里存在一个问题,如果文件夹没有提前建好,后续执行脚本将报错
file="/opt"
#默认编译路径
default="/usr/local"
date_time=`date +%Y-%m-%d—%H:%M`
#安装目录
file_install="$file/openssh_install"
file_backup="$file/openssh_backup"
file_log="$file/openssh_log"
#修改2:为了解决文件夹不存在的问题,我这里添加了创建文件夹的脚本---start
if [ ! -d "$file_install" ]; then
mkdir "$file_install"
fi
if [ ! -d "$file_backup" ]; then
mkdir "$file_backup"
fi
if [ ! -d "$file_log" ]; then
mkdir "$file_log"
fi
if [ ! -d "$file_install/zlib" ]; then
mkdir "$file_install/zlib"
fi
#修改2:为了解决文件夹不存在的问题,我这里添加了创建文件夹的脚本---end
#源码包链接
zlib_download="https://www.zlib.net/$zlib_version.tar.gz"
openssl_download="https://www.openssl.org/source/$openssl_version.tar.gz"
openssh_download="https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/$openssh_version.tar.gz"
Install_make()
{
# Check if user is root
if [ $(id -u) != "0" ]; then
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 当前用户为普通用户,必须使用root用户运行,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
#判断是否安装wget
echo -e "\033[33m 正在安装Wget...... \033[0m"
sleep 2
echo ""
if ! type wget >/dev/null 2>&1; then
yum install -y wget
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " wget已经安装了:" "\033[32m Please continue\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
fi
#判断是否安装tar
echo -e "\033[33m 正在安装TAR...... \033[0m"
sleep 2
echo ""
if ! type tar >/dev/null 2>&1; then
yum install -y tar
else
echo ""
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " tar已经安装了:" "\033[32m Please continue\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
fi
echo ""
#安装相关依赖包
echo -e "\033[33m 正在安装依赖包...... \033[0m"
sleep 3
echo ""
yum install gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel zlib-devel tcp_wrappers-devel tcp_wrappers
if [ $? -eq 0 ];then
echo ""
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 安装软件依赖包成功 " "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 解压源码包失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
sleep 4
exit
fi
echo ""
}
Install_backup()
{
#创建文件(可修改)
mkdir -p $file_install
mkdir -p $file_backup
mkdir -p $file_log
mkdir -p $file_backup/zlib
mkdir -p $file_backup/ssl
mkdir -p $file_backup/ssh
mkdir -p $file_log/zlib
mkdir -p $file_log/ssl
mkdir -p $file_log/ssh
#备份文件(可修改)
cp -rf /usr/bin/openssl $file_backup/ssl/openssl_$date_time.bak > /dev/null
cp -rf /etc/init.d/sshd $file_backup/ssh/sshd_$date_time.bak > /dev/null
cp -rf /etc/ssh $file_backup/ssh/ssh_$date_time.bak > /dev/null
cp -rf /usr/lib/systemd/system/sshd.service $file_backup/ssh/sshd_$date_time.service.bak > /dev/null
cp -rf /etc/pam.d/sshd.pam $file_backup/ssh/sshd_$date_time.pam.bak > /dev/null
}
Remove_openssh()
{
##并卸载原有的openssh(可修改)
rpm -e --nodeps `rpm -qa | grep openssh`
}
Install_tar()
{
#下载的源码包,检查是否解压(可修改)
# if [ -e $file/$zlib_version.tar.gz ] && [ -e $file/$openssl_version.tar.gz ] && [ -e /$file/$openssh_version.tar.gz ];then
# echo -e " 下载软件源码包已存在 " "\033[32m Please continue\033[0m"
# else
# echo -e "\033[33m 未发现本地源码包,链接检查获取中........... \033[0m "
# echo ""
# cd $file
# wget --no-check-certificate $zlib_download
# wget --no-check-certificate $openssl_download
# wget --no-check-certificate $openssh_download
# echo ""
# fi
#zlib
echo -e "\033[33m 正在下载Zlib软件包...... \033[0m"
sleep 3
echo ""
if [ -e $file/$zlib_version.tar.gz ] ;then
echo -e " 下载软件源码包已存在 " "\033[32m Please continue\033[0m"
else
echo -e "\033[33m 未发现zlib本地源码包,链接检查获取中........... \033[0m "
sleep 1
echo ""
cd $file
wget --no-check-certificate $zlib_download
echo ""
fi
#openssl
echo -e "\033[33m 正在下载Openssl软件包...... \033[0m"
sleep 3
echo ""
if [ -e $file/$openssl_version.tar.gz ] ;then
echo -e " 下载软件源码包已存在 " "\033[32m Please continue\033[0m"
else
echo -e "\033[33m 未发现openssl本地源码包,链接检查获取中........... \033[0m "
echo ""
sleep 1
cd $file
wget --no-check-certificate $openssl_download
echo ""
fi
#openssh
echo -e "\033[33m 正在下载Openssh软件包...... \033[0m"
sleep 3
echo ""
if [ -e /$file/$openssh_version.tar.gz ];then
echo -e " 下载软件源码包已存在 " "\033[32m Please continue\033[0m"
else
echo -e "\033[33m 未发现openssh本地源码包,链接检查获取中........... \033[0m "
echo ""
sleep 1
cd $file
wget --no-check-certificate $openssh_download
fi
}
echo ""
echo ""
#安装zlib
Install_zlib(){
echo -e "\033[33m 1.1-正在解压Zlib软件包...... \033[0m"
sleep 3
echo ""
cd $file && mkdir -p $file_install && tar -xzf zlib*.tar.gz -C $file_install > /dev/null
if [ -d $file_install/$zilb_version ];then
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " zilb解压源码包成功" "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " zilb解压源码包失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
echo -e "\033[33m 1.2-正在编译安装Zlib服务.............. \033[0m"
sleep 3
echo ""
#这里原脚本写法:cd $file_install/zlib*,我遇到了cd目录失败问题,将此处修改如下
cd $file_install/$zlib_version
echo -e "$pwd"
./configure --prefix=$default/$zlib_version > $file_log/zlib/zlib_configure_$date_time.txt #> /dev/null 2>&1
if [ $? -eq 0 ];then
echo -e "\033[33m make... \033[0m"
make > /dev/null 2>&1
echo $?
echo -e "\033[33m make test... \033[0m"
make test > /dev/null 2>&1
echo $?
echo -e "\033[33m make install... \033[0m"
make install > /dev/null 2>&1
echo $?
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 编译安装压缩库失败,脚本退出中..." "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
if [ -e $default/$zlib_version/lib/libz.so ];then
sed -i '/zlib/'d /etc/ld.so.conf
echo "$default/$zlib_version/lib" >> /etc/ld.so.conf
echo "$default/$zlib_version/lib" >> /etc/ld.so.conf.d/zlib.conf
ldconfig -v > $file_log/zlib/zlib_ldconfig_$date_time.txt > /dev/null 2>&1
/sbin/ldconfig
fi
}
echo ""
echo ""
Install_openssl(){
echo -e "\033[33m 2.1-正在解压Openssl...... \033[0m"
sleep 3
echo ""
cd $file && tar -xvzf openssl*.tar.gz -C $file_install > /dev/null
if [ -d $file_install/$openssl_version ];then
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " OpenSSL解压源码包成功" "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " OpenSSL解压源码包失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
echo ""
echo -e "\033[33m 2.2-正在编译安装Openssl服务...... \033[0m"
sleep 3
echo ""
cd $file_install/$openssl_version
./config shared zlib --prefix=$default/$openssl_version > $file_log/ssl/ssl_config_$date_time.txt #> /dev/null 2>&1
if [ $? -eq 0 ];then
echo -e "\033[33m make clean... \033[0m"
make clean > /dev/null 2>&1
echo $?
echo -e "\033[33m make -j 4... \033[0m"
make -j 4 > /dev/null 2>&1
echo $?
echo -e "\033[33m make install... \033[0m"
make install > /dev/null 2>&1
echo $?
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 编译安装OpenSSL失败,脚本退出中..." "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
mv /usr/bin/openssl /usr/bin/openssl_$date_time.bak #先备份
if [ -e $default/$openssl_version/bin/openssl ];then
sed -i '/openssl/'d /etc/ld.so.conf
echo "$default/$openssl_version/lib" >> /etc/ld.so.conf
ln -s $default/$openssl_version/bin/openssl /usr/bin/openssl
ln -s $default/$openssl_version/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s $default/$openssl_version/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ldconfig -v > $file_log/ssl/ssl_ldconfig_$date_time.txt > /dev/null 2>&1
/sbin/ldconfig
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 编译安装OpenSSL " "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
echo -e "\033[33m 2.3-正在输出 OpenSSL 版本状态.............. \033[0m"
sleep 3
echo ""
echo -e "\033[32m====================== OpenSSL veriosn ===================== \033[0m"
echo ""
openssl version -a
echo ""
echo -e "\033[32m======================================================= \033[0m"
sleep 2
else
echo ""
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " OpenSSL软连接失败,脚本退出中..." "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
fi
}
echo ""
echo ""
Install_openssh(){
echo -e "\033[33m 3.1-正在解压OpenSSH...... \033[0m"
sleep 3
echo ""
cd $file && tar -xvzf openssh*.tar.gz -C $file_install > /dev/null
if [ -d $file_install/$openssh_version ];then
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " OpenSSh解压源码包成功" "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " OpenSSh解压源码包失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
echo ""
echo -e "\033[33m 3.2-正在编译安装OpenSSH服务...... \033[0m"
sleep 3
echo ""
mv /etc/ssh /etc/ssh_$date_time.bak #先备份
cd $file_install/$openssh_version
./configure --prefix=$default/$openssh_version --sysconfdir=/etc/ssh --with-ssl-dir=$default/$openssl_version --with-zlib=$default/$zlib_version > $file_log/ssh/ssh_configure_$date_time.txt #> /dev/null 2>&1
if [ $? -eq 0 ];then
echo -e "\033[33m make -j 4... \033[0m"
make -j 4 > /dev/null 2>&1
echo $?
echo -e "\033[33m make install... \033[0m"
make install > /dev/null 2>&1
echo $?
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 编译安装OpenSSH失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 4
exit
fi
echo ""
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 编译安装OpenSSH " "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 2
echo -e "\033[32m==================== OpenSSH—file veriosn =================== \033[0m"
echo ""
/usr/local/$openssh_version/bin/ssh -V
echo ""
echo -e "\033[32m======================================================= \033[0m"
sleep 3
echo ""
echo -e "\033[33m 3.3-正在迁移OpenSSH配置文件...... \033[0m"
sleep 3
echo ""
#迁移sshd
if [ -f "/etc/init.d/sshd" ];then
mv /etc/init.d/sshd /etc/init.d/sshd_$date_time.bak
else
echo -e " /etc/init.d/sshd不存在 " "\033[31m Not backed up(可忽略)\033[0m"
fi
cp -rf $file_install/$openssh_version/contrib/redhat/sshd.init /etc/init.d/sshd;
chmod u+x /etc/init.d/sshd;
chkconfig --add sshd ##自启动
chkconfig --list |grep sshd;
chkconfig sshd on
#备份启动脚本,不一定有
if [ -f "/usr/lib/systemd/system/sshd.service" ];then
mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service_bak
else
echo -e " sshd.service不存在" "\033[31m Not backed up(可忽略)\033[0m"
fi
#备份复制sshd.pam文件
if [ -f "/etc/pam.d/sshd.pam" ];then
mv /etc/pam.d/sshd.pam /etc/pam.d/sshd.pam_$date_time.bak
else
echo -e " sshd.pam不存在" "\033[31m Not backed up(可忽略)\033[0m"
fi
cp -rf $file_install/$openssh_version/contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
#迁移ssh_config
cp -rf $file_install/$openssh_version/sshd_config /etc/ssh/sshd_config
sed -i 's/Subsystem/#Subsystem/g' /etc/ssh/sshd_config
echo "Subsystem sftp $default/$openssh_version/libexec/sftp-server" >> /etc/ssh/sshd_config
cp -rf $default/$openssh_version/sbin/sshd /usr/sbin/sshd
cp -rf /$default/$openssh_version/bin/ssh /usr/bin/ssh
cp -rf $default/$openssh_version/bin/ssh-keygen /usr/bin/ssh-keygen
sed -i 's/#PasswordAuthentication\ yes/PasswordAuthentication\ yes/g' /etc/ssh/sshd_config
#grep -v "[[:space:]]*#" /etc/ssh/sshd_config |grep "PubkeyAuthentication yes"
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
#重启sshd
service sshd start > /dev/null 2>&1
if [ $? -eq 0 ];then
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 启动OpenSSH服务成功" "\033[32m Success\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo ""
sleep 2
#删除源码包(可修改)
rm -rf $file/*$zlib_version.tar.gz
rm -rf $file/*$openssl_version.tar.gz
rm -rf $file/*$openssh_version.tar.gz
#rm -rf $file_install
echo -e "\033[33m 3.4-正在输出 OpenSSH 版本...... \033[0m"
sleep 3
echo ""
echo -e "\033[32m==================== OpenSSH veriosn =================== \033[0m"
echo ""
ssh -V
echo ""
echo -e "\033[32m======================================================== \033[0m"
else
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
echo -e " 启动OpenSSH服务失败,脚本退出中......" "\033[31m Error\033[0m"
echo -e "\033[33m--------------------------------------------------------------- \033[0m"
sleep 4
exit
fi
echo ""
}
End_install()
{
##sshd状态
echo ""
echo -e "\033[33m 输出sshd服务状态: \033[33m"
sleep 2
echo ""
systemctl status sshd.service
echo ""
echo ""
echo ""
sleep 1
echo -e "\033[33m==================== OpenSSH file =================== \033[0m"
echo ""
echo -e " Openssh升级安装目录请前往: "
cd $file_install && pwd
cd ~
echo ""
echo -e " Openssh升级备份目录请前往: "
cd $file_backup && pwd
cd ~
echo ""
echo -e " Openssh升级日志目录请前往: "
cd $file_log && pwd
cd ~
echo ""
echo -e "\033[33m======================================================= \033[0m"
}
Install_make
Install_backup
Remove_openssh
Install_tar
Install_zlib
Install_openssl
Install_openssh
End_install
sh updateOpenssh.sh
FAQ
1、在使用Linux过程中找不到占据空间的大文件的解决方法
- 背景
磁盘使用率爆满,但是未定位到目录在使用Linux过程中找不到占据空间的大文件的解决方法
du -sh ./* --exclude="data" --exclude="proc"
- 定位
使用 lsof 找到删除的文件,可以发现已经占用 230g 左右(根据下方的字节单位换算的)
lsof -n |grep delete |grep -v data
- 解决
重启对应进程解决即可
systemctl restart mallard2-agent.service