管道极其重要,甚至对我们在命令行中执行惊人操作的能力至关重要。
首先,重要的是要认识到它们是由 Douglas McIlroy 在 Unix 的早期发明的。谢谢你,Doug!其次,在这个上下文中,管道是什么?请注意在这个简单的命令行程序中管道的使用,该程序只列出每个已登录用户一次,无论他们有多少个活动登录。
who | awk '{print $1}' | sort | uniq
管道是将这些命令行程序连接在一起的粘合剂。管道允许将一个命令的标准输出“管道传输”到下一个命令的标准输入。
想想看,如果我们不能将数据流从一个命令管道传输到下一个命令,这个程序将如何工作。第一个命令将对数据执行其任务,然后该命令的输出必须保存在文件中。下一个命令必须从中间文件中读取数据流,并执行其对数据流的修改,将其自己的输出发送到新的临时数据文件。第三个命令必须从第二个临时数据文件中获取其数据,并执行其自身对数据流的操作,然后将结果数据流存储在另一个临时文件中。在每个步骤中,数据文件名都必须以某种方式从一个命令传输到下一个命令。
我甚至无法忍受去想那个,它太复杂了。
Linux 哲学
只有使用管道,Linux 哲学 的几个原则才有意义。
这些程序中的每一个都很小 [都很美],并且每个程序都做好一件事。它们也是过滤器;它们接受标准输入,以某种方式处理它,然后将输出发送到标准输出。
使用标准 I/O 进行输入和输出是 Linux 哲学的次要原则之一。只有通过使用管道,才能将这些程序实现为过滤器,以将其自身标准输出的已处理数据流发送到上面程序的标准输入。
伟大的命令行挑战
请注意:此竞赛现已结束,不再接受新参赛作品。DPB,2015 年 8 月 1 日
正如我在 之前的文章 中承诺的那样,我有一个挑战要给你。它涉及管道作为解决方案的一部分——这是一个简单的问题,但我几乎每天都在使用解决方案。
我配置了我自己的所有计算机以及我为其他人管理的少数计算机,以将电子邮件发送到我自己的电子邮件帐户。我配置了我的电子邮件客户端,将这些管理电子邮件中的大多数移动到单个文件夹中,以便轻松找到它们。在过去的一年中,我在此文件夹中收集了超过 50,000 封电子邮件。
这些电子邮件包含来自 rkhunter (Rootkit Hunter)、logwatch、cron 作业和 Fail2ban... 等的输出。
Fail2ban 是一款开源软件,可以动态禁止尝试恶意访问我在互联网上的主机的 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 条评论