常见的shell实例
1.从磁盘使用统计中排除部分文件
du --exclude “*.iso” dir
2.找出指定目录中最大的10个文件
find -type f -exec du -k {} \; |sort -nrk 1 |head -n 10
3. 列出当前系统最长用的10条命令
cat .bash_history | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
4. 统计所有进程所占的常驻内存
ps -eo rss | awk 'BEGIN {print “所占内存是: ”} /^ *[0-9]/ { total += $1 } END { print total “kib”}'
实例:
实例1:采集系统负载数据,并通过gnuplot绘图分析系统热点。
/opt/cpuload.sh
#!/bin/bash
# Create by wxh 2015-07-05
# Version: v0.1
# 按照一定的格式采集cpu负载数据并存储在/tmp/mydata文件中。
uptime | awk '{print $1, $(NF-2), $(NF-1), $NF}' | sed 's/,//g' >> /tmp/mydata
# 调用gnuplot软件根据采集的数据进行绘图。
gnuplot <<EOF
set terminal png tiny font '/usr/share/fonts/liberation/LiberationSans-Regular.ttf'
set output '/var/www/html/loadavg.png'
set xdata time
set timefmt '%H:%M:%S'
set xlabel 'TIME'
set format x '%H:%M'
set xtics rotate
set ylabel 'load average'
plot '/tmp/mydata' u 1:2 t '1-min' with lines, '/tmp/mydata' u 1:3 t '5-min' with
lines,'/tmp/mydata' u 1:4 t '15-min' with lines
EOF
# 定义周期任务,每分钟执行一次脚本。
crontab -e
* * * * * /opt/cpuload.sh
# 通过http服务发布gnuplot绘制的图形,方便用户查看。
cat /var/www/html/gnuplot.html
<html>
<h1>Performance Charts</h1>
<a href="/loadavg.png">Load Average</a>
</html>
实例2:编写交互式脚本
/opt/check_system.sh
#!/bin/bash
# Create by wxh 2015-07-05
# Version: v0.1
# while循环显示交互界面
while true
do
# 显示交互内容
echo -e "
\033[31m A \033[0m 显示主机ip地址
\033[32m B \033[0m 显示磁盘空闲
\033[33m C \033[0m 显示系统运行时间
\033[34m Q \033[0m 退出
"
# 从终端读取用户输入 read -p "请输入你的选择: " num
# 设置多重任务分支 case $num in
a|A)
ifconfig br0 | grep "inet addr:" | awk '{print $2":"$4}' | awk -F: '{print $2"/"$4}' ;;
b|B)
df -h | grep /$ | awk '{print $3}' ;;
c|C)
uptime | awk '{print $3}' | tr -d ',' | awk -F: '{print "系统已经运行了"$1"小 时"$2"分钟"}'
;;
q|Q) exit ;;
*)
echo "请不要任性,需要选择[A|B|C]"
esac
done
实例3:编写nginx服务脚本
/etc/ini.t/nginx
#!/bin/bash
# Create by wxh 2015-07-05
# Version: v0.1
. /etc/rc.d/init.d/functions
nginx=/usr/local/nginx/sbin/nginx
prog=nginx
pidfile=/usr/local/nginx/logs/nginx.pid
RETVAL=0
start() {
echo -n $"Starting $prog: "
$nginx -t &> /dev/null
if [ $? -eq 0 ];then
$nginx &> /dev/null && success || failure
fi
echo
RETVAL=$?
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
$nginx -s stop &> /dev/null && success || failure
echo
RETVAL=$?
}
reload() {
echo -n $"Reloading $prog: "
$nginx -s reload &> /dev/null && success || failure
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
status)
status -p ${pidfile} $nginx
RETVAL=$?
;;
help)
$nginx -h
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|help|status}"
RETVAL=1
esac
exit $RETVAL
实例4:生产环境批量检测web url,邮件、微信报警。
/opt/check_weburl.sh
#!/bin/bash
# Create by wxh 2015-07-08
# Version: v0.1
#应用系统提供的脚本,本脚本中会使用里面的方法,比如action。
. /etc/init.d/functions
RETVAL=0 #定义默认返回值为0
ADDRESS=1206160700 #定义微信好友ID
CONTENT="/tmp/checkurl.txt"
function getstatus(){ #定义函数
FAILCOUNT=0 #定义FAILCOUNT变量的默认值
#使用wget循环检测3次指定url的状态,如果检测失败FAILCONUT的值+1
for ((i=1;i<=3;i++))
do
wget -T5 -t1 --spider http://$1 &>/dev/null
[ $? -ne 0 ] && let FAILCOUNT+=1
done #判断FAILCOUNT的值如果大于1的话就报警。
if [ $FAILCOUNT -gt 1 ];then
RETVAL=1 #检测失败后返回值为1
NTIME=`date +"%Y-%m-%d %H:%M:%S"` #定义时间格式
echo "http://$1 is down, ${NTIME}." > $CONTENT #定义报警内容
php /usr/local/WeiXin-Private-API/test.php $ADDRESS &> /dev/null
#调用微信接口报警
else
RETVAL=0 #检测成功返回值依然为0
fi
return $RETVAL #返回值
}
#判断urllist.txt文件是否存在
if [ ! -f /opt/urllist.txt ];then
echo urllist.txt not found
exit 1
fi
#调用上面定义的函数getstatus()循环检测url列表
for URL in `cat /opt/urllist.txt`
do
echo -n "checking $URL: "
getstatus $URL && action 健康的 /bin/true || action 挂掉了 /bin/false
done
脚本内容到此结束,以下是脚本中调用的urllist.txt文件的内容,一行一个:
# cat /opt/urllist.txt
www.westos.org
192.168.0.145
实例5: 屏蔽密码尝试失败次数过多的ip
/opt/check_secure.sh
#!/bin/bash
# Create by wxh 2015-07-08
# Version: v0.1
#过滤认证失败的主机IP和失败次数,并存储数据到文件
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /tmp/black.txt
#设定变量,超出此值会被脚本屏蔽
BASELINE="20"
#循环检测过滤到的数据文件
for i in `cat /tmp/black.txt`
do
IP=`echo $i |awk -F= '{print $1}'` #取出主机ip
NUM=`echo $i|awk -F= '{print $2}'` #取出失败次数
if [ $NUM -gt $BASELINE ];then
#在屏蔽IP之前先确认是否此IP是否已经存在
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ];then
echo "sshd:$IP" >> /etc/hosts.deny
fi
fi
done
可以把脚本放入周期任务,定时自动检测。
Expect用法:
#!/usr/bin/expect
告诉操作系统脚本里的代码使用那一个shell来执行。
set timeout 30
设置超时时间的,单位是:秒 ,timeout -1 为永不超时。
spawn ssh -l user 192.168.0.1
spawn是进入expect环境后才可以执行的 expect内部命令,它主要的功能是给 ssh运行进程加个壳,用来传递交互指令。
expect "password:"
判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则 就等待一段时间后返回,这里等待时长就是前面设置的30秒。
send "ispass\r"
这里执行交互动作,与手工输入密码的动作等效。命令字符串结尾别忘记加上 “\r”。
interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。
$argv 参数数组
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从 0开始,分别表示第一个,第二个,第三个....参数
实例6:expect自动交互脚本
/opt/auto1.sh
#!/usr/bin/expect
spawn ssh 192.168.0.120
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "westos\r"
} "password:" {send "westos\r"} "*host " {exit 1}
expect "#"
send "df -h\n"
send "exit\n"
expect eof
实例7:文件自动上传脚本
/opt/upload.sh
#!/usr/bin/expect
set DIR [lindex $argv 0]
spawn lftp 192.168.2.251
expect "~>"
send "cd pub\r"
expect "pub>"
send "mput $DIR/*\r"
send "exit\r"
expect eof
实例8:批量主机操作(相同密码)
/opt/auto2.sh
#!/usr/bin/expect
foreach ip {
172.25.0.1
172.25.0.2
} {
spawn ssh -l root $ip
expect "*password: "
sleep 1
send "westos\r"
expect "root"
send "scp root@172.25.0.251:/shell/check.sh /mnt\r"
###注意第一次连接会提示yes/no
expect "pasword:"
send "123456\r"
expect eof
}
实例9:批量主机操作(不同密码)
# cat passwd.txt
192.168.2.60=westos
192.168.2.70=redhat
# cat hello.sh
#!/bin/bash
#for i in `cat passwd.txt`
#do
# ip=`echo $i | awk -F= '{print $1}'`
# pass=`echo $i | awk -F= '{print $2}'`
#done
for ip in `awk -F= '{print $1}' passwd.txt`
do
pass=`awk -F= -v i="$ip" '{if(i==$1)print $2}' passwd.txt`
expect login.exp $ip $pass
done
# cat login.exp
#!/usr/bin/expect
set IP [lindex $argv 0]
set PASS [lindex $argv 1]
spawn ssh wxh@$IP
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "$PASS\r"
} "password:" { send "$PASS\r" } "* host" {exit 1}
expect "$ "
send "hostname;exit\r"
expect eof
转载于:https://blog.51cto.com/12060541/1854527
常见的shell实例相关推荐
- 10 个 PHP 常见安全问题(实例讲解)
2020相对于其他几种语言来说, PHP 在 web 建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来.但这种优势也容易带来一些负面影响,因为很多的 PHP 教程没有涉及到安全方面的知识. ...
- python数值运算实例_Python矩阵常见运算操作实例总结
本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入 ...
- linux几种常见的Shell:sh、bash、csh、tcsh、ash
Linux 是一个开源的操作系统,由分布在世界各地的多个组织机构或个人共同开发完成,每个组织结构或个人负责一部分功能,最后组合在一起,就构成了今天的 Linux.例如: Linux 内核最初由芬兰黑客 ...
- python装饰器函数-Python函数装饰器常见使用方法实例详解
本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...
- 几种常见的Shell
上面提到过,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说 ...
- python查询oracle数据库_python针对Oracle常见查询操作实例分析
本文实例讲述了python针对Oracle常见查询操作.分享给大家供大家参考,具体如下: 1.子查询(难): 当进行查询的时候,发现需要的数据信息不明确,需要先通过另一个查询得到, 此查询称为子查询: ...
- Windows 系统中常见的 Shell 命令总结(不时补充)
文章目录 前言 一.调出电脑 Windows IP 配置 二.生成文件目录结构树 三.创建文件夹 四.删除空目录 五.显示目录和文件 六.进入目录 七.删除文件 八.删除目录并同时删除目录中的子目录以 ...
- php shell,php命令行写shell实例详解
php 可以像java perl python 那样运行,今天发现如果我早早知道这个,或许我不会去学习java 和 python 当年学java不过为了一个程序放在服务器上,不停的跑啊跑,原来 php ...
- 【转载】shell实例手册
原文地址:shell实例手册 作者:没头脑的土豆 shell实例手册0说明{手册制作: 雪松更新日期: 2013-12-06欢迎系统运维加入Q群: 198173206请使用"notepad ...
最新文章
- 阿里云服务器安装Ubuntu图形化界面
- Linux 多线程同步机制:互斥量、信号量、条件变量
- 【AngularJs】获取URL查询参数
- Windows定时删除某天前文件的批处理脚本
- 深度学习导论(6)误差计算
- C语言——生命游戏(初始
- 如何判断字符串已经被url编码_如何判断回文数?不要再将整数转为字符串来解决这个问题了...
- 原来如此?修改浏览器滚动条样式
- Web程序中将Cell华表的修改 保存到数据库或服务器端文件夹内
- OpenShift 4 之Istio-Tutorial (9) 访问限流
- WEB前端、后端的说明
- linux dump 分析工具,使用 Crash 工具分析 Linux dump 文件
- 工控变成用c语言还是plc,浅析工控机与PLC的区别
- Flask+ZUI 开发小型工具网站(四)——ZUI 前端主页面 tabs
- pr cpu100%_PR插件NewBlueFX Titler Pro6.0安装教程
- [渝粤教育] 西南科技大学 物流系统规划与设计 在线考试复习资料
- python基础学习 1
- 计算机电子钢琴,电脑钢琴调律
- oracle数据库归档模式修改ARCHIVELOG
- 脑波设备mindwave二次开发框架
热门文章
- 如何在Keras中训练大型数据集
- 2018年,BAT在人工智能领域交出哪些答卷?
- SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 之原因分析
- 盘点丨机器学习做不到14件事,你知道吗?
- 神经网络早期的M-P(Warren McCulloch-Walter Pitts)模型
- 车路协同让城市更智慧
- 中科院发布11大领域171个热点和新兴前沿!有你的研究方向吗?
- 我们不知道答案的125个科学问题(16)群体合作行为的演化
- 中国北斗全球系统核心星座将于2019年年底部署完成
- UC伯克利教授Stuart Russell人工智能基础概念与34个误区