Как это «&» в конце моей команды быстро запустило скрипт?

Решая некоторые проблемы 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, и это заняло около 5 секунд для каждых 10 попыток. Затем, следуя советам, я положил '&' в конце этой строки:

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

И он пробовал 100 секунд комбинаций в течение нескольких секунд. Я был очень удивлен. Может ли кто-нибудь объяснить мне логику? Что делали «&»?

2 Solutions collect form web for “Как это «&» в конце моей команды быстро запустило скрипт?”

Добавление & запуск фонового процесса.

Если вы пишете a; b a; b , он выполнит команду a , дождитесь ее завершения, а затем выполнит команду b в последовательности.

Если вы напишете a & b , он будет порожден как фоновый процесс. Он не будет ждать, пока он закончится, и он сразу начнет работать b . Он будет работать одновременно.

Вы можете видеть, что он делает, экспериментируя в оболочке. Если у вас установлен X , xterm – хороший способ увидеть, что происходит: набрав

 $ xterm 

приведет к открытию другого окна терминала, и первый будет ждать, пока вы его не закроете. Только когда вы его закроете, вы вернете свою оболочку. Если вы напечатаете

 $ xterm & 

то он запустит его в фоновом режиме, и вы немедленно вернете оболочку, а окно xterm также останется открытым.

Поэтому, если вы пишете

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

он делает соединение, отправляет строку, сохраняет то, что появляется в файле, и только затем переходит к следующему.

Добавление & заставляет его не ждать. В конечном итоге все десять тысяч из них будут работать более или менее одновременно.

Ваш скрипт, кажется, «заканчивается» быстрее, потому что, вероятно, на тот момент он не заканчивался. Он просто сделал десять тысяч фоновых заданий, а затем закончил первый план.

Это также означает, что в вашем случае он попытается открыть сразу десять тысяч подключений. В зависимости от того, с чем может справиться другой конец, некоторые из них вполне могут потерпеть неудачу. Не только это, но нет никакой гарантии, что они будут работать в порядке, на самом деле они почти наверняка не будут, поэтому то, что на самом деле окажется в /tmp/me/dump.txt – это догадка.

Вы проверяли правильность вывода?

Команда nc (netcat) является дорогостоящей, временной. Он должен подключиться к удаленному серверу, отправить данные, дождаться ответа и вернуть его.

Используя & вы в основном разворачиваете эту команду в фоновом режиме (это называется «заданием»). Само по себе это не ускоряет его работу. Но это означает, что ваш цикл больше не блокируется и может выполнить следующую итерацию (со следующей nc).

Таким образом, ваше ускорение вызвано тем, что все эти удаленные соединения параллельны, в противном случае им придется ждать завершения предыдущего.

Btw, в зависимости от вашего терминала, команды эха также могут замедлить ваш цикл (иногда им приходится ждать, пока в буфере записи не будет места).

Linux и Unix - лучшая ОС в мире.