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