centos获取系统信息以及系统调优的shell脚本

#!/bin/bash
#2022-08-31
#已在在centos7系统下完成测试,获取系统信息和参数调优
#Madman

info () {
echo "
+-----------------------------------------------------------------+
| 项 | 内容 |
-------------------------------------------------------------------
| 0 | 硬件、系统信息输出 |
| 1 | 关闭防火墙selinux+关闭开机自启 |
| 2 | 配置网易yum源 |
| 3 | 使用Yum安装ntp并同步至阿里时间服务器 |
| 4 | 使用Yum安装telnet/lsof/vim/unzip/lrzsz/wget/curl/tcpdump常用命令 |
| 5 | 配置ulimit(最大连接数调优到409600) |
| 6 | 配置limits解除最大进程数和最大文件打开数限制 |
| 7 | 内核sysctl.conf的常用参数优化释义(只显示不进行优化) |
| 8 | 服务器字符集调整到utf-8 |
| 9 | 优化缩短TCP断开连接自动回收时间为20s |
| ssh | 配置ssh优化,加快连接速度(适配centos7) |
| ali | 配置阿里Yum源 |
| cad | 关闭ctrl+alt+del重启机器 |
| doc | 配置docker-ce镜像仓库(前提须装有yum和docker) |
|-----------------------------------------------------------------|
| |
+-----------------------------------------------------------------+
"
}
info
while read -p "请输入执行项(q退出,p重新打印执行项):" num
do
case $num in
0) #系统信息输出
function ling () {
#此脚本测试系统Centos6.x/centos7.x

#查看服务器硬件型号
hard_type=`dmidecode |grep "Product Name"|tr "\n" " "` #获取服务器型号
sn=`dmidecode |grep -A 3 "Product Name" |grep "Serial Number"|grep -v "None"` #获取硬件序列码

##系统信息
version=`cat /etc/redhat-release` #版本
kernel=`uname -r` #内核

##cpu
phy_cpu_num=`grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l` #物理CPU数量
nuclear=`grep vendor_id /proc/cpuinfo|wc -l` #逻辑核数(线程)

##内存\Swap
mem=`free -m|grep Mem|awk '{print $2"M"}'` #内存总大小
user_mem=`free -m|grep Mem|awk '{print $3"M"}'` #已用内存大小
swap=`free -m |grep Swap|awk '{print $2"M"}'` #swap总大小
user_swap=`free -m |grep Swap|awk '{print $3"M"}'` #已用swap大小

#最大支持内存数
max_memory=`dmidecode|grep -P 'Maximum\s+Capacity'`

##负载
loadavg=`uptime |awk -F: '{print $NF}'` #系统负载

##网络
network=`[[ $(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" www.baidu.com) -eq 200 ]] && echo yes || echo no` #根据curl www.baidu.com的返回状态码来判断是否能上网
ip_addr=`ip address|grep -w "inet"|grep -v "127.0.0.1"|awk -F "[ /]+" '{print $3,$NF}'` #获取除了回环地址之外的所有网卡的ip地址和对应的网卡名
##磁盘
disk_zong=`df -Th | grep -w '/' | awk '{print $3}'` #获取系统盘的总大小
disk_user=`df -Th | grep -w '/' | awk '{print $4}'` #获取系统盘已用大小
disk_lsbl=`lsblk` #硬盘分区分布
##其他
system_time=`awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime` #开机时长
sys_begin=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` #开机时间
##日志
system_log=`du -sh /var/log/ |awk '{print $1}'` #系统日志大小
#进程
tasks=`top -n1 |grep Tasks |awk '{print $2,$4,6}'` #总 运行 休眠

system(){
echo "
|硬件型号:
$hard_type
|序列号:
$sn
|版本: $version
|内核: $kernel

|物理CPU个数:$phy_cpu_num 逻辑核数: $nuclear""
|负载:$loadavg

|内存: $mem #最大支持内存:$max_memory
|已用: $user_mem
|swap: $swap
|已用: $user_swap

|是否可以上网: $network
|本地IP地址:
$ip_addr

|系统磁盘大小: $disk_zong
|系统磁盘已用: $disk_user
|日志: 系统日志大小为$system_log
|开机: $sys_begin
|至今: $system_time
硬盘分区
----------------------------------------------------------------------
$disk_lsbl
----------------------------------------------------------------------

----------------------------------------------------------------------
"
}
system
##端口扫描
echo "监听的端口扫描
----------------------------------------------------------------------"
portarray=(`sudo netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
length=${#portarray[@]}
printf "{\n"
printf '\t'port":"
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t\n"
printf "}\n"
echo "----------------------------------------------------------------------
"

}

ling
continue
;;
1) #关闭防火墙和linux+禁止开机自启
function yi () {
centos=`rpm -q centos-release|cut -d- -f3`
if [ $centos -eq 6 ];then
service iptables stop #关闭iptables
chkconfig iptables off #禁止iptables开机自启
service iptables status #输出防火墙状态
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config #永久关闭selinux
setenforce 0 #临时关闭selinux
echo -e "\033[32m SELINUX状态为`getenforce getenforce` \033[0m"
elif [ $centos -eq 7 ];then
systemctl stop firewalld #关闭firewalld
systemctl disable firewalld #禁止firewalld开机自启
echo -e "\033[32m 已执行关闭,防火墙selinux状态如下 \033[0m"
systemctl status firewalld |grep "Active" #查看防火墙状态
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config #永久关闭selinux
setenforce 0 #临时关闭selinux
elif [ $centos -eq 8 ];then
systemctl stop firewalld #关闭firewalld
systemctl disable firewalld #禁止firewalld开机自启
echo -e "\033[32m 已执行关闭,防火墙selinux状态如下 \033[0m"
systemctl status firewalld |grep "Active"#查看防火墙状态
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config #永久关闭selinux
setenforce 0 #临时关闭selinux
else
echo "系统识别错误,不等于centos6/7/8"
fi
}
yi
;;
2) #配置网易yum源
function er () {
if [ ! -d "/etc/yum.repos.d/backup/" ];then
mkdir -p /etc/yum.repos.d/backup
else
echo "文件夹已经存在,将yum文件移动至该文件夹..."
fi
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup/
wget -O /etc/yum.repos.d/CentOS-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum clean all
yum makecache
}
er
;;
3) #使用Yum安装ntp并进行时间同步至阿里时钟服务器,同时设置计划任务
function san () {
yum -y install ntp
ntpdate ntp1.aliyun.com #同步时间至阿里时间服务器
curr_user=`echo $USER`;
curr_path=$(pwd);
echo "0 2 * * * ntpdate ntp1.aliyun.com" >> "/var/spool/cron/$curr_user"
crontab -l
}
san
;;
4) #使用Yum安装telnet/lsof/vim/unzip/lrzsz/wget/curl/tcpdump等常用命令
function si () {
yum -y install telnet lsof vim unzip lrzsz wget curl tcpdump
echo -e "\033[32m 已为您列出本次安装的软件包列表: \033[0m"
yum list telnet lsof vim unzip lrzsz wget curl tcpdump 1 2>/dev/null|tail -8|awk '{print $1}'|grep -v "Loading"
}
si
;;
5) #配置ulimit(最大连接数调优到307200)
function wu () {
echo -e "ulimit -HSn 40960000" >>/etc/profile
echo -e "\033[32m ulimit调优内容如下: \033[0m"
grep 409600 /etc/profile
echo -e "\033[32m 需要手动执行"source /etc/profile"使其生效 \033[0m"
}
wu
;;
6) #配置limits解除最大进程数和最大文件打开数限制
function liu () {
echo -e "* soft nproc 65535\n* hard nproc 65535\n* soft nofile 65535\n* hard nofile 6553\n* - sigpending 6553" >>/etc/security/limits.conf
echo -e "\033[32m 调优配置如下 \033[0m"
tail -5 /etc/security/limits.conf
}
liu
;;
7) #sysctl.conf参数解释
qi () {
echo "
#设置系统对最大跟踪的TCP连接数的限制
net.ipv4.netfilter.ip_conntrack_max = 204800

#表示系统同时保持TIME_WAIT套接字的最大数量
net.ipv4.tcp_max_tw_buckets = 10000

#关闭tcp_sack,0关闭,1开启
net.ipv4.tcp_sack = 1

#关闭tcp_window_scaling,0关闭,1开启
net.ipv4.tcp_window_scaling = 1

#tcp读buff-rmem,tcp写buff-wmem。第一个值是缓冲区最小值,中间值是缓冲区的默认值,最后一个是缓冲区的最大值
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304

#定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过tcp_max_syn_backlog后,会丢弃后续的SYN报文。
net.ipv4.tcp_max_syn_backlog = 65536

#表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)。nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511.
net.core.netdev_max_backlog = 262144

#该参数用于调节系统同时发起的TCP连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,肯那个导致连接超时或重传问题
net.core.somaxconn = 262144

#发送套接字缓冲区大小的默认值(以字节为单位)
net.core.wmem_default = 8388608

#接收套接字缓冲区大小的默认值(以字节为单位)。
net.core.rmem_default = 8388608
#接收套接字缓冲区大小的最大值(以字节为单位)。
net.core.rmem_max = 16777216
#发送套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_max = 16777216

#不再检查时间戳
net.ipv4.tcp_timestamps = 0

#该参数用于设置内核放弃TCP 链接之前向客户端发送SYN+ACK 包的数量。为了简历对端的链接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN 并附带一个回应前一个SYN 的ACK ,这个参数主要影响这个过程,一般赋值为1,即内核放弃链接之前发送一次SYN+ACK 包
net.ipv4.tcp_synack_retries = 2
#表示应用程序进行connect()系统调用时,在对方不返回SYN + ACK的情况下(也就是超时的情况下),第一次发送之后,内核最多重试几次发送SYN包;并且决定了等待时间
net.ipv4.tcp_syn_retries = 2

#1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

#TCP最大缓冲区,单位KB
net.ipv4.tcp_mem = 94500000 915000000 927000000

#用于设定系统中最对允许存在多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的TCP套接字将立刻被复位,同时发出警告信息,这个限制知识为了防止简单的DoS(Denial of Service,拒绝服务)攻击,一般在系统内存比较充足的情况下,可以增大这个参数的赋值
net.ipv4.tcp_max_orphans = 3276800

#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
#net.ipv4.tcp_fin_timeout = 30

#tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800
#keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

#服务器某个端口可以连接的最大tcp数量是由四元组成的也就是(src_ip,src_port,dst_ip,dst_port)(本地ip,本地端口,客户端ip,客户端端口)。理论上在src_ip,src_port固定的情况下,一个客户端Ip理论上最多有65535个连接数。ip_local_port_range这个参数控制的就是dst_port的范围。
net.ipv4.ip_local_port_range = 1024 65000
"
}
qi
;;
8) #字符集UTF-8
function ba () {
utf=`echo $LANG|grep "UTF-8"|wc -l`
utf8=`localectl list-locales|grep "zh_CN.utf8"|wc -l`
if [ $utf -eq 1 ];then
echo -e "\033[32m 您的服务器字符集为`echo $LANG`,无需调整 \033[0m"
else
if [ $utf8 -eq 1 ];then
localectl set-locale LANG=zh_CN.utf8
echo "\033[32m 字符集已调整为UTF-8,需手动重启生效 \033[0m"
else
yum install -y kde-l10n-Chinese
localectl set-locale LANG=zh_CN.utf8
echo "\033[32m 字符集已调整为UTF-8,需手动重启生效 \033[0m"
fi
fi
}
ba
;;
9) #优化Linux中TCP断开等待时间
function jiu () {
tcpwait=`cat /proc/sys/net/ipv4/tcp_fin_timeout`
echo -e "\033[32m 您目前的TCP断开等待时间为:${tcpwait} \033[0m"
if [ $tcpwait -eq 20 ];then
echo -e "\033[32m 天呐,好棒,您已经优化到了很好的值! \033[0m"
else
echo "20" >/proc/sys/net/ipv4/tcp_fin_timeout
echo -e "\033[32m 已为您调整TCP断开等待时间参数值为${tcpwait} .\033[0m"
fi
}
jiu
;;ssh) #优化ssh配置
function sshc () {
sshconfig=`grep "UseDNS no" /etc/ssh/sshd_config |wc -l`
sshgss=`grep "GSSAPIAuthentication no" /etc/ssh/sshd_config |wc -l`
if [ $sshconfig -eq 1 ];then
echo -e "\033[32m 您SSH其中的UseDNS参数配置对了主人!牛啊牛啊 \033[0m"
else
sed -i 's/UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config 1>/dev/null
echo -e "\033[32m 改完了老板:`grep UseDNS /etc/ssh/sshd_config` \033[0m"
fi

if [ $sshgss -eq 1 ];then
echo -e "\033[32m 您SSH其中的GSSAPIAuthentication参数配置对了主人!牛啊牛啊 \033[0m"
else
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config 1>/dev/null
echo -e "\033[32m 改完了老板:`grep GSSAPIAuthentication /etc/ssh/sshd_config` \033[0m"
read -p "是否现在重启sshd生效(0现在重启,1不重启):" numm
if [ $numm -eq 0 ];then
systemctl restart sshd
elif [ $numm -eq 1 ];then
echo -e "\033[32m 听主人的先不重启 \033[0m"
else
echo -e "\033[32m 主人,只能输0和1 \033[0m"
fi

fi
}
sshc
;;
ali) #配置阿里yum源
function ali () {
if [ ! -d "/etc/yum.repos.d/backup/" ];then
mkdir -p /etc/yum.repos.d/backup
else
echo "文件夹已经存在,将yum文件移动至该文件夹..."
fi
mv /etc/yum.repos.d/* /etc/yum.repos.d/backup/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
}
ali
;;
cad) #关闭ctrl+alt+delete重启linux机器
function cad () {
if [ ! -d "/usr/lib/systemd/system/ctrl-alt-del.target" ];then
echo -e "\033[32m 主人安全性很强,俺检查到您已经关掉了 \033[0m"
else
rm -rf /usr/lib/systemd/system/ctrl-alt-del.target
echo -e "\033[32m 已经关闭 \033[0m"
fi
init q #重新加载init配置
}
cad
;;
doc) #配置docker-ce镜像仓库
function doc () {
yum -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo -e "\033[32m 主人,docker-ce镜像仓库配置完成了哦 \033[0m"
}
doc
;;
q) #返回值0
exit 0
;;
p) #重新打印执行项
info
;;
*) #错误警告
echo -e "\033[31m Error,输错了主人 \033[0m"
continue
esac
done

 

 

posted @ 2023-01-10 17:24  粉色纽扣  阅读(84)  评论(0编辑  收藏  举报