紧接上篇文章shell脚本案例汇总,今天继续分享shell脚本案例。
1、一键自动化安装nginx
一键安装脚本,对于自动化运维来说,非常有用,下面就是一个简单的自动化一键安装脚本,内容如下:
#!/bin/bash
function IIVEY(){
cat << EOF
+------------------------------------------------+
| |
| _o0o_ 1. 安装Nginx |
| 08880 2. 安装Apache |
| 88"."88 3. 安装MySQL |
| (|-_-|) 4. 安装PHP |
| 0\=/0 5. 部署LNMP环境 |
| __/ \__ 6. 安装zabbix监控 |
| ‘\ ///‘ 7. 退出此管理程序 |
| /软件一键安装 \ 8. 关闭计算机 |
| || 脚本 || ====================== |
| \ //// 一键安装服务 |
| ||| i i i |||
| ___ ___ ====================== |
|___‘. /--.--\ .‘___ |
+------------------------------------------------+
EOF
}
IIVEY
LOG_DIR=/usr/local/src
read -p "请您输入1-8任意数值:" NUM
if [ ${#NUM} -ne 1 ]
then
echo "请您输入1|2|3|4|5|6|7|8"
exit 1
fi
expr $NUM + 1 &>/dev/null
if [ "$?" -ne 0 ]
then
echo "请您输入数值!"
exit 1
fi
if [ "$NUM" -gt 8 ];then
echo "请您输入比8小的数值"
exit 1
elif [ "$NUM" -eq 0 ];then
echo "请您输入比0大的数值"
exit 1
fi
######################
function Nginx_DIR() {
yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel &>/dev/null
if [ $? -eq 0 ]
then
cd $LOG_DIR && wget http://nginx.org/download/nginx-1.14.2.tar.gz &>/dev/null && useradd -M -s /sbin/nologin nginx && \
tar zxf nginx-1.14.2.tar.gz && cd nginx-1.14.2/ && \
./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx &>/dev/null && make &>/dev/null && make install &>/dev/null
fi
if [ -e /usr/local/nginx/sbin/nginx ];then
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx && echo "Nginx安装并启动成功!!!"
fi
}
if [ $NUM -eq 1 ]
then
echo "开始安装Nginx请稍等..." && Nginx_DIR
fi
这个脚本仅仅编写了一键安装nginx的功能,还有更多的,比如一键安装mysql、php、zabbix等,大家可以仿照nginx的例子自行编写即可。
2、监控主机的磁盘空间
对磁盘空间的监控,也可以通过脚本完成,下面脚本完成的功能是监控每个磁盘分区,当磁盘分区使用空间超过90%时,就通过sendEmail来发送邮件告警。脚本内容如下:
#!/bin/bash
partition_list=(`df -h | awk 'NF>3&&NR>1{sub(/%/,"",$(NF-1));print $NF,$(NF-1)}'`)
critical=90
notification_email()
{
emailuser='user@domain.com'
emailpasswd='password'
emailsmtp='smtp.domain.com'
sendto='user1@domain.com'
title='Disk Space Alarm'
/usr/local/sendEmail-v1.56/sendEmail -f $emailuser -t $sendto -s $emailsmtp -u $title -xu $emailuser -xp $emailpasswd
}
crit_info=""
for (( i=0;i<${#partition_list[@]};i+=2 ))
do
if [ "${partition_list[((i+1))]}" -lt "$critical" ];then
echo "OK! ${partition_list[i]} used ${partition_list[((i+1))]}%"
else
if [ "${partition_list[((i+1))]}" -gt "$critical" ];then
crit_info=$crit_info"Warning!!! ${partition_list[i]} used ${partition_list[((i+1))]}%\n"
fi
fi
done
if [ "$crit_info" != "" ];then
echo -e $crit_info | notification_email
fi
对磁盘的监控来说,这个脚本非常有用,可以设置告警的阀值,超过阀值,就发送邮件进行告警。
3、批量创建用户
linux运维中批量创建用户是经常的事情,下面这个脚本完成的功能就是批量创建一批用户,用户名是有规律指定的,密码是随机生成的,脚本执行完毕,用户名和密码都保存在文件中。脚本内容如下:
#!/bin/bash
DATE=`date "+%F_%T"`
USER_FILE=userlist
if [[ -s ${USER_FILE} ]]
then
mv ${USER_FILE} ${USER_FILE}-${DATE}.bak
fi
echo -e "User\t Password" >> ${USER_FILE}
echo "----------------" >> ${USER_FILE}
for USER in userc{1..10}
do
if ! id ${USER} &>/dev/null
then
PASS=$(echo ${RANDOM}|md5sum|cut -c 1-8)
useradd ${USER}
echo -e ${PASS}|passwd --stdin ${USER} &>/dev/null
echo -e "${USER}\t ${PASS}">>${USER_FILE}
echo -e "${USER} USER CREATE SUCCESSFULE"
fi
done
这个脚本中没有特别需要修改的,复制代码,直接执行即可,默认会创建userc1到userc10这10个系统用户,用户号和密码保存在userlist文件中。
4、服务器状态监控脚本
(1)、根据PID过滤进程所有信息
这个脚本是根据pid过滤进程所有信息,然后给出进程状态和占用资源信息,代码如下:
#! /bin/bash
# Function: 根据用户输入的PID,过滤出该PID所有的信息
read -p "请输入要查询的PID: " P
n=`ps -aux| awk '$2~/^'$P'$/{print $11}'|wc -l`
if [ $n -eq 0 ];then
echo "该PID不存在!!"
exit
fi
echo "--------------------------------"
echo "进程PID: $P"
echo "进程命令:`ps -aux| awk '$2~/^'$P'$/{print $11}'`"
echo "进程所属用户: `ps -aux| awk '$2~/^'$P'$/{print $1}'`"
echo "CPU占用率:`ps -aux| awk '$2~/^'$P'$/{print $3}'`%"
echo "内存占用率:`ps -aux| awk '$2~/^'$P'$/{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux| awk '$2~/^'$P'$/{print $9}'`"
echo "进程运行的时间:`ps -aux| awk '$2~/^'$P'$/{print $10}'`"
echo "进程状态:`ps -aux| awk '$2~/^'$P'$/{print $8}'`"
echo "进程虚拟内存:`ps -aux| awk '$2~/^'$P'$/{print $5}'`"
echo "进程共享内存:`ps -aux| awk '$2~/^'$P'$/{print $6}'`"
echo "--------------------------------"
(2)、根据进程名查看进程状态
此脚本是根据输入的程序的名字过滤出所对应的PID,并显示出详细信息,代码如下:
#! /bin/bash
# Function: 根据输入的程序的名字过滤出所对应的PID,并显示出详细信息,如果有几个PID,则全部显示
read -p "请输入要查询的进程名:" NAME
N=`ps -aux | grep $NAME | grep -v grep | wc -l` ##统计进程总数
if [ $N -le 0 ];then
echo "该进程名没有运行!"
fi
i=1
while [ $N -gt 0 ]
do
echo "进程PID: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $2}'`"
echo "进程命令:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
echo "进程所属用户: `ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $1}'`"
echo "CPU占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $3}'`%"
echo "内存占用率:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $9}'`"
echo "进程运行的时间:` ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $11}'`"
echo "进程状态:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $8}'`"
echo "进程虚拟内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $5}'`"
echo "进程共享内存:`ps -aux | grep $NAME | grep -v grep | awk 'NR=='$i'{print $0}'| awk '{print $6}'`"
echo "***************************************************************"
let N-- i++
done
(3)、根据用户检查该用户的所有信息
此脚本是根据用户名查询该用户的所有信息,代码如下:
#! /bin/bash
read -p "请输入要查询的用户名:" A
echo "------------------------------"
n=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l`
if [ $n -eq 0 ];then
echo "该用户不存在"
echo "------------------------------"
else
echo "该用户的用户名:$A"
echo "该用户的UID:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'`"
echo "该用户的组为:`id $A | awk {'print $3'}`"
echo "该用户的GID为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'`"
echo "该用户的家目录为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'`"
Login=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'`
if [ $Login == "/bin/bash" ];then
echo "该用户有登录系统的权限!!"
echo "------------------------------"
elif [ $Login == "/sbin/nologin" ];then
echo "该用户没有登录系统的权限!!"
echo "------------------------------"
fi
fi
未完待续!