shell典型例题

shell典型例题

1.用户建立脚本

要求:
执行users_create.sh userlist passlist
建立userlist列表中的用户
设定userlist列表中的密码为passlist列表中
当脚本后跟的文件个数不足两个时,报错
当文件行数不一致时报错
当文件不存在时报错
当用户存在时报错
#!/bin/bash
ECHO()
{
    echo -e "\033[$1m$2\033[0m"
}

if [ "$USER" != "root" ]
##判断是否为超级用户
then
     ECHO 31 "Error: Please run $0 with root !!"
elif [ "$#" -lt "2" ]
then
     ECHO 31 "Error: Please input userlistfile and passwordlistfile is following!!!"
elif [ ! -e "$1" ]
then
     ECHO 31 "Error: $1 is not exist !!"
elif [ ! -e "$2" ]
then
     ECHO 31 "Error: $2 is not exist !!"
elif [ "`sed -n '$=' $1`" != "`sed -n '$=' $2`" ]
then
     ECHO 31 "Error: $1\'s line is different from $2!!!"
else
     NUM=`sed -n '$=' $1`
     ##统计最后一行行数
     for LINE in for LINE in `seq 1 $NUM`
     do
         USERNAME=`sed -n ${LINE}p $1` 
         PASSWORD=`sed -n ${LINE}p $2`
         id $USERNAME &> /dev/null&&{
             ECHO 33 "$USERNAME is exist !!"
         }||{
             useradd $USERNAME
             echo $PASSWORD| passwd --stdin $USERNAME &> /dev/null && {
                 ECHO 32 "$USERNAME is created"
             }||{
                 ECHO 31 "unknown error !!"
             }
         }

      done

fi

vim users_create.sh
sh users_create.sh userlist passlist
user1 is exist !!
vim userlist
sh users_create.sh userlist passlist
Error: userlist\'s line is different from passlist!!!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.数据库脚本

要求:
执行db_dump.sh westos(数据库密码)
脚本执行后会备份数据库中的所有库到/mnt/mysqldump目录中
备份文件名称为“库名称.sql"当此文件存在时报错并询问动作
输入"s"跳过备份
当输入“B”备份“库名称.sql“文件为"库名称_backup.sql"
当输入“0"时,覆盖源文件
#!/bin/bash
DB_ACTION()
{
    read -p "please input your action: " ACTION
case $ACTION in
     B|b|Backup|backup)
     mv /mnt/mysqldump/$DBNAME.sql /mnt/mysqldump/${DBNAME}_backup.sql
     mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
##假设backup移动再备份
##备份数据库
     ;;
     O|o|Overwrite|overwrite)
     mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
##假设overwrite执行动作为清除
     ;;
     S|s|Skip|skip)
##覆盖
     ;;
     e|E|exit|Exit)
     exit
     ;;
     *)
     DB_ACTION
esac
}

if [ -z "$1" ]
then
     echo "Error: Please input password following $0"
     exit 1
elif [ ! -e "/usr/lib/systemd/system/mariadb.service" ]
then
     echo "Error: db is not installed"
     exit 1
elif [ ! -e "/var/lib/mysql.sock" ]
then
     echo "Error: db is not running"
     exit
elif [ ! -e "/mnt/mysql_dump" ]
then
     mkdir -p /mnt/mysql_dump
else 
     CHECK_DB=`mysql -uroot -p$1 -NEe "SHOW DATABASES:" 2>/dev/null` && { 
     DB_LIST=`echo "$CHECK_DB" | awk '!/^*|schema/{print}'`
     echo "Error: Wrong password"
##判断密码是否为空
     exit
}

for DBNAME in $DB_LIST
##判断mysql数据库是否安装,并显示数据库列表
do
    if [ ! -e "/mnt/mysql_dump/$DBNAME.sql" ]
    then
       echo "/mnt/mysqldump/$DBNAME.sql is exist !!"
       echo "Please choose your action [B]ackup [O]verwrite [S]kip"
       DB_ACTION $1
    else
       mysqldump -uroot -p$1 $DBNAME > /mnt/mysqldump/$DBNAME.sql
    fi
done

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.系统性能脚本


要求:
执行check_upload.sh;

执行效果如下:
cpu: 实际用量%
mem: 实际用来%
vim check_upload.sh
#!/bin/bash
ps ax -o %mem | awk 'BEGIN{MEM=0}!/%MEM/{MEM+=$1}END{print "MEM: " MEM"%"}'
COUNT=0
for N in `ps ax -o %mem | awk '!/%MEM|0.0/{print $1}'`
do
    COUNT=`echo $COUNT+$N | bc`
done
echo `printf "MEM is $COUNT"`

ps ax -o %cpu | awk 'BEGIN{cpu=0}!/%cpu|0.0/{cpu+=$1}END{print "CPU: " cpu"%"}'

sh check_upload.sh
MEM: 132.1%
MEM is 132.2
CPU: 8.9%

在这里插入图片描述

在这里插入图片描述

4.用脚本添加一个分区并实现自动挂载

要求:
分区大小为500M并开机自动激活此分区
#!/bin/bash
if [ "$USER" != "root" ]
then
   echo "Please run $0 with root !!"
   exit
elif [ "$#" -lt "1" ]
then
    echo "Please input devicve following $0 !!"
    exit
elif [ ! -e "/dev/$1" -a ! -e "$1" ]
then
    echo "$1 is not exist"
    exit
fi
FDISK()
{
/usr/bin/expect <<EOF
spawn fdisk $1
expect {
    "Command" { send "n\r";exp_continue }
    "default p" { send "\r";exp_continue }
    "Partition number" { send "\r";exp_continue }
    "First sector" { send "\r";exp_continue }
    "Last sector" { send "+500M\r" }
}

expect {
"Do you want to remove" { send "yes\r";exp_continue }
"Command" { send "wq\r" }
}
expect eof
EOF
}
FDISK $1 
DEV=`fdisk -l /dev/vdb | awk 'END{print $1}'`
mkfs.xfs $DEV -f
grep $DEV /etc/fstab &> /dev/null || {
  echo "$DEV /pub xfs default  0 0" >> /etc/fstab
##检测信息是否存在
}
mount -a

在这里插入图片描述

dnf install expect -y
sh disk.sh /dev/vdb

5.补充知识点:swap分区

作用:
程序在运行时所有数据被加载到内存里面RAM
当RAM使用量超过了限额
为了使系统更加稳定
我们在硬盘上划分一部分空间来作内存缓冲区swap
当内存使用超过限额,内核会把内存中闲置的数据存放到swap中
当程序需要swap分区中的数据时内核将swap分区中的数据再交还给内存进程处理

swap分区大小建议:
内存大小        swap分区建议大小    当允许HIBERNATE
2GiB以下          内存两倍            内存3倍
2-9GiB           等于物理内存        物理内存2倍
8-64GiB           4GiB             1.5倍物理内存
64GiB以上          4GiB             HIBERNATE不开
swap管理
swapon -s  ##查看swap分区信息

创建swap分区
创建分区并设定分区的类型为Linuxswap
mkswap /dev/vdb1  ##格式化设备为swap格式
swapon /dev/vdb1 -p 0-32767 ##-p表示指定swap的优先级
以上操作都为临时操作
如果永久添加swap分区
vim /etc/fstab
/dev/vdb1  swap  swap  pri=4 0 0

swapon -a
删除swap
vim /etc/fsatb
/dev/vdb1   swap  swap  pri=4 0 0  ##删除此行
swapoff /dev/vdb1

临时激活

swapon -s
fdisk /dev/vdb
udevadm settle
mkswap /dev/vdb1
swapon -a /dev/vdb1
swapon -s

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

永久激活

/dev/vdb1    swap     swap     defaults 0  0
vim /etc/fstab

在这里插入图片描述在这里插入图片描述

删除swap分区

swapon -s
swapoff /dev/vdb1
##解除swap分区激活
swapon -s
fdisk /dev/vdb
##删除分区

在这里插入图片描述在这里插入图片描述在这里插入图片描述

6.数据采集脚本

要求:
20-30 westos
vim check_up.sh
host up ----172.25.254.20 
student_20.westos.org > /var/named/westos.org.zone
#!/bin/bash
AUTO_SSH(){
/usr/bin/expect <<EOF
set timeout 2
spawn ssh root@172.25.254.11 hostname
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "westos\r"}
}
expect eof
EOF
for IP in 172.25.254.{20..30}
do
    ping -c1 -w1 $IP &> /dev/null
    if [ "$?" = "0" ]
    then
        echo "$IP `AUTO_SSH | tail -n 1 | grep -E "password" -v|sed 's/^M//g'`" >> list
    fi
done

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值