Shell脚本基础架构

知识点:

shell是一个面向过程的解释型语言;

常见shell

/bin/sh
/bin/bash
/bin/ash
/bin/csh
/bin/tcsh
/sbin/nolgin

基本结构

  • vim file.sh
    #! /bin/bash #定义解释器
   定义变量
   命令/循环/判断/函数(fuction)
    输出echo -e#激活逃逸字符 -t / -n #步子到换行
   读取 read -t#定义超时时间  / -p #指定提示字符
   退出 exit #0表示执行成功
  • chmod +x file.sh #授权
  • sh +xv file.sh #调试
  • ./file.sh #绝对路径,执行脚本

基本脚本构成

  • 命令

  • 变量
    单一目的的小程序,由shell来解释命令并告诉kernel;

    set
    -e 这句语句告诉bash如果任何语句的执行结果不是true则应该退出
    -c dir:在读取 makefile 之前改变到指定的目录dir;

  • 管道

  • 重定向

  • 退出

命令

  • 替换:变量=${变量}、变量=$(命令)、变量=表达式、变量=‘字符串’、变量=值
  • 查看:echo $X
  • 赋值:expr
  • 运算:let、&&#成功执行命令2、||#失败执行命令2
date=$(date -d '+1 day' +%Y-%M) #可输出多行文字,+前一个为格式,-后一个为符号
date =`date -d '+1 day' +%Y-%M` #一行输出
if [-n/-z $string] #如果string非空/空,返回True;
if [xx1 -d/-a/-o xx2] #不存在、并列(文件1比文件2新)、或;
[-e/-d/-f/-L/-r/-s/-h FILENAME] #如果FILENAME存在/为目录/为常规文件/符号链接/可读/长度不为0/软链接,则为真
  • 比较:-gt、-lt、-eq
  • 处理:#、%、/
  • 特殊变量(参数)
    $n:第n个参数;
    $ 0:脚本文件名;
    $#:参数个数
    $?:执行状态;
    $@/$*:所有参数(分开/整体)
    $$:进程ID
  • 移动:shift #把变量从参数数组中移除

范围

seq a b
seq -w b

循环、条件

  • for
for i in words; do
    xxx
done
  • if
if [ i -gt  x (-a/-o xxx) ];then
    xxx
fi

if cat /etc/issue|grep -qai 10.04
if [ $? -eq 0 ];
if [-n/-z/-s $string]
  • while
while read line; do
    xxx
done

expect

例题:

1. 测试一:监控磁盘的使用率,>90%时给root发邮件

 # !/bin/bash
 df -P | sed 1d > /tmp/usage  #删除第一行用sed,-P表示不会因为文本过长而换行 
 while read line; do  
        use=`echo $line | awk -F' ' '{print $5}' | sed 's/%//'`
        fs=`echo $line | awk -F' ' '{print $6}'` #最该发送的是挂载点
 if [ $use -gt 1 ]; then 
mail -s'Warning!High Usage!' root@localhost << END #用END换行符用于交互,代替回车的功能
$fs is in a high usage $use%    #正文部分
 END #表示结束输出  #cmd输入mail查看邮件,file查看所有邮件状态;
 fi
 done < /tmp/usage 

2.测试二:写一个脚本解决DOS攻击生产案例

提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。

法一:
# !/bin/bash

IP=`netstat -nut | awk '{print $5}' | cut -d: -f1 | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i in ip)print ip[$1],i}' | sort -n   
awk '{if($1>1)print $2}'`

 echo $IP > /data/net  #重定向只能是标准输入,利用echo
 while read line; do 
         iptables -I INPUT -s $IP -j DROP 
         echo 'This $IP is drop!'        
 done < /data/net  #需要导进文件才能读行

法二:
 # !/bin/bash

IP=`netstat -nut | awk '{print $5}' | cut -d: -f1    | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i i    n ip)print ip[$1],i}' | sort -n | awk '{if($1>1)p    rint $2}'`

source /etc/profile #加入开机自启动
 for ip in $IP; do
         iptables -I INPUT -s $IP -j DROP
         echo 'This $IP is drop!'        
 done

法三:思考until

3. 测试三:查看10.0.0.0/24网段中的在线用户数;

ping:测试主机间网络的连通性

ping [OPTION] [IP]
-c #连接次数;
-w #超时时间;

#! /bin/bash

NET=10.10.10.0/24
NET=${NET%.*}


for i in `seq 254`; do  #for可以用while或者until代替
        (ping -c 1 -W 3 $NET.$i
        if [ $? -eq 0 ]; then
        echo $NET.$i >> /tmp/test
        fi)  #()表示另起一个子进程,并行进程,可以提高效率
 #生产环境中,上万流量级别了,不能乱用,否则进程卡死;
done

script

if [ "$CLOUD_MYSQL_ENV" == "test" ]; then
    env CLOUD_MYSQL_ENV=test exec /opt/cloud_mysql/bin/uwsgi --die-on-term --ini /opt/cloud_mysql/conf/uwsgi.ini
else
    exec /opt/cloud_mysql/bin/uwsgi --die-on-term --ini /opt/cloud_mysql/conf/uwsgi.ini
fi

end script

nmap:一款开源的网络探测器和安全审核工具,它可以快速扫描大型网络

-sP #ping扫描,仅发现目标主机是否存活;

nmap -sP 10.10.10.0/24 | grep -o  '10.10.10.*'

4. 批量创建文件及改名(不同的系统语法有所不同,此为另一种思路)

[root@shell scripts]# viuseradd.sh
#! /bin/bash
. /etc/init.d/functions
  
Path=/server/scripts #所有操作均定义在脚本里面
UserDb=$Path/user.db
FailDb=$Path/fail_user.db
  
[ -d "$Path" ] || mkdir-p $Path
[ -f "$UserDb" ] ||touch $UserDb
[ -f "$FailDb" ] ||touch $FailDb
#思路就是存在即创建  
for n in $(seq -w 10) #seq -w 10 ——> seq `1,10`
 do
    passwd=`echo $(date+%t%N)$RANDOM|md5sum|cut -c 2-9` #$RANDOM表示内部变量,可以创建随机数;date+X%设置系统时间格式
    useradd oldboy$n >&/dev/null&& user_status=$?
    echo "$passwd"|passwd --stdinoldboy$n >&/dev/null && pass_status=$? #用echo xxx | yyy --stdin zzz,其中xxx为和终端交互内容
    if [ $user_status -eq 0 -a $pass_status -eq0 ];then #创建成功则返回值为0,$?表示返回值;
       action "adduser oldboy$n"/bin/true
       echo -e "user:\toldboy$npass:$passwd" >>$UserDb #小心!追加式重定向
    else
       action "adduser oldboy$n"/bin/false
       echo -e "user:\toldboy$npass:$passwd" >>$FailDb #-e表示激活转义字符
    fi
done

python

思路
1、导入time和os模块;
2、变量当前时间、磁盘状态、表示形态;
3、实施磁盘状态;
4、写入数据、刷清数据、关闭数据

#当前时间
time.strtime(’%y-%m-%d’)

#磁盘状态
os.open('df -h ',‘r’).readline()

#表示形态
‘\n’.join(xxx)

#写入数据
f.write(’%s’ % str)、f.flush() 、f.close()

你可能感兴趣的:(linux系统)