shell脚本实例

1.通过位置变量创建Linux系统账户及密码

位置变量:我们可以理解为 在执行脚本时所要传递的参数

#!/bin/bash
useradd $1
echo "$2" | passwd --stdin "$1"

运行效果如下:

2.每周5使用tar命令备份/var/log下的所有日志文件

第一个*:一小时中的第几分钟【0-59】

  • 第二个*:一天中的第几个小时【0-23】
  • 第三个*:一个月当中的第几天【1-31】
  • 第四个*:一年中的的第几月【1-12】
  • 第五个*:一周当中对的星期几【0-7 0和7都表示 周日】

第一步 写好 备份脚本

#!/vin/bash
tar -czf log-`date +%Y%m%d`.tar.gz /var/log

第二部 执行定时任务

crontab -e -u root
00 03 * * 5 /root/logbak.sh

3.监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M
时,发送报警邮件给 root 管理员

#!/bin/bash
echo "提取根分区剩余空间"
gen_size=$(df  / | awk '/\//{print $4}')
echo "$gen_size"
echo "提取内存剩余空间"
mem_size=$(free |awk '/Mem/{print $4}')
root_email="2387139415@qq.com"
echo "$mem_size"
        if [ $gen_size -le 512000 -a $mem_size -le 1024000 ]; then
                echo "空间不足" | mutt -s "空间不足" $roor_email
        else
                echo "一切正常"
        fi

4.脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
猜小了或猜大了,直至用户猜对脚本结束

#!/bin/bash
num=$[RANDOM%100]
echo "$num"
while :
do
        read -p "请输入你的猜想数字:" my_num
        if [ $num -lt $my_num ]; then
                echo "猜大了"
        elif [ $num -gt $my_num ]; then
                echo "猜小了"
        else
                echo "恭喜你 才对了"
                break
        fi
done
~    

5.检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不
是,则提示您非管理员(使用字串对比版本)

#!/bin/bash
#获取当前用户
name=$(whoami)  
echo "$name"
if [ $name = "root" ]; then
        yum -y install vsftpd
else
        echo "您不是管理员用户 没有权限安装软件"
fi

6.依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字

#!/bin/bash
for i in {1..3}
do
        read -p "请输入第${i} 个数字" num${i}
done
echo "$num1 $num2 $num3"

tmp=0 #中间值
if [ $num1 -gt $num2 ]; then
        tmp=$num1
        num1=$num2
        num2=$tmp
fi


if [ $num1 -gt $num3 ]; then
        tmp=$num1
        num1=$num3
        num3=$tmp
fi


if [ $num2 -gt $num3 ]; then
        tmp=$num2
        num2=$num3
        num3=$tmp
fi

echo "排序后的数据为 : $num1 $num2  $num3"

7.编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版) 

参数详解
-a Audible ping.
-A 自适应ping,根据ping包往返时间确定ping的速度;
-b 允许ping一个广播地址;
-B 不允许ping改变包头的源地址;
-c count ping指定次数后停止ping; 
-d  使用Socket的SO_DEBUG功能;
-F flow_label 为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配;
-f 极限检测,快速连续ping一台主机,ping的速度达到100次每秒;
-i interval 设定间隔几秒发送一个ping包,默认一秒ping一次;
-I interface 指定网卡接口、或指定的本机地址送出数据包;
-l preload 设置在送出要求信息之前,先行发出的数据包;
-L 抑制组播报文回送,只适用于ping的目标为一个组播地址
-n  不要将ip地址转换成主机名;
-p pattern 指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”;
-q 不显示任何传送封包的信息,只显示最后的结果
-Q tos 设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;
-R 记录ping的路由过程(IPv4 only);
注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;
-r 忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。
-S sndbuf Set socket sndbuf. If not specified, it is selected to buffer not more than one packet.
-s packetsize 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
-t ttl 设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
-T timestamp_option 设置IP timestamp选项,可以是下面的任何一个:
  'tsonly' (only timestamps)
  'tsandaddr' (timestamps and addresses)
  'tsprespec host1 [host2 [host3]]' (timestamp prespecified hops). 
-M hint  设置MTU(最大传输单元)分片策略。
可设置为:
  'do':禁止分片,即使包被丢弃;
  'want':当包过大时分片;
  'dont':不设置分片标志(DF flag);
-m mark 设置mark;
-v 使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;
-U  Print full user-to-user latency (the old behaviour).
Normally ping prints network round trip time, which can be different f.e. due to DNS failures.
-W timeout 以毫秒为单位设置ping的超时时间;
-w deadline deadline;
#!/bin/bash
for i in {1..254}
do
        ping -c2 -i0.3 -W1 10.0.0.$i &>/dev/null
        if [ $? -eq 0 ]; then
                echo "10.0.0.${i} is up"
        else
                echo "10.0.0.${i} is down"
        fi
done

8.编写批量修改扩展名脚本

 

#!/bin/bash
for i in {1..5}
do
        touch chen${i}.txt
done
#以上是批量创建要测试的文件

path=`ls -a /root/shell/chen/*.txt`
echo $path
for j in $path
do
        echo $j 
        name=`echo $j |awk -F '.' '{print $1}'`
        mv $j $name.$1
done

 

 

 

9.切割 Nginx 日志文件(防止单个文件过大,后期处理很困难)

#/bin/bash
logs_path="/usr/local/nginx/logs/"
pid_path="/usr/local/nginx/logs/nginx.pid"

mv ${logs_path}access.log ${logs_path}access_$(date  +"%Y-%m-%d").log
kill -USR1 `cat ${pid_path}`

 

10.检测 MySQL 数据库连接数量,超过500时报警并发送邮件给管理员

 

 

posted @ 2020-01-06 19:01  陈豆豆鸭  阅读(178)  评论(0)    收藏  举报