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输出颜色
系统全参数输出(持续更新)
#!/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缓存区过多,也就是数据在缓存内(内存内),没有写进磁盘,导致使用系统内存过多
将未写进磁盘的数据写到磁盘内
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
清理完毕后,free就变多了
关闭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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步