Linux管理菜单

Linux管理菜单 shell

终极Linux运维菜单(Cent OS)

每台机reset

#关闭SELINUX
SELINUX(){
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
        [ $? -eq 0 ]  && echo "SELINUX设置成功" 
        grep "^SELINUX=" /etc/selinux/config
        color selinux 0
}

FUN娱乐

#!/bin/bash
##两种方法:if不加[],判断;或者是先判断grep的结果,还是不需要[]
##判断语句的时候,不需要+[]

grep '^#name' /root/0629test
if [ $? -eq 0 ];then
        sed -i 's/#name/name/g' /root/0629test
fi


if grep '^#name' /root/0629test ;then
        sed -i 's/#name/name/g' /root/0629test
fi

数组比较RANDOM最大值/最小值

定义声明数组declare

declare -i min max
declare -a RAN
for ((i=0;i<10;i++));do
        ##RANDOM里面每个数字都赋值
        RAN[$i]=$RANDOM
        [ $i -eq 0 ] && min=${RAN[0]} && max=${RAN[0]}  && continue
        [ ${RAN[$i]} -gt $max ] && max=${RAN[$i]} && continue
        [ ${RAN[$i]} -lt $min ] && min=${RAN[$i]}
done


#RAN=$RANDOM
#echo ${RAN[0]}
echo "all number is:${RAN[*]}"
echo "min is:$min, max is:$max"
#echo ${}

1.系统管理方面

根据OS版本不同使用不同的命令安装(yum/apt)

#!/bin/bash
OS=`awk -F= '/^NAME/{print $2}' /etc/os-release | sed 's/\"//g'`
if [ $OS == "Centos Linux" ];then
		yum update
        yum -y install chrony
elif [ $OS == "Ubuntu" ];then
		apt update
        apt install -y chrony
else
        echo "unknown $OS"
        exit 2
fi

bash输出颜色

image-20220723102907759

系统全参数输出(持续更新)

#!/bin/bash

system(){

echo "#########################系统信息#########################"
os_type=`uname -r` ##内核信息
os_version=`cat /etc/os-release` ##OS版本
os_kernal=`hostnamectl | grep "Ker" | awk -F: '{print $2}'` ##
os_time=`date +%F_%T`
os_runtime=`uptime | awk -F, '{print $2}'`
os_lastest_boot=`who -b | awk '{print $3}'`
os_hostname=`hostname`

echo "	系统类型:$os_type"
echo "	系统版本:$os_version"
echo "	系统内核:$os_kernal"
echo "	系统时间:$os_time"

echo "	运行时间:$os_runtime"
echo "	最后重启时间:$os_lastest_boot"
echo "	本机名称:$os_hostname"

}


network(){
echo "#########################网络信息#########################"
#或者是grep -w inet
os_ip=`ifconfig | grep inet | awk 'NR==1{print $2}'`
os_ip2=`curl -s icanhazip.com`

echo "	本机内网IP:$os_ip"
echo "	本机公网IP:$os_ip2"

ping -c 2 www.baidu.com &>/dev/null
if [ $? -eq 0 ];then
	echo "	访问外网成功"
else
	echo "	访问外网失败,请检查网络" 
fi


}


hardware(){
echo "#########################CPU信息#########################"
os_cpuid=`grep "physical id" /proc/cpuinfo | wc -l`
os_cpucore=`grep "cores" /proc/cpuinfo | sort | uniq | awk -F: '{print $2}'`
os_cpumode=`grep "model name" /proc/cpuinfo | sort | uniq | awk -F: '{print $2}'`

echo "	CPU数量:${os_cpuid}个"
echo "	CPU核数:${os_cpucore}个"
echo "	CPU型号:$os_cpumode" 

echo "#########################内存信息#########################"
mem_total=`free -h | grep Mem | awk '{print $2}'`
mem_free=`free -h | grep Mem | awk '{print $7}'`

echo "	内存总容量为:$mem_total"
echo "	内存剩余容量:$mem_free"


echo "#########################硬盘信息#########################"
disk_size=`df -h | grep /dev/vda1  | awk '{print $2}'`
disk_lastsize=`df -h | grep /dev/vda1 | awk '{print $4}'` 

echo "	系统盘容量为:$disk_size"
echo "	系统盘剩余容量为:$disk_lastsize"

}

while :
do

read -p "input your choice(system|network|hardware):" choice

case $choice in
	"system")
	system;
	;;
	"network")
	network;
	;;
	"hardware")
	hardware;
	;;
	*)
	echo "input error,ended"
	break
esac

done

更新本机的时区,安装时间服务chrony

vim timeset.sh
cp -p /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
yum -y install chrony

sed -i 's/server/#server/g' /etc/chrony.conf

cat >> /etc/chrony.conf << EOF
server ntp.myhuaweicloud.com iburst
server ntp.aliyun.com
server time1.cloud.tencent.com
EOF

cat /etc/chrony.conf | grep server
systemctl enable --now chronyd

主界面(cat << EOF EOF)

主界面可以单独一个shell,其他的shell可以通过目录内的其他脚本执行,也可以写在同一个脚本内,调用不同的函数

Linux运维每天常见的一些工作,后期可以用case+函数function来定义每一个输入的数字执行的东西,调用的函数function

写好function函数就行

##
echo -en "\E[$[RANDOM%7+31];1m" 
cat <<EOF
请选择:
1)关闭SELINUX
2)关闭防火墙
3)修改SSH端口
4)创建用户申请16位随机密码
5)删库跑路
EOF
echo -en '\E[0m'


read -p "Choose the menu(1-5): "  MENU


[ $MENU -eq 1 ] && echo  备份数据库
[ $MENU -eq 2 ] && echo  清理日志
[ $MENU -eq 3 ] && echo  软件升级
[ $MENU -eq 4 ] && echo  软件回滚
[ $MENU -eq 5 ] && echo  删库跑路


    

清除系统未写入硬盘的缓存(cache)

有时候在看系统内存的时候,会出现I/O缓存区过多,也就是数据在缓存内(内存内),没有写进磁盘,导致使用系统内存过多

将未写进磁盘的数据写到磁盘内

img

sync
echo 1 > /proc/sys/vm/drop_caches 
echo 2 > /proc/sys/vm/drop_caches 
echo 3 > /proc/sys/vm/drop_caches

清理完毕后,free就变多了

img

关闭SELINUX

##关闭SELINUX
sed -i 's/SELINUX=enable/SELINUX=disabled/g' /etc/selinux/config
grep -E '^SELINUX' /etc/selinux/config

根据系统版本关闭防火墙

因为Cent OS7和Cent OS6的操作命令不一样,所以需要先去/etc/centos-release或者是/etc/redhat-release查看系统版本

这里使用egrep来查找,扩展正则表达式

##根据版本关闭防火墙,不用加[]判断,直接if+cmd--->非常常用,使用grep作为扩展正则,不然要加egrep
FIREWALL(){
        if grep -E '7.[0-9]' /etc/redhat-release;then
                systemctl stop firewalld
                systemctl disable firewalld
                color centos7防火墙关闭 0
        elif grep -E '6.[0-9]' /etc/redhat-release;then
                service firewalld stop
                chkconfig firewalld off
                color centos6防火墙关闭 0
        else
                exit 1
        fi
}

修改SSH端口以及相关配置

1.原先是注释掉的,现在修改为1258

2.启动存活检测,检测周期为30s,即基本不中断,如果在生产节点就看看

##修改SSH端口为1258
sed -i 's/#Port 22/Port 1258/g' /etc/ssh/sshd_config
##启动存活检测,检测周期为30s,即基本不中断,如果在生产节点就看看
sed -i 's/#ClientAliveInterval/ClientAliveInterval 30/g' /etc/ssh/sshd_config
##启动连接限制,最大为3个SSH连接
sed -i 's/#ClientAliveCountMax/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
grep -w "Port" /etc/ssh/sshd_config

添加用户并且申请16位的随机密码

tr -dc '[:alnum:]' 和 tr -dc '[a-zA-Z0-9]':tr -dc将文件所有的字符替换成小写大写字母+数字

id $user检测user是否存在

passwd:标准输出到user

将新增的用户名+新增的密码重定向到pass.txt上面

批量添加的话可以写好一个user.txt和passwd.txt,也可以指定赋予

read -p "please input your username: " user
##替换大小写字母+数字
passwd=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 16)
#passwd=$(cat /dev/urandom | tr -dc '[a-zA-Z0-9]' | head -c 16)
id $user && { echo "user exists"; exit ; } || { useradd $user ; echo "$user create success" ; }
echo $passwd | passwd --stdin $user
[ $? -eq 0 ] && echo "user create success" || { echo "create fail" ; exit ;}
echo "username:$user passwd:$passwd" >> pass.txt

系统资源基本资源使用输出

##系统资源监控
RED="\E[1;34m"
GREEN="echo -e \E[1;35m"
END="\E[0m"
.  /etc/os-release


$GREEN----------------------Host systeminfo--------------------$END
echo -e  "HOSTNAME:     $RED`hostname`$END"
#echo -e  "IPADDR:       $RED` ifconfig eth0|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e  "IPADDR:       $RED` hostname -I`$END"
echo -e  "internet:     $RED`curl -s icanhazip.com`$END"
echo -e  "OSVERSION:    $RED$PRETTY_NAME$END"
echo -e  "KERNEL:       $RED`uname -r`$END"
echo -e  "CPU:         $RED`lscpu|grep '^Model name'|tr -s ' '|cut -d : -f2`$END"
echo -e  "MEMORY:       $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e  "DISK:         $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
$GREEN---------------------------------------------------------$END

自动对磁盘进行分区、格式化、挂载

【新数据盘的挂在思路】

建立分区---保存---写入系统内核---赋予文件系统格式化---挂载到指定目录---设置开机自动挂载

【磁盘自动分区,格式化,挂载,写入到fstab】

一般来说,MBR分区最多只支持创建四个分区(包括4个主分区,或者是3个主分区1个扩展分区)

所以1-4循环创建4个分区,一个分区为3G,最后一个分区全部分配

注意:在每个分区创建好后,w保存了要执行partprobe写入到磁盘

格式化,创目录,挂载,自动挂载(记得写好变量名)

for i in {1..4}
do
fdisk /dev/vdb <<EOF
n
p




+3G
w
EOF
partprobe


mkfs.ext4 /dev/vdb$i
mkdir -p /mnt/mount$i
mount /dev/vdb$i /mnt/mount$i


#这一段先不写上
#UUID=$(blkid /dev/vdb$i | awk '{print $2}' | sed 's/"//g')
#echo "$UUID /mnt/mount$i ext4 defaults 0 0 " >> /etc/fstab
#mount -a


if [ $? -eq 0 ];then
        echo "挂在成功"
else
        echo "挂载失败"
fi
#umount /dev/vdb1
done
df -Th

【自动删除现有分区】

for i in {1..4}
do
        umount /dev/vdb$i
done


fdisk /dev/vdb <<EOF
d


d


d


d
w
EOF


partprobe


df -Th

从1+100【各类变换式】

记住:((sum+=i)),这个是计算的符号,可以经常使用

tr -d:删除掉某个字符

tr -dc:替换掉除了'[a-z][A-Z][0-9]'之外的所有都替换成这个

##将1-100的空格换成+号,不用加任何参数,然后bc计算
echo {1..100} | tr  " " + | bc
##计算奇数的相加
echo {1..100..2} | tr ' ' + | bc


##a=20 b=20 c=40在一个1.txt内,这三个数字想加
cut -d"=" -f2 1.txt | xargs | tr ' ' + | bc
80


sum=0
for i in {1..100};do
        ((sum+=i))
done
echo "sum is $sum"


i=1
sum=0
while ((i<=100)) ; 
do
        ((sum+=i))
        let i++
done
echo "sum is $sum"


##continue的用法
sum=0
for i in {1..100};do
        if [ $[$i%2] -eq 0 ];then continue; fi
        ((sum+=i))
done
echo $sum

2.判断监控类

批量ping局域网内主机(并行任务改良版)

在原有的基础上加入了{}&并行任务,实现254个指令在后台并行执行,1s内输出结果,可以后续添加输出到文本中记录

1s内执行完ping整个局域网的主机ip

local NET=192.168.0
        for i in {1..254};do
        ##ping1次,等待1s,没回应就下一个
        ##这里加个{}&,表示并行执行该任务
        {
        if [ ping -c 1 -w 1 $NET.$i &> /dev/null ];then
                echo "$NET.$i is success"
        else
                echo "$NET.$i is down"
        fi
        }&
        done
        ##这里表示结束ping状态,不然会退出不了
        wait

nc -z 批量化扫描端口的存活(并行任务版)

SCAN_PORT(){
        local NET=192.168.0.3


        for i in {1..1258};do
        {
        nc -z $NET $i
                if [ $? -eq 0 ];then
                        echo "port $i is up"
                else
                        echo "port $i is down"
                fi
        }&
        done
        wait
}

判断IP地址是否输入合法

{1,3}:表示1个数字到3个数字

{1..3}:表示从1到3,123三个数字,不是表示数量,后面结尾$不用加()

read -p "请输入你要的IP:" IP
 [[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] && echo "合法IP" || echo "非法IP"

判断BMI是否超过标准值

read -p "input your HEIGHT: " HEIGHT
read -p "input your WEIGHT: " WEIGHT


#转义小数点
[[ ! $HEIGHT =~ ^([0-2]{1}\.)[0-9]{1,2}$ ]] && echo "invalid HEIGHT" 
[[ ! $WEIGHT =~ ^([0-9]{1,3})$ ]] && echo "invalid WEIGHT" 


#$HEIGHT^2=平方
BMI=`echo "$WEIGHT/($HEIGHT*$HEIGHT)" | bc `
echo "your BMI is:$BMI "


if [ $BMI -lt 18 ];then
        echo "low WEIGHT"
elif [ $BMI -ge 24 ];then
        echo "over WEIGHT"
else
        echo "FAT"

批量化监听某一些主机的端口范围是否开启(nc)

nc命令:netcat命令,用于监听某个主机的端口

命令格式:nc -z 192.168.0.1 22,检测1-50的端口

NET=192.168.0.3
for i in {1..50};do
        nc -z $NET $i
        if [ $? -eq 0 ];then
                echo "port $i is up"
        fi
done

逐行检查/dev磁盘的使用率是否大于80%(while read)

原来只能检查一个盘,现在我要找出所有/dev/开头的盘,并且监察他们的使用率是否超过80

逐行检查df -h内每个以/dev/开头的磁盘的使用率

##awk -F" "以空行为分隔符输出磁盘使用率那一列,删除掉百分号
##这个结果作为while read的输入,变量为use(逐行读取的为use),如果逐行扫描大于80了,则报警并且输出这个值
df -h | grep "^/dev/" | awk -F" " '{print $5}' | tr -d G | while read usge;do
        if [ $usge -gt 80 ];then
                echo "$usge"     
        fi
done


##可加入到定时任务crontab中

killall -0监控服务状态

##可以配置到定时任务,比如每5min执行一次
svc=nginx
killall -0 $svc &> /dev/null 
if [ $? -eq 0 ];then
        echo "$svc正常"
else
        systemctl restart $svc
        echo "$svc重启成功"
        systemctl status $svc
fi

selectin点菜机

##PS=3专门是这种的变量输出
PS3="请点菜(1-6):"
select ORDER in 白切鸡 咖喱鸡扒 滑蛋叉烧 牛扒 回锅肉 卤鸭腿;do
case $REPLY in
        1)
                echo $ORDER 价格是50
                ((sum+=50))
                ;;
        2)
                echo $ORDER 价格是88
                ((sum+=88))
                ;;
        3)
                echo $ORDER 价格是70
                ((sum+=70))
                ;;
        4)
                echo $ORDER 价格是108
                ((sum+=108))
                ;;
        5)
                echo $ORDER 价格是45
                ((sum+=45))
                ;;
        6)
                echo $ORDER 价格是40
                ((sum+=40))
                ;;
        *)
                echo "点菜结束"
                break
                ;;
        esac
done

echo "您总共消费:$sum"

3.实战类

批量将.jpg文件的大写名字改为小写名字,包括后缀

目前来说还是只能转换全部大写或者小写,还不能指定.jpg文件,更改前缀

##输出5个随机字符串组成的前缀,后缀固定位jpg
for i in {1..5};do
        val=`cat /dev/urandom | tr -dc "[:alnum:]" | head -c 5`
        touch $val.jpg
done

#其实也可以用rename,把大写和小写的文件都写好,prename也可以,需要安装一下prename的包
##初版使用prename或者mv都可以
for i in `ls | grep .jpg`;do
        prename "y/[a-z\.jpg]/[A-Z\.jpg]/" $i
done
ls

mv $i `echo $i | tr A-Z a-z`

实现一台主机批量化复制秘钥到对端主机,免密登录(密钥对登录)

##定义主机IP
host="
192.168.244.132
192.168.244.133
"
pass1=123
pass2=Caiwj@1258!
cd /root 

##先删除掉本地的.ssh配置
rm -rf .ssh
##本机生成ssh的公钥和私钥,指定目录为默认目录
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
##rpm -q查看包是否安装,这里可以区别Ubuntu或者是Cent OS
rpm -q sshpass && echo "sshpass already install" || yum -y install sshpass

##对于同一个网段(端口)来说,一般来说都是22,可以这样实现
for i in ${host};do
        sshpass -p $pass1 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i
#       sshpass -p $pass1 ssh -o StrictHostKeyChecking=no $i "echo `hostname -I` >> /root/ip"
        ssh $i "echo `hostname -I`"
done

#sshpass -p $pass2  -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub 139.9.57.240
##对于非22,只能用expect直接在shell中写好交互式命令
expect <<EOF
        spawn ssh-copy-id -p 1258 root@139.9.57.240
        expect {
                "yes/no" {send "yes\n";exp_continue}
                "password" {send "Caiwj@1258!\n"}
        }
        expect eof
EOF

本文作者:Catyer

本文链接:https://www.cnblogs.com/catyer/p/16748398.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Catyer  阅读(127)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起