1)在 /oldboy 目录下创建10个含随机小写字母的html文件,随机字母一共10位,类似于 “abcdefghij_oldboy.html"格式。
#!/bin/bash
##设置变量目录
path=/oldboy
##是否有/oldboy目录,如果没有,则创建目录
[ -d $path ] || mkdir $path
##查看是否有mkpasswd命令,且不输出任何内容
type mkpasswd &>/dev/null
##如果不存在命令,则$?等于1,就安装expect软件包(内含mkpasswd命令)
##如果存在命令,则输出”该命令已安装”
if [ $? -eq 1 ];then
echo "mkpasswd is not installed"
yum install -y expect &>/dev/null
if [ $? -eq 0 ];then
echo "mkpasswd has installed"
fi
fi
##使用循环,生成10个随机数且给变量赋值,随机数是10个小写字母
##根据随机数,创建要求的目录文件
for n in {01..10}
do
random=$(mkpasswd -l 10 -d 0 -c 10 -C 0 -s 0)
echo $random
touch $path/${random}_oldboy.html
done
2)对目录下的文件名进行批量修改
已知 /tmp 目录下有10个后缀名为txt的文件
[root@m01 tmp]# pwd
/tmp
[root@m01 tmp]# ls
01.txt 02.txt 03.txt 04.txt 05.txt 06.txt 07.txt 08.txt 09.txt 10.txt
要求修改后缀为html
#!/bin/bash
##设置变量
dir=/tmp
##进入/tmp目录
cd $dir
##使用rename 命令批量修改
rename "txt" "html" *
3)批量创建10个用户,并生成随机数作为用户密码。
也可以批量删除用户。用两个函数表示,可以随时调用。
#!/bin/bash
##批量创建用户函数
add(){
for i in {01..10}
do
user=oldboy$i
useradd $user
num=$(openssl rand -base64 10)
echo $num|passwd --stdin $user
done
}
##批量删除用户函数
del(){
for i in {01..10}
do
user=oldboy$i
userdel $user
done
}
##如果要创建用户,调用函数
add
##如果要删除用户,调用函数
del
4)ping 10.0.0.1 到 10.0.0.70
如果ping通,则返回ok信息
#!/bin/bash
cmd="ping -W 1 -c 1"
ip="10.0.0."
for i in $(seq 70)
do
{
$cmd $ip$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip$i is ok"
fi
}&
done
此处ping的参数, -W 1表示等待1秒钟,-c 1表示ping 一次
本机的IP是10.0.0.61
结果如下
[root@m01 scripts]# sh 4.sh
10.0.0.1 is ok
10.0.0.2 is ok
10.0.0.61 is ok
5)给定数组以及数组内的字符串,打印出长度小于5的字符串,用3种不同方法。
关于数组,稍微说明一下。
定义数组 array=(a b c)
输出该数组的所有元素 echo ${array[*]}
输出该数组元素的个数 echo ${#array[*]}
输出该数组第一个元素 echo ${array[0]}
此处三个方法用了3个不同的函数
#!/bin/bash
##方法一
fun1(){
array=(I am oldboy teacher welcome to oldboy training class)
##条件循环语句,此处有两个小括号
for ((i=0;i<${#array[*]};i++))
do
if [ ${#array[i]} -le 5 ];then
echo ${array[i]}
fi
done
}
##方法二
fun2(){
array=(I am oldboy teacher welcome to oldboy training class)
##直接遍历数组所有元素,并用expr计算长度,进行比较
for i in ${array[*]}
do
if [ `expr length $i` -le 5 ];then
echo $i
fi
done
}
##方法三
fun3(){
##用字符串格式表示相应的元素
array="I am oldboy teacher welcome to oldboy training class"
##输出元素并用awk筛选
echo $array|awk '{for(i=0;i<=NF;i++) if(length($i)<=5) print $i}'
}
fun3
6)手动输入两个数组(空格隔开),比较大小
#!/bin/bash
fun1(){
##交互式输入数字
read -p "请输入两个数字:" a b
##如果a为空,或者b为空,则提示输入数字
[ -z $a ] || [ -z $b ] && {
echo "请输入数字:"
exit 1
}
##判断a和b是否是整数,并将结果保存至变量rel1和rel2
expr $a + 1 &>/dev/null
re1=$?
expr $b + 1 &>/dev/null
re2=$?
##如果是整数,rel1和rel2是0,否则是1
##因为只有整数和1相加才是整数,$?才是0
[ $re1 -ne 0 -o $re2 -ne 0 ] && {
echo "请输入整数!!"
##不是整数,则重新进入函数循环
fun1
}
##判断大小
[ $a -gt $b ] && {
echo "$a大于$b"
}
[ $a -lt $b ] && {
echo "$a小于$b"
}
[ $a -eq $b ] && {
echo "$a等于$b"
}
}
##调用函数
fun1
7)一键选择部署LNMP或LAMP架构
#!/bin/bash
##交互式界面,初识界面显示内容
main(){
cat <<eof
1.[install lnmp]
2.[install lamp]
3.[exit]
pls input your selection:
eof
##提前准备好的对应一键化部署服务的脚本
file1=/server/scripts/lnmp.sh
file2=/server/scripts/lamp.sh
##输入初始界面给出的1、2、3的三个数字选项
read num
##判断输入的是否是整数,否则会提示重新输入
expr $num + 1 &>/dev/null
[ $? -ne 0 ] && {
echo "you must input {1|2|3}"
exit 0
}
##如果输入1,就选择安装LNMP
[ $num -eq 1 ] && {
echo " start install lnmp"
##等待2秒钟
sleep 2
##查看是否存在该脚本文件,若不存在,就创建一个脚本
[ ! -f $file1 ] && {
touch $file1
echo "echo lnmp is starting" >$file1
}
##执行脚本,不成功,则source一下
[ ! -x $file1 ] &&
{ echo "scripts can not exec or not exist"
source $file1
}
exit 0
}
[ $num -eq 2 ] && {
echo " start install lamp"
sleep 2
[ ! -f $file2 ] && {
touch $file2
echo "echo lamp is starting" >$file2
}
[ ! -x $file2 ] &&
{ echo "scripts can not exec or not exist"
source $file2
}
exit 0
}
##如果选择3,不安装架构,则打印“再见”并且退出
[ $num -eq 3 ] && echo "see you" && exit 3
##如果输入的数字不是1、2、3中的任意一个,则提示一下
[[ ! $num = [1-3] ]] && {
echo "pls input {1|2|3}"
##重新调用函数
main
}
}
##调用函数
main
8)监控web站点目录/var/html/www目录下的所有文件内容是否被恶意纂改,若改动,则发送邮件通知。并设置成5分钟一次的定时任务。
首先,做好数据模拟测试的环境准备。
##准备好少量数据在站点目录下
cp -a /etc/c* /var/html/www
cp -a /etc/d* /var/html/www
##建立初始文件指纹库
find /var/html/www -type f|xargs md5sum > /opt/zhiwen.db.ori
##建立初始的文件库
find /var/html/www -type f > /opt/wenjian.db.ori
先回顾一下几个常见的文件测试操作符。
-d 目录存在则为真
-f 普通文件存在则为真
-e 目录或普通文件存在则为真
#!/bin/bash
retval=0
##调整字符集
export LANG=en
##站点目录下已经有少量的数据
check_dir=/var/html/www
[ -e $check_dir ] || exit 1
##初始的文件指纹库
zhiwen="/opt/zhiwen.db.ori"
##初始的文件库(含文件数量和名字)
wenjian="/opt/wenjian.db.ori"
err="/opt/err.log"
[ -e $zhiwen ] || exit 1
[ -e $wenjian ] || exit 1
##执行指纹监测命令并得到返回值
md5sum -c --quiet /opt/zhiwen.db.ori &>>$err
retval=$?
##获取最新文件数量
find $check_dir -type f >/opt/wenjian.db_curr.ori
##对比文件数量和文件名
diff /opt/wenjian.db* &>>$err
##如果返回值不为0,表明原始指纹与新指纹不匹配,即文件内容有变化,可以通过被追加重定向的错误日志看到是哪个文件的变化。
##如果文件对比数量不为0,表明文件数量发生变化。
if [ $retval -ne 0 -o `diff /opt/wenjian.db*|wc -l` -ne 0 ];then
##uname -n表示主机名
##date +%F表示日期
##主题:哪一天哪台主机发生错误。并附带错误日志文件作为邮件内容。
mail -s "`uname -n` $(date +%F) err" 发件人@163.com 收件人@qq.com<$err
else
##否则输出OK,并发送邮件通知
echo "sites dir is ok"|mail -s "`uname -n` $(date +%F) is ok"
fi
centos7系统下的邮箱发送设置
tail -5 /etc/mail.rc
set from=发件人@163.com
set smtp=smtp.163.com
set smtp-auth-user=发件人@163.com
set smtp-auth-password=邮箱验证码(16位)
set smtp-auth=login
最后写在定时任务中。
本脚本的绝对路径是/server/scripts/site_dir.sh
[root@m01 scripts]# crontab -l
*/5 * * * * /bin/sh /server/scripts/site_dir.sh &> /dev/null
参考内容:
《跟老男孩学Linux运维:Shell编程实战》
(例题几乎都来自该书,加上了个人的理解与补充)