#!/bin/bash source /etc/profile :<<COMMENT .... Author: xiao.li yousong.xiang .... Date: 2020-02-10 2021.1.27 .... version:0.0.1 .... Description: Centos7初始化脚本,局部功能调整 .... Alter: COMMENT ################################################################ #环境检测 function env_check() { if [ -f /var/log/init.log ];then echo -e "\033[31;49;1m[`date +%F' '%T`] Error: 此系统已经初始化过,请检查。 \033[39;49;0m" echo -e "\033[31;49;1m[`date +%F' '%T`] Error: 上次初始化时间为 `awk '{print $1,$2}' /var/log/init.log` \033[39;49;0m" sleep 5s exit 1 fi if [ $(id -u) -ne 0 ];then echo '=== 此脚本需要root用户执行,即将退出脚本 ===' sleep 5s exit 2 fi if (! ping -c1 -w20 www.baidu.com > /dev/null 2>&1);then echo '=== 访问internet异常,即将退出脚本 ===' sleep 5s exit 3 fi export install_bak_path='/opt/install_bak' #export white_list='59.37.47.22,183.62.140.90' export opadm_set_stat='opadm_set_stat' [ -d ${install_bak_path} ] || mkdir -p ${install_bak_path} [ -f ${install_bak_path}/${opadm_set_stat} ] || touch ${install_bak_path}/${opadm_set_stat} } #同步系统时间 function set_date() { timedatectl set-timezone Asia/Shanghai >/dev/null >&1 yum -y install epel-release ntp >/dev/null >&1 /usr/sbin/ntpdate cn.pool.ntp.org >/dev/null >&1 echo "* 4 * * * /usr/sbin/ntpdate cn.pool.ntp.org > /dev/null 2>&1" >> /var/spool/cron/root systemctl restart crond.service >/dev/null >&1 } #安装基本软件 function install_base_soft() { yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm >/dev/null >&1 #bsoft_list=(man yum-plugin-fastestmirror vim-enhanced ntp wget bash-completion elinks lrzsz unix2dos dos2unix git unzip python python-devel python-pip net-tools) #for basesoft in ${bsoft_list[*]};do rpm -q "$basesoft" > /dev/null || yum -y install "$basesoft" >/dev/null >&1;done yum install -y man yum-plugin-fastestmirror vim-enhanced ntp wget bash-completion elinks lrzsz unix2dos dos2unix git unzip python python-devel python-pip net-tools >/dev/null >&1 } #添加su用户 function set_su_admin() { ADMGROUP=opadm ADMUSER=opadm if (! id "$ADMUSER" > /dev/null 2>&1);then groupadd "$ADMGROUP" >/dev/null >&1 && useradd -g "$ADMGROUP" -G wheel "$ADMUSER" >/dev/null >&1 && \ echo "$ADMUSER:\$6\$75s94X0p\$qrr9ahVu0OeeGXc92QwD3/2H2be.ZWAsEr9/j5O6EIcSwccpc7Utb.kGX03lmZWmR/jldHiSFdjY.S.gsA/jA0" | chpasswd -e && \ sed -i '/pam_wheel.so\ use_uid/s/\#auth/auth/' /etc/pam.d/su && echo -e "root:\t$ADMUSER" >> /etc/aliases && newaliases echo "add user: $ADMUSER " >/dev/null >&1 chmod 700 /etc/sudoers echo "$ADMUSER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers chmod 440 /etc/sudoers fi } #设置sudoers function set_su_default_tty() { if (grep -q '^Defaults requiretty$' /etc/sudoers);then chmod 700 /etc/sudoers sed -i '/^Defaults requiretty$/s/^/#/' /etc/sudoers chmod 440 /etc/sudoers fi } #设置ssh禁止root登录 function set_sshroot() { if (! grep -qE '^###ops_diy_flag_sshroot$' /etc/ssh/sshd_config);then echo '###ops_diy_flag_sshroot' >> /etc/ssh/sshd_config if [ $(grep '^PermitRootLogin\ \+yes\ *$' /etc/ssh/sshd_config|wc -l) -ge 1 ];then sed -i "s/^PermitRootLogin\ \+yes\ *$/PermitRootLogin\ no/" /etc/ssh/sshd_config elif [ $(grep '^#PermitRootLogin\ \+yes\ *$' /etc/ssh/sshd_config|wc -l) -ge 1 ];then sed -i "s/^#PermitRootLogin\ \+yes\ *$/PermitRootLogin\ no/" /etc/ssh/sshd_config elif [ $(grep '^[#]\{2,\}PermitRootLogin\ \+yes\ *$' /etc/ssh/sshd_config|wc -l) -ge 1 ];then sed -i "s/[#]\{2,\}PermitRootLogin\ \+yes\ *$/PermitRootLogin\ no/" /etc/ssh/sshd_config else echo 'PermitRootLogin no' >> /etc/ssh/sshd_config fi if (sshd -t);then systemctl restart sshd.service >/dev/null >&1 else echo " sshd_config 配置文件有错误,请检查配置,即将退出脚本 " exit 4 fi fi } #设置ssh端口 function set_sshport(){ export mysshlistenport='21235' if (! grep -qE '^###ops_diy_flag_sshport$' /etc/ssh/sshd_config);then echo '###ops_diy_flag_sshport' >> /etc/ssh/sshd_config if [ $(grep '^Port\ \+[0-9]\{2,5\}\ *$' /etc/ssh/sshd_config|wc -l) -eq 1 ];then sed -i "s/^Port\ \+[0-9]\{2,5\}\ *$/Port ${mysshlistenport}/" /etc/ssh/sshd_config elif [ $(grep '^Port\ \+[0-9]\{2,5\}\ *$' /etc/ssh/sshd_config|wc -l) -ge 2 ];then sed -i "/^Port\ \+[0-9]\{2,5\}\ *$/s/^/#/" /etc/ssh/sshd_config sed -i "0,/^#Port\ \+[0-9]\{2,5\}\ *$/s//Port ${mysshlistenport}/" /etc/ssh/sshd_config elif [ $(grep '^#Port\ \+[0-9]\{2,5\}\ *$' /etc/ssh/sshd_config|wc -l) -eq 1 ];then sed -i "s/^#Port\ \+[0-9]\{2,5\}\ *$/Port ${mysshlistenport}/" /etc/ssh/sshd_config elif [ $(grep '^#Port\ \+[0-9]\{2,5\}\ *$' /etc/ssh/sshd_config|wc -l) -ge 2 ];then sed -i "/^#Port\ \+[0-9]\{2,5\}\ *$/s/^/#/" /etc/ssh/sshd_config sed -i "0,/^#Port\ \+[0-9]\{2,5\}\ *$/s//Port ${mysshlistenport}/" /etc/ssh/sshd_config fi sed -i "s/^#UseDNS yes/UseDNS no/" /etc/ssh/sshd_config if (sshd -t);then echo " sshd_config 配置文件正确 " >/dev/null >&1 #systemctl restart sshd.service >/dev/null >&1 else echo " sshd_config 配置文件有错误,请检查配置,即将退出脚本 " exit 4 fi fi } #设置limits function systemd() { mkdir -p /etc/systemd/system.conf.d/ >/dev/null >&1 cat << EOF >/etc/systemd/system.conf.d/limits.conf [Manager] DefaultLimitNOFILE=65535 EOF systemctl daemon-reexec >/dev/null >&1 } #设置防火墙服务 function set_iptables() { #判断是否开启防火墙 firewall-cmd --list-all &>/dev/null if [ $? -ne 0 ]; then return 4 fi systemctl enable firewalld.service >/dev/null >&1 systemctl restart firewalld.service >/dev/null >&1 } #设置防火墙规则 function set_iptrules(){ #判断是否开启防火墙 firewall-cmd --list-all &>/dev/null if [ $? -ne 0 ]; then return 4 fi #开放http协议 firewall-cmd --permanent --zone=public --add-service=http >/dev/null >&1 #禁ping #firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent #禁止开放ssh服务端口 #firewall-cmd --permanent --zone=public --remove-service=ssh #开放ssh服务 firewall-cmd --permanent --zone=public --add-port=21235/tcp >/dev/null >&1 #允许某ip段访问ssh端口 #firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.98.0.0/24" service name="ssh" accept" #firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="6379" accept" #重新加载防火墙配置 firewall-cmd --reload >/dev/null >&1 } #禁用selinux function set_selinux() { if [ $(grep -cE '^SELINUX=disabled$' /etc/selinux/config) -eq 0 ];then /usr/sbin/setenforce 0 sed -i '/^SELINUX=/s/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config >/dev/null >&1 echo "selinux is disabled,you must reboot!" >/dev/null >&1 fi } #设置中文语言 function set_lang_cn() { grep -q 'zh_CN.UTF-8' /etc/locale.conf || sed -i -E 's/^LANG=.*/LANG="zh_CN.UTF-8"/' /etc/locale.conf } #配置内核参数 function set_sysctl() { grep -qE '^###ops_diy_flag_limits$' /etc/security/limits.conf || \ echo "###ops_diy_flag_limits * soft nofile 52100 * hard nofile 52100 * soft nproc 32768 * hard nproc 65536 * soft core 0" >> /etc/security/limits.conf [ -f /etc/sysctl.conf ] || touch /etc/sysctl.conf if (! grep -qE '^###ops_diy_flag_sysctl$' /etc/sysctl.conf);then mv /etc/sysctl.conf /etc/sysctl.conf_bak iMyRam=`free -m|grep Mem:|awk '{print $2}'` ikernel_shmmax=`expr $iMyRam \* 1024 \* 1024 \* 80 \/ 100` echo "###ops_diy_flag_sysctl net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 #kernel.shmmax = ${ikernel_shmmax} #kernel.shmall = 134217728 #net.ipv4.ip_local_port_range = 10240 63535 #net.ipv4.ip_local_reserved_ports = 10241, 10242-12000 net.ipv4.ip_local_port_range = 30000 63535 net.ipv4.tcp_max_tw_buckets = 9000 net.ipv4.tcp_keepalive_time = 180 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 2 net.ipv6.conf.all.disable_ipv6 = 1 net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 #net.nf_conntrack_max = 524288 net.ipv4.tcp_fin_timeout = 30 #net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.core.netdev_max_backlog = 30000 net.core.somaxconn = 65535 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 vm.swappiness = 5 vm.overcommit_memory = 1 fs.file-max = 4096000 kernel.ctrl-alt-del = 1" > /etc/sysctl.conf sysctl -p /etc/sysctl.conf >/dev/null >&1 fi } #分区 function set_op_fdisk() { op_dlabel='op_data' op_mount_dst='/data' if $(fdisk -l | grep -q "${1}");then : else echo "=== 目标磁盘不存在 ===" return 4 fi part_num=$(fdisk -l $1 | grep -o "^$1[1-9]\>" | tr -d [[:punct:]] | tr -d 'A-Za-z' | sort -n | tail -1) if [ -z ${part_num} ];then fdisk $1 &> ${install_bak_path}/fdisk.log <<EOF n p 1 1 w EOF mkfs.xfs -f ${1}1 [ -d ${op_mount_dst} ] || mkdir -p ${op_mount_dst} grep -q "${1}1" /etc/fstab || echo "${1}1 ${op_mount_dst} xfs defaults 0 0" >>/etc/fstab mount -a && mount && df -h elif [ ${part_num} -ge 1 ];then echo '' echo '=== 目标磁盘分区数量不为零,为保护数据不进行分区 ===' echo '' return 5 fi } #初始化日志 function set_logs(){ echo `date +%F' '%T` 服务器初始化完成 >>/var/log/init.log chattr +i /var/log/init.log } #main函数入口函数 function main() { pids="" echo -e '正在初始化操作系统:' echo -ne '#.......................................................................................................... (1%) [环境检测]\r' sleep .5 #环境检测 env_check pids+=($!) echo -ne '#########.................................................................................................. (8%) [同步系统时间]\r' sleep .5 #同步系统时间 set_date pids+=($!) echo -ne '##################......................................................................................... (16%) [禁用selinux]\r' sleep .5 #禁用selinux set_selinux pids+=($!) echo -ne '###########################................................................................................ (24%) [安装基本软件]\r' sleep .5 #安装基本软件 install_base_soft pids+=($!) echo -ne '####################################....................................................................... (32%) [添加su用户]\r' sleep .5 #添加su用户 set_su_admin pids+=($!) echo -ne '############################################............................................................... (40%) [设置sudoers]\r' sleep .5 #设置sudoers set_su_default_tty pids+=($!) echo -ne '#####################################################...................................................... (48%) [设置禁止root登录]\r' sleep .5 #设置ssh禁止root登录 set_sshroot pids+=($!) echo -ne '#############################################################.............................................. (56%) [设置ssh端口]\r' sleep .5 #设置ssh端口 set_sshport pids+=($!) echo -ne '###################################################################......................................... (64%) [设置limits]\r' sleep .5 #设置limits systemd pids+=($!) echo -ne '##########################################################################.................................. (72%) [设置防火墙服务]\r' sleep .5 #设置防火墙服务 set_iptables pids+=($!) echo -ne '##################################################################################.......................... (80%) [设置防火墙规则]\r' sleep .5 #设置防火墙规则,阿里云、aws默认firewalld关闭状态 set_iptrules pids+=($!) #echo -ne '###########################################################################################................. (88%) [设置中文语言]\r' #sleep .5 #设置中文语言 #set_lang_cn #pids+=($!) echo -ne '################################################################################################............ (93%) [配置内核参数]\r' sleep .5 #配置内核参数 set_sysctl pids+=($!) echo -ne '######################################################################################################...... (98%) [初始化成功日志]\r' sleep .5 #初始化成功日志 set_logs pids+=($!) echo -ne '############################################################################################################ (100%) [初始化完成了,请重启服务器]\r' sleep .5 #请重启服务器 sleep 2 } main