Linux入门到精通

一、绪论

1.1、简介

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
常见市面的Linux操作系统有redhat、centos、ubuntu、Fedora等等

1.2、启动过程

image

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、防火墙端口转发策略

image

端口转发是指传统的目标地址映射,实现外网访问内网资源,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系统,刷新后的终端提示信息会变成自定义的文本内容,如下所示。
image

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、实战
    image
    说明:

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系统。
image
为了实现目的,我们需要创建一个 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

image

  • 解决
    重启对应进程解决即可
systemctl restart mallard2-agent.service
posted @ 2022-12-19 15:07  jluo123  阅读(289)  评论(0编辑  收藏  举报