shell是一个面向过程的解释型语言;
/bin/sh
/bin/bash
/bin/ash
/bin/csh
/bin/tcsh
/sbin/nolgin
#! /bin/bash #定义解释器
定义变量
命令/循环/判断/函数(fuction)
输出echo -e#激活逃逸字符 -t / -n #步子到换行
读取 read -t#定义超时时间 / -p #指定提示字符
退出 exit #0表示执行成功
命令
变量
单一目的的小程序,由shell来解释命令并告诉kernel;
set
-e 这句语句告诉bash如果任何语句的执行结果不是true则应该退出
-c dir:在读取 makefile 之前改变到指定的目录dir;
管道
重定向
退出
表达式
、变量=‘字符串’、变量=值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/软链接,则为真
$n:第n个参数;
$ 0:脚本文件名;
$#:参数个数
$?:执行状态;
$@/$*:所有参数(分开/整体)
$$:进程ID
seq a b
seq -w b
for i in words; do
xxx
done
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 read line; do
xxx
done
# !/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
提示:根据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
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
-sP #ping扫描,仅发现目标主机是否存活;
nmap -sP 10.10.10.0/24 | grep -o '10.10.10.*'
[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
思路
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()