Unix管道之美

原文:https://www.toutiao.com/i6851469127882637832/

Unix的哲学侧重于构建简单且可扩展的软件。每个软件都尽做一件事,但是要把这件事做的极致,而且该软件必须能用一个通用界面(文本流)和其他程序协同工作。这是Unix的核心哲学之一,这样就可以构建出强大而且直观的软件生态系统。

Unix管道之美

 

UNIX系统引入了许多创新的程序和技术,但一直以来遵循的也是行之有效的只有该软件哲学思想。所有UNIX程序基本上都可以独立地完成琐碎的事情,而且善于和其他程序结合使用,成为通用且有用的工具。

本文中我们就来介绍一个Unix下强大的,而且专门负责程序之间协作的工具管道。

概述

管道是Unix体系中进程间的重要通信机制之一。管道的原理很简单:在内存中创建一个共享文件,通信的进程之间通过该共享文件来交换信息。该共享文件就叫是管道。管道由pipe函数创建,并且提供一个单向数据流。

Unix管道之美

 

一个典型的shell命名行who|sort|lp

上面命令行中的|就是管道,利用管道我们把who的执行结果传递给了sort进行排序,然后再把排序的结果传递给lp打印出来。

Unix管道之美

 

管道实例

统计访问日志中非法访问最高的IP

Web网站的的访问日志通常能反映网站当前访问状态,比如大量404状态比例说明网站链接系统有问题问题指向了很多不存在的网站,或者还有一个可能就是网站被人尝试渗透,有人可能使用扫描器对你网站做特征渗透(尝试访问一些Url),这时候就需要我们能找出这些IP并对其进行封禁。

要找出这样的IP常用的一个命令是:

grep 404 access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n 10

 

以上命令行中有5个管道把6个工具处理链接成了一个处理栈:

1 用grep搜索access.log文件中的404状态。

2 用awk打印搜索结果中(404状态的访问日志)的,第一列(默认用空格字符分割,第一列即访问IP)。

3 用sort对所有IP排序,这次sort是为了下一步的uniq打基础,因为uniq只会比较附近行,所以不预先排序的话,结果会有问题。

4 uniq -c 对重复项(IP)进行去重,并计数。

5 对uniq的结果进行排序-n表示用数字排序(即uniq -c后的重复计数值),-r表示逆序。

6 取排序结果的前10项目。

Unix管道之美

 

结果如上,其中访问最高的IP比较不正常。我们在grep这个IP

grep 1.69.180.223 access.log

Unix管道之美

 

可见这就是一个扫描器,在不断地探测phpmyadmin呢,这个IP可以封掉,封禁也简单。

iptables -I INPUT -s 1.69.180.223 -j DROP

以上就是一个简单的利用管道和小工具进行日志分析和恶意攻击发现和处理的过程,整个流程简单明了。

 

git仓库commit排行榜

我们再举个简单例子,对一个git托管的项目获取其提交的排序,根据提交者commit数来进行排序。我们以Linux内核为例,我们先从gitee的linux内核仓库镜像克隆一个到本地

git clone git@gitee.com:mirrors/linux.git

git log用于显示提交日志。--format=<format>选项用来对显示的信息进行筛选,本例中我们只需提交者,用--format='%an'会显示每次提交的姓名。

Unix管道之美

 

接着我们要对其去重统计次数,用上一例中我们说过的技巧,先sort,再uniq -c

 

git log --format='%an' | sort | uniq -c

Unix管道之美

 

有意思的是,内核中也有一些中文姓名提交者,这些人中有没有你或者你认识的?

然后根据统计的commit数排序,取前20个提交者: sort -nr | head -n 20

 

git log --format='%an' | sort | uniq -c |sort -nr | head -n 20

Unix管道之美

 

可以看到教主Linus是No.1的提交者,提交次数为30218,其次是David S. Miller,对比gitee Web页面的commit统计

Unix管道之美

 

可能由于他的统计不是实时的有缓存,所以数量上有些差异。

调用github Api接口获取自己项目

Github中常见一个操作就是把fork当收藏,这样一来过一段时间后,可能项目就很多无法管理了。好在github提供了API接口,我们可以调用该接口获取相关信息,比如要获取某个用户的仓库列表,可以调用

api.github /users/用户名/repos

结果是一个json格式的数据,为了解析数据需要用到我们之前介绍过的jq工具。

curl https://api.github.com/users/bollwarm/repos | jq '.[] | .full_name'

jq命令中的.[]表示对列表进行循环获取,.full_name表示获取json的全名:

Unix管道之美

 

jq利用管道从标准输入中读取数据,实际上所有这类API的操作都可以以类似形式处理。

总结

本文中我们介绍了Unix哲学思想武装下的工具管道,并实例介绍了其用法,现实中还有大量的用法。抛砖引玉,希望大家善用这些小工具,来完美的解决自己的大问题。

上一篇:『Linux学习笔记』7. 管道和过滤器 -- pipe


下一篇:nginx访问量统计