Як це "&" наприкінці моєї команди зробило сценарій ТАКЕ швидким?


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, і це займало близько 5 секунд на кожні 10 спроб. Потім, дотримуючись поради, я ставлю "&" в кінці цього рядка:

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

І, він спробував 100 комбінацій протягом декількох секунд. Я був дуже здивований. Може хтось пояснить мені логіку? Що зробили "&"?


3
Я пропоную прочитати посібник з оболонкою. &змушує команду виконуватись у фоновому режимі, ось і все. Це не зробило це швидше чи нічого. Прочитайте будь-які оболонки, якими ви користуєтесь (я вважаю, баш).
полемон

Це змусило його працювати у фоновому режимі, ви повинні подивитися, що він фактично закінчений.
DisplayName

7
Ви не хочете тестувати менше 1000? Будь ласка, використовуйтеfor i in {1000..9999}
Вальтер А

2
Можливо, це зробило те, що сценарій запускається швидше, оскільки порти зараз вичерпуються паралельно. Ти мусиш включити а waitв кінці.
Братчлі

Ви подивилися nc -z localhost 1000-2000?
Вальтер А

Відповіді:


30

Додавання &нерестів фоновий процес.

Якщо ви пишете a; b, вона запустить команду a, дочекайтеся її завершення, потім виконайте команду bпослідовно.

Якщо ви пишете a & b, це породжується aяк фоновий процес. Він не чекатиме його закінчення, і він почне працювати bнегайно. Він запуститиметься обидва відразу.

Ви можете побачити, що це робить, експериментуючи в оболонці. Якщо ви 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 мені виявлено рядок, що містить правильний пароль.
ученьX

16
@intellikid: Я не маю на увазі бути грубим, але це спрацювало через чисту удачу. Порядок не мав значення, відповіді сервера були меншими, ніж ncв буфері запису. Якби це не було, відповіді сервера, швидше за все, були б переплетені. Тобто, якби у вас був буфер запису в 1 байт, а відповіді були 1111і 2222, ви, ймовірно, побачили б щось подібне, 11221212а не акуратно відокремлене 1111 2222.
Марінус

Так, я зрозумів це. Ось чому я граю в ці бойові ігри. Я вчусь на кожному рівні. Дякую за допомогу в навчанні.
ученьX

2

Команда nc (netcat) - це дорого, вимагає часу. Потрібно підключитися до віддаленого сервера, надіслати дані, чекати відповіді та повернути їх.

Використовуючи &, ви в основному форксуєте цю команду у фоновому процесі (це називається "робота"). Сам по собі, що не змушує його працювати швидше. Але це означає, що ваш цикл більше не блокується, і він може вже робити наступну ітерацію (з наступним nc).

Таким чином, ваша швидкість обумовлена ​​тим, що ви робите паралельно всі ці віддалені з'єднання, інакше їм доведеться чекати завершення попереднього.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.