文档章节

Shell 高级编程

netkiller-
 netkiller-
发布于 2016/11/04 08:36
字数 1183
阅读 360
收藏 5
点赞 0
评论 0

Shell 高级编程

原创 2016-11-04 景峯 Netkiller

Shell 高级编程

http://netkiller.github.io/journal/shell.html

Mr. Neo Chen (陈景峯), netkiller, BG7NYT


中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890

<netkiller@msn.com>

$Id: shell.xml 449 2012-08-10 10:38:08Z netkiller

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

 

Shell 更多是被看成一种批处理命令,确实很多是是吧 Shell当成批处理去使用的。

我确不这么看,我认为要想开发程序一样去写Shell,把Shell当成一种语言。

我们需要将很多软件开发技巧应用在Shell领域

 

目录

  • 1. 递归调用

  • 2. 实现守护进程

  • 3. 进程间通信

  • 4.

 

1. 递归调用

不懂递归不算是合格的程序员

递归调用是一种特殊的嵌套调用,是一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。

#!/bin/bash
########################################
# Author: Neo <netiller@msn.com>
# Home : http://netkiler.github.io
# Project: https://github.com/oscm/shell
########################################
domain=$1
########################################
function include(){
	txt=$1
	for host in $(echo $txt | egrep -o "include:(.+) ")
	do
		txt=$(dig $(echo $host | cut -d":" -f2) txt | grep "v=spf1")
		echo $txt;
		if [ "$(echo $txt | grep "include")" ]; then
			include "$txt"
		fi
	done
}
function main(){
	spf=$(dig ${domain} txt | grep "v=spf1")
	echo $spf

	if [ "$(echo $spf | grep "include")" ]; then
		include "$spf"
	fi
}

main $domain

运行上面的程序

$ bash spf.sh 163.com
163.com. 6878 IN TXT "v=spf1 include:spf.163.com -all"
spf.163.com. 16991 IN TXT "v=spf1 include:a.spf.163.com include:b.spf.163.com include:c.spf.163.com include:d.spf.163.com -all"
a.spf.163.com. 8001 IN TXT "v=spf1 ip4:220.181.12.0/22 ip4:220.181.31.0/24 ip4:123.125.50.0/24 ip4:220.181.72.0/24 ip4:123.58.178.0/24 ip4:123.58.177.0/24 ip4:113.108.225.0/24 ip4:218.107.63.0/24 ip4:123.58.189.128/25 -all"
b.spf.163.com. 10131 IN TXT "v=spf1 ip4:176.34.21.58 ip4:176.34.53.178 ip4:121.195.178.48/28 ip4:223.252.213.0/24 -all"
c.spf.163.com. 17199 IN TXT "v=spf1 ip4:223.252.206.0/24 ip4:43.230.90.0/27 -all"
d.spf.163.com. 17615 IN TXT "v=spf1 ip4:123.126.65.0/24 ip4:106.2.88.0/24 ip4:220.181.97.0/24 ip4:180.150.142.123 ip4:180.150.142.124 ip4:180.150.154.88 ip4:180.150.154.92 ip4:180.150.154.93 ip4:103.251.128.69 -all"

2. 实现守护进程

无论是C语言还是php/python/perl 通过fork命令实现守护进程,让当前程序进入后台运行,这种手段常常用于服务器软件。

启用 shell 解决重复运行问题,记录PID以便可以停止Shell运维

#!/bin/bash
##############################################
# $Id: shell.xml 449 2012-08-10 10:38:08Z netkiller $
# Author: Neo <netiller@msn.com>
# Home : http://netkiler.github.io
# Project: https://github.com/oscm/shell
##############################################
NAME=info
BASEDIR='/www'
PROG=$BASEDIR/bin/$(basename $0)
LOGFILE=/var/tmp/$NAME.log
PIDFILE=/var/tmp/$NAME.pid
##############################################
PHP=/usr/local/webserver/php/bin/php
##############################################
#echo $$
#echo $BASHPID
function start(){
	if [ -f "$PIDFILE" ]; then
		echo $PIDFILE
		exit 2
	fi

	for (( ; ; ))
	do
		cd $BASEDIR/crontab/
		$PHP readfile.php > $LOGFILE
		$PHP chart_gold_silver_xml.php > /dev/null
		sleep 60
	done &
	echo $! > $PIDFILE
}
function stop(){
  	[ -f $PIDFILE ] && kill `cat $PIDFILE` && rm -rf $PIDFILE
}

case "$1" in
  start)
  	start
	;;
  stop)
  	stop
	;;
  status)
  	ps ax | grep chart.xml | grep -v grep | grep -v status
	;;
  restart)
  	stop
	start
	;;
  *)
	echo $"Usage: $0 {start|stop|status|restart}"
	exit 2
esac

exit $?

3. 进程间通信

进程间通信就是在不同进程之间传播或交换信息。

脚本具有黑白名单功能,一个进程专门负责采集数据,另一个进程专门负责处理由第一个进程发送过来的数据。

#!/bin/bash           
########################################  
# Homepage: http://netkiller.github.io  
# Author: neo <netkiller@msn.com>  
########################################  
BLACKLIST=/tmp/BLACKLIST.lst  
PIPE=/tmp/pipe  
pidfile=/tmp/firewall.pid  
KEYWORD=XXDD0S  
ACCESSLOG=/www/logs/www.example.com/access.$(date +'%Y-%m-%d').log  
########################################  
if [ -z $1 ]; then  
    echo "$0 clear|fw|collect|process|close"  
fi
  
if [ "$1" == "clear" ]; then  
    rm -rf $BLACKLIST  
    rm -rf $PIPE  
    echo "Clear OK!!!"  
fi
  
if [ "$1" == "close" ]; then  
        kill `cat $pidfile`  
    echo > $pidfile  
fi
  
if [ ! -f $BLACKLIST ]; then  
    touch $BLACKLIST  
fi  
  
if [ ! -e $PIPE ]; then  
    mkfifo $PIPE  
fi  
  
if [ "$1" == 'fw' ]; then  
    iptables -A OUTPUT -p tcp --dport 2049 -j REJECT  
    iptables -A OUTPUT -p tcp -m multiport --dports 22,21 -j REJECT  
fi  
  
if [ "$1" == "collect" ]; then  
    killall tail
    for (( ; ; ))  
    do  
        tail -f $ACCESSLOG | grep $KEYWORD | cut -d ' ' -f1 > $PIPE  
    done &  
    echo $! > $pidfile  
fi  
  
if [ "$1" == "process" ]; then  
for (( ; ; ))  
do  
    while read line   
    do  
        grep $line ${BLACKLIST}
        if [ $? -eq 1 ] ; then  
            echo $line >> ${BLACKLIST}
            iptables -I INPUT -p tcp --dport 80 -s $line -j DROP      
        fi  
    done < $PIPE  
done &  
echo $! >> $pidfile  
fi

首先启动第一个进程,准备接收数据

# ipfw process

然后启动第二个进程,发送采集数据

# ipfw collect

这个程序使用管道作为进程见通信手段,所以只能在一个系统下运行,如果改为Socket通信就可以实现跨服务器数据处理

 

 

延伸阅读

PostgreSQL·账户表/余额表/消费储蓄表

PostgreSQL·国家地区表的设计

PHP高级编程之守护进程

PHP高级编程之多线程

PHP高级编程之消息队列

 

作者:netkiller

网站:http://www.netkiller.cn

邮箱:netkiller@msn.com

公众号:netkiller-ebook

关注作者公众号,每日推送原创文章。如果已有什么建议,请给我留言。

 

© 著作权归作者所有

共有 人打赏支持
netkiller-

netkiller-

粉丝 667
博文 240
码字总数 322337
作品 10
深圳
部门经理
《高级Bash脚本编程指南》十年来首次修订

  新年伊始,开源慕课的知识库上线了。初期提供了《Linux命令大全/Bash 参考》《高级Bash脚本编程指南》两个系列。其他资料正将陆续上线。   其中,《高级Bash脚本编程指南》对于Shell学...

dbtrain ⋅ 2016/01/28 ⋅ 0

shell 基础知识 第二弹

个人认为,学习shell,一定要从基础开始,如果你连基本的命令都不会用,怎么可能写出几千行的shell脚步(PS,今天走了小差看了下shell和Perl,还是觉得shell更有前途,个人意见,不喜勿喷) ...

枫爱若雪 ⋅ 2012/04/10 ⋅ 3

利用Shell开发跳板机功能脚本案例

先定个小目标,先精通Shell再说!——老男孩 利用Shell开发跳板机功能脚本案例 范例17_6:开发企业级Shell跳板机案例。要求用户登录到跳板机仅能执行管理员给定的选项动作,不允许以任何形式...

老男孩oldboy ⋅ 2017/04/11 ⋅ 0

Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/shcd ~mkdir shell_tutcd shell_tut for ((i=0; i<10; i++)); do done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到...

quanpower ⋅ 2014/03/23 ⋅ 0

shell脚本编程30分钟入门上手

什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一种...

湖南小影 ⋅ 2017/05/22 ⋅ 0

TIOBE 9 月排行榜:Java,C,C++ 三分天下何时休

Java,C,C ++ 三门编程语言已经在 TIOBE 的前三排待了有 15 年之久。C# 和 Python 虽然被认为是最有潜力超越他们的两门语言,但到目前为止也没取得任何进展。 C# 是微软公司发布的一种面向对...

达尔文 ⋅ 2017/09/07 ⋅ 34

云计算--培训课程大纲

第一阶段 Linux系统管理实战 01 打开计算机世界的大门 行业分析、计算机基础、 Windows server基础、网络基础 02 Linux基本管理 Linux安装、Linux常规命令、文本编辑器 03 Linux软件与文件系...

wy125629 ⋅ 2017/10/11 ⋅ 0

Xtreme Toolkit Pro专业版介绍

Xtreme Toolkit pro专业版集合了下面所列出的每一个产品。点击每个产品的链接可以看到相关产品的特性简介。当你了解完相关产品特性,你可以返回到本产品网页去浏览Xtreme Toolkit pro专业版余...

javascriptc ⋅ 2014/08/26 ⋅ 0

GitHub Octoverse报告:2017最受欢迎的15种编程语言

摘要:GitHub是全球最大的开源软件开发与管理社区,包括Google、Facebook等众多技术巨头在内都在这里安营扎寨,GitHub也成为了一探硅谷技术趋势最好的窗口,这个20亿美元的创业公司被开发者戏...

SDK.cn ⋅ 2017/12/22 ⋅ 1

成为高级程序员的 10 个步骤

What 软件工程师的职业生涯要历经以下几个阶段:初级、中级,最后才是高级。这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师。 Why 得到更多的报酬!因为你的薪水会随着你水平...

oschina ⋅ 2015/01/14 ⋅ 38

没有更多内容

加载失败,请刷新页面

加载更多

下一页

容器之重命名镜像

使用docker tag命令来重命名镜像名称,先执行help,查看如何使用如下 mjduan@mjduandeMacBook-Pro:~/Docker % docker tag --helpUsage:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TA...

汉斯-冯-拉特 ⋅ 19分钟前 ⋅ 0

with 的高级用法

那么 上下文管理器 又是什么呢? 上下文管理器协议包含 __enter__ 和 __exit__ 两个方法。with 语句开始运行时,会在上下文管理器对象上调用 __enter__ 方法。with 语句运行结束后,会在上下...

阿豪boy ⋅ 39分钟前 ⋅ 0

使用 jsoup 模拟登录 urp 教务系统

需要的 jsoup 相关 jar包:https://www.lanzous.com/i1abckj 1、首先打开教务系统的登录页面,F12 开启浏览器调试,注意一下 Request Headers 一栏的 Cookie 选项,我们一会需要拿这个 Cook...

大灰狼时间 ⋅ 39分钟前 ⋅ 0

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 50分钟前 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 今天 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 今天 ⋅ 0

[Err] ORA-24344: success with compilation error

从txt文本复制出创建function的脚本,直接执行,然后报错:[Err] ORA-24344: success with compilation error。 突然发现脚本的关键字,居然不是高亮显示。 然后我把脚本前面的空格去掉,执行...

wenzhizhon ⋅ 今天 ⋅ 0

Spring Security授权过程

前言 本文是接上一章Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 调试过程 使用debug方式启动https://github.com/longfeizheng/logback该项目,...

hutaishi ⋅ 今天 ⋅ 0

HAProxy基于KeepAlived实现Web高可用及动静分离

前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。 ...

寰宇01 ⋅ 今天 ⋅ 0

微软自研处理器的小动作:已经开始移植其他平台的工具链

微软将 Windows 10 、Linux 以及工具链如 C/C++ 和 .NET Core 运行时库、Visual C++ 2017 命令行工具、RyuJIT 编辑器等移植到其自主研发的处理器架构 E2。微软还移植了广泛使用的 LLVM C/C++...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部