Linux Shell脚本

批量添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
userlist=$( cat /cc/users.txt )
for user in $userlist
do
if
user_a=$( grep "$user" /etc/psswd | awk -F : '{print $1 }') >> ./a.txt
[ $user_a = $user] >> ./aa.txt
then
echo "user already exitsts"
else
useradd $user >> ./a.txt
echo "123456" | passwd --stdin $user >> ./aa.txt
fi
done

批量删除用户

1
2
3
4
5
6
7
8
9
10
11
#! /bin/bash
userdel=$( cat /cc/users.txt)
for user in $userdel
do
userdel -r $user >> /cc/null.txt
if
[ $? -eq 0 ]
then
echo "${user} the user has deleted"
fi
done

判断系统中有没有指定用户

判断系统中有没有chen这个用户,如果没有就创建一个,并且设置密码

1
2
3
4
5
6
7
8
9
10
11
12
13
vim user.sh
#!/bin/bash
cat /etc/passwd | awk -F: '{print $1 }' | grep $1
if
[ $? -eq 0 ]
then
echo "User:$1 already exist "
else
echo " user:$1 does not exist,Is to create user:$1"
useradd $1
echo "$1:123" | chpasswd
echo "user:$1 created successfully"
fi

猜价格游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash
price=$(expr $RANDOM % 1000)
times=0
echo " The prices of the goods is 0-999,Can you guess what is?"
while true
do
read -p "Please eter your price :" INT
let times++
if [ $INT -eq $price ]
then
echo " GOOD you guessd it "
echo " You guess the total $times times"
exit 0
elif [ $INT -gt $price ]
then
echo " In too high "
else
echo " Is too low "

求1-100内奇数的和

1
2
3
4
5
6
7
#! /bin/bash
sum=0
for (( i=1; i<=100; i=i+2 ))
do
let " sum += i"
done
echo $sum

求整数和

编写一个我为sumint.sh的脚本,提示用户输入一个小于100的函数,并计算从1 到该数之间所有整数的和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim sumint.sh
#!/bin/bash
read -p "请输入0-100之间的整数进行运算:" int
sum=0
i=1
if [ $int -gt 100 ] || [ $int -lt 0 ]
then
exit 123
else
while [ $i -le $int ]
do
let "sum +=i"
let i++
done
fi
echo $sum

为用户编写登录欢迎脚本

为root用户编写登录欢迎脚本,择选当前主机中的进程数,已登录用户数,根文件系统的磁盘使用率。当从TTY终端登录时,显示……

1
2
3
4
5
6
7
8
9
cd /usr/local/bin
vim welcome.sh
#!/bin/bah
p=`ps -aux | wc -l `
echo "Running Processes:$p"
u=`who | wc -l`
echo "Login Users:$u"
f=`df | grep /$ | awk '{print $5}'`
echo "Usage of / Filesystem:$f"

添加执行权限

1
chmod +x welcome.sh

添加登录自动执行

1
2
vim /etc/profile
bash /usr/local/bin/welcome.sh

编写start,stop,status脚本程序

编写start,stop,status三个脚本程序,用来启动,停业各种系统服务。例如,直接进行stop crond,start crond命令即可停止,启动crond服务

1
2
3
4
cd /usr/local/bin
vim status
#!/bin/bash
service $1 status

添加执行权限

1
chmod +x status

测试

1
start crond
1
2
3
vim stop
#!/bin/local/bash
service $1 stop

添加执行权限

1
chmod +x status

测试

1
stop crond
1
2
3
vim start 
#!/bin/local/bash
service $1 start

添加执行权限

1
chmod +x start

测试

1
start crond

求任意两个数平方和

编写一个小脚本程序sumsquare.sh,用来计算两个整数的平方和。例如:当执行sumsquare.sh 3 4 命令时,输出结果为25,当执行sumsquare.sh 5 6 命令时,输出结果为61

1
2
3
4
5
6
cd /usr/local/bin
vim sumsquare.sh
#!/bin/bash
a=`expr $1 \* $1`
b=`expr $2 \* $2`
echo `expr $a + $b`

根据free命令的结果计算内存占用率

编写一个小脚本程序,memusage.sh根据free命令的结果计算内存占用率
方法一取两位小数部分

1
2
3
4
5
6
cd /usr/local/bin
vim memusage.sh
#! /bin/bash
a=`free | grep cache: | awk '{print $3 }'`
b=`free | grep Mem | awk '{print $2 }'`
awk 'BEGIN{printf"%.2f%\n",('$a'/'$b')*100}'

测试

1
source memusage.sh

方法二不取小数

1
2
3
4
#! /bin/bash
mem1=`free | grep cache: | awk '{print $3}'`
mem2=`free | grep Mem: | awk '{print $2}'`
mem=`expr $mem1 \* 100 / $mem2`

监控CPU,内存,根分区的磁盘占用率

编写名为sysmon.sh的Shell监控脚本。
监控内容包括CPU使用率,内存使用率,根分区的磁盘占用率。
百分比只需精确到个位,如:7% 12% 23%等。
出现以下任一情况时告警:磁盘占用率超过90%,CPU使用率超过80%,内在使用率超过90%。
告警邮件通过mail命令发送到monitor@benet.com
结合crond服务,每半个小时执行一次监控脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cd /usr/local/bin
vim sysmon.sh
#!/bin/bash
#cpu=`sar | grep -i average| awk '{print 100 - $8}'`
cpu=`mpstat | tail -1 | awk '{print $11}' | awk -F. '{print $1}'`
mem1=`free | grep cache: | awk '{print $3}'`
mem2=`free | grep Mem: | awk '{print $2}'`
mem=`expr $mem1 \* 100 / $mem2`
df=`df -h | grep "/$" | awk '{print $5}' | awk -F % '{print $1}'`
echo "is cpu:${cpu}%"
echo "is mem:${mem}%"
echo "is df:${df}%"
if
[ $cpu -ge 90 ] 2> /etc/hosts/cpu
then
echo "is cpu 0000"
mail -s 'cpu overload' monitor@benet.com</var/logs/cpu
elif
[ $mem -ge 80 ] 2> /etc/hosts/mem
then
echo "is mem 0000"
mail -s 'mem overload' monitor@benet.com</var/logs/cpu
elif
[ $df -ge 90 ] 2> /etc/hosts/df
then
echo "Service overload "
mail -s 'df overload' monitor@benet.com</var/logs/df
fi

添加执行权限

1
chmod +x sysmon.sh

添加到计划任务

1
2
3
crond -e -u root
#!/bin/bash
*/30 * * * * /usr/local/bin/sysmon.sh

判断当前系统的内核主,次版本

编写一个名为chkversion.sh的脚本,判断当前系统的内核主,次版本,若大于2.4则输出相应的版本信息;否则输出提示“内核版本太低,无法继续”

1
2
3
4
5
6
7
8
9
10
11
vim chkversion.sh
#!/bin/bash
a=`uname -r | awk -F . '{print $1}'`
b=`uname -r | awk -F . '{print $2}' `
if
[ $a -ge 2 ] && [ $b -gt 4 ]
then
echo "$a.$b"
else
echo "Version is too low"
fi

判断系统中sysstat软件包的安装情况

编写一个名为chkinstall.sh的脚本,判断系统中sysstat软件包的安装情况,如果已经安装则提示“已安装”,并输出sysstat的版本信息;否则输出提示“未安装,尝试自动安装”,并访问RHEL6光盘挂载点/media/cdrom 自动安装sysstat包

1
2
3
4
5
6
7
8
9
10
11
12
#! /bin/bash
rpm -qa | grep sysstat
if
[ $? -eq 0 ]
then
echo "sysstat software package already have installed"
exit 123
else
echo "sysstat software package is not install trying to installed"
rpm -ivh /media/Packages/sysstat-9.0.4-22.el6.x86_64.rpm
echo "sysstat software package is being installed"
fi

检测目标并记录MAC地址

编写getarp.sh脚本文件
通过arping命令发送ARP请求,根据反馈的结果记录MAC地址
将网段地址(如:19.168.4.)赋值给变量NADD,作为检测地址的前缀
使用while循环语句,重复检测目标并记录MAC地址,主机地址为1~254

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rpm -qf `which arping`
vim getarp.sh
#!/bin/bash
nadd="192.168.133."
i=1
while [ $i -lt 255 ]
do
arping -c 2 -w 1 $nadd$i &> /etc/null
let i++
if [ $? -eq 0 ]
then
echo "host $nadd$i is up"
arp -n | grep $nadd$i | awk '{print $1 " " $3}' >> ./ipandmac.txt
else
echo "host $nadd$i is down"
fi
done

检测一个主机是否开启匿名FTP服务

缩写scanhost.sh脚本
有很多方法可以检测一个主机是否开启匿名FTP服务,这里采取以wget下载工具访问FTP根目录的方式,若能够成功列表,则视为匿名FTP已开启,否则为关闭
通过awk命令过滤出/etc/ethers文件中的所有IP地址,赋值给变量TARGET
使用for循环语句,读取TARGET变量中的IP地址,重复探测FTP的开启请况
先生成IP地址表

1
2
3
4
5
6
7
8
9
vim ip.sh
#!/bin/bash
ip=192.168.133.
i=1
while [ $i -lt 255 ]
do
echo "$ip$i" >> ./1.txt
let i++
done

再编写scanhost.sh脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
vim scanhost.sh
#!/bin/bash
iplist=$(cat ./ipandmac.txt | awk '{print $1}')
for ip in $iplist
do
wget -T 2 -t 2 ftp://$ip/ &>/etc/null
if [ $? -eq 0 ]
then
echo "ftp://$ip is up"
else
echo "ftp://$ip is down"
fi
done

向文件指定行写入字符

向/etc/resolv.conf文件第2行写入需要的字符

1
sed -i "2i nameserver 10.0.11.15\nnameserver 10.0.21.86" /etc/resolv.conf

向文件指定行尾写入字符

向config.xml文件中带有“yes”内容的行尾写入字符

1
sed -i "/yes/ s/$/ABC/" config.xml

在文件所有行首添加字符

1
sed -i "s/^/ABC/" config.xml

在文件所有行尾添加字符

1
sed -i "s/$/ABC/" config.xml

删除空行

1
sed -i "/^$/d" config.xml

取文件中带有关键字的下行内容

取文件中带getCheckerName关键字的下一行内容,使用awk赋值给多个value

1
2
3
4
5
6
7
find ./ -type f |xargs grep "getCheckerName" -n | awk -F : '{print $1,($2 +1)}' | while read a b ; do sed -n $b\p $a | awk -F '"' '{print $2}';done

账号绑定
校验密码
账号登录
账号注册
账号解绑

根据文件名后缀来自动选择相应的解压选项

编写一个名为untar.sh的脚本程序,用来解压.tar.gz或tar.bz2格式的压缩包文件,要求采用case语句,根据文件名后缀来自动选择相应的解压选项

1
2
3
4
5
6
7
8
9
vim untar.sh
#!/bin/bash
case $1 in
*tar.gz)
tar zxvf $1
;;
*tar.bz2)
tar jxvf $1
esac

crontab计划任务

每隔3个月的1号清理半年前的日志文件

1
2
0 0 1 */3 * /usr/bin/find /work/admin/logs/apigateway/ -type f -mtime +180 -name api_general_log.*.log -exec rm -rf {} \;
0 0 1 */3 * /usr/bin/find /work/admin/logs/clientlogs/ -type f -ctime +180 | xargs rm -rf {}

每天晚上23点清空flume日志

1
0 23 * * * /usr/bin/echo "" > /flume/sunflower/apache-flume-1.7.0-bin/logs/flume.log

每隔8个小时重启filebeat服务

1
0 */8 * * * /usr/bin/supervisorctl -uuser -p123 restart filebeat
-------------本文结束感谢您的阅读-------------