管道极其重要,甚至对于我们在命令行上执行出色操作的能力至关重要。
首先,重要的是要认识到它们是由 Douglas McIlroy 在 Unix 早期发明的。谢谢你,Doug!接下来,pipe 在本文中是什么意思?请注意,在这个简单的命令行程序中使用了管道,该程序列出每个登录用户一次,无论他们有多少个活动登录。
who | awk '{print $1}' | sort | uniq
管道是将这些命令行程序粘合在一起的胶水。管道允许将一个命令的标准输出“管道化”到下一个命令的标准输入。
想想看,如果我们不能将数据流从一个命令管道传输到下一个命令,这个程序将如何工作。第一个命令将对数据执行其任务,然后该命令的输出必须保存在文件中。下一个命令将必须从中间文件中读取数据流,并对其数据流进行修改,将其自己的输出发送到新的临时数据文件。第三个命令将必须从第二个临时数据文件中获取其数据,并对其数据流执行自己的操作,然后将结果数据流存储在另一个临时文件中。在每个步骤中,数据文件名都必须以某种方式从一个命令传输到下一个命令。
我甚至无法想象那样的情况,它太复杂了。
Linux 哲学
只有通过使用管道,Linux 哲学的几个原则才有意义。
这些程序中的每一个都很小 [并且很美观],而且每个程序都做好一件事。它们也是过滤器;它们接受标准输入,以某种方式处理它,然后将输出发送到标准输出。
使用标准 I/O 进行输入和输出是 Linux 哲学的次要原则之一。只有通过使用管道,才能将这些程序实现为过滤器,以将其自己的标准输出中的处理数据流发送到上述程序的标准输入。
伟大的命令行挑战
请注意:此竞赛现已截止接受进一步参赛作品。DPB,2015 年 8 月 1 日
正如我在之前的文章中承诺的那样,我有一个挑战要给你。它是一个将管道作为解决方案一部分的挑战——这是一个简单的问题,其解决方案我几乎每天都在使用。
我已将我自己的所有计算机以及我为其他人管理的一些计算机配置为将电子邮件发送到我自己的电子邮件帐户。我已配置我的电子邮件客户端将大多数管理电子邮件移动到一个文件夹中,以便轻松找到它们。在过去一年中,我已在此文件夹中收集了超过 50,000 封电子邮件。
这些电子邮件包含来自 rkhunter (Rootkit Hunter)、logwatch、cron 作业和 Fail2ban 等的输出。
Fail2ban 是一款开源软件,可以动态禁止尝试恶意访问我在 Internet 上的主机的 IP 地址。Fail2ban 通过向 iptables 添加规则来实现这一点。每次 IP 地址被禁止时,Fail2ban 都会发送一封电子邮件。
为了对 Fail2Ban 消息进行快速分析,我使用我的电子邮件客户端导出到一个 CSV 文件中,这些电子邮件的主题行包含已被禁止的主机的 IP 地址。此导出包含所有电子邮件(不仅仅是来自 Fail2Ban 的电子邮件)的所有主题。
您的任务(如果您接受的话)是创建一个单行命令行程序,以计算来自每个尝试使用 SSH 访问我的主机的 IP 地址的电子邮件数量。下载文件 来尝试一下。请注意,此文件包含超过 50,000 行,大小超过 6MB。而且,这不是您想要手动完成的任务。我已经更改了向我发送电子邮件的主机的域名,但攻击主机的 IP 地址尚未修改。
为了清楚起见,您创建的用于执行此操作的命令行程序应仅为一行,并且必须使用管道来引导数据从一个命令到下一个命令的流动。换行是可以的。而且,您的“一行”可以换行以适合您的终端宽度。
参与挑战: 给我发送电子邮件,主题行为“Great Command-Line Challenge”,然后在电子邮件正文中写下您的答案(一行代码)。将根据以下标准为每个标准选择一名获胜者:第一个正确答案、最短的正确答案和最具创意的答案。每位获胜者将获得一件 Opensource.com T 恤。挑战赛的提交截止日期为美国东部时间 2015 年 7 月 31 日晚上 11:59。阅读有关官方规则的更多信息。
额外加分项:包括每个 IP 地址的国家/地区名称。
祝你好运!
11 条评论