命令末尾的“&”如何使脚本如此快?


18

在在线解决CTF挑战时,遇到了需要暴力破解服务器的情况。这是我写的代码:

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done

这是令人难以置信的,痛苦的缓慢。我需要尝试从1000到9999的组合,每10次尝试大约需要5秒钟。然后,按照建议,在此行的末尾添加一个“&”:

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &

并且,它在几秒钟内尝试了数百种组合。我很惊讶。有人可以向我解释逻辑吗?“&”是做什么的?


3
我建议您阅读您的Shell手册。&使命令在后台运行,仅此而已。它并没有使其变得更快或任何东西。阅读您正在使用的任何shell(我假设bash)手册。
polemon '04 -4-15

它使它在后台运行,您应该看它实际上已经完成了。
DisplayName 2015年

7
您不想测试1000以下吗?请使用for i in {1000..9999}
Walter A

2
因为端口现在并行超时,所以确实可以使脚本运行得更快。不过,您应该wait在末尾添加一个。
Bratchley 2015年

你看了nc -z localhost 1000-2000吗?
Walter

Answers:


30

添加会&生成一个后台进程。

如果编写a; b,它将运行command a,等待其完成,然后依次运行command b

如果您编写a & b,它将a作为后台进程生成。它不会等待它完成,而是会b立即开始运行。它将同时运行。

您可以通过在Shell中进行实验来查看其功能。如果已X安装,xterm则是查看会发生什么情况的好方法:键入

$ xterm

将导致另一个终端窗口打开,第一个窗口将等到您关闭它。仅当关闭它时,您才能收回外壳。如果您输入

$ xterm &

然后它将在后台运行它,您将立即收回外壳,而xterm窗口也将保持打开状态。

所以如果你写

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt

它建立连接,发送字符串,将输出的内容存储在文件中,然后继续前进到下一个。

添加&使它不等待。最终它将或多或少地同时运行所有它们。

您的脚本似乎“更快地”结束了,因为它实际上并没有在那时完成。它仅完成了上万个后台作业,然后结束了前台作业。

这也意味着,在您的情况下,它将尝试一次或多或少地打开一万个连接。根据另一端可以处理的内容,其中一些可能会失败。不仅如此,而且不能保证它们会按顺序运行,实际上几乎可以肯定它们不会运行,所以最终的结果/tmp/me/dump.txt是任何人的猜测。

您检查输出是否正确?


2
是的,我解决了挑战。如果提供了正确的代码,则服务器将使用密码进行响应。我执行了以下命令来检查'dump.txt':$ cat dump.txt | sort | uniq -u ..并向我显示了包含正确密码的行。
LearnerX 2015年

16
@intellikid:我不是故意要无礼,但运气却很不错。不仅顺序无关紧要,而且服务器的响应小于nc写缓冲区。如果不是这种情况,那么服务器的响应很可能是交错的。即,如果您有一个1字节的写缓冲区,并且响应是11112222,则您可能会看到类似的东西,11221212而不是整齐地分开1111 2222
marinus 2015年

是的,我意识到了。这就是为什么我要玩这些战争游戏。我在每个级别学习。感谢您协助学习。
learningX 2015年

2

nc(netcat)命令在时间上很昂贵。它需要连接到远程服务器,发送数据,等待响应,然后返回。

通过使用&,您基本上是在后台进程中分叉该命令(称为“作业”)。本身并不能使其运行更快。但这确实意味着您的循环不再被阻塞,并且已经可以执行下一次迭代(使用下一个nc)。

因此,基本上,提速是由所有这些远程连接并行进行的,否则它们将不得不等待上一个完成。

顺便说一句,根据您的终端,echo命令还会降低循环速度(有时需要等待,直到写入缓冲区中有空间为止)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.