コマンドの最後に「&」があると、どのようにスクリプトが速くなりますか?

コマンドの最後に「&」があると、どのようにスクリプトが速くなりますか?

オンラインでいくつかの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 &

そして数秒で何百もの組み合わせを試してみます。驚きました。誰かが私にロジックを説明できますか? 「&」何をしたの?

答え1

追加すると、&バックグラウンドプロセスが作成されます。

これを作成すると、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

接続を確立し、文字列を送信し、結果をファイルに保存し、それから次に進みます。

&もう待たないように追加してください。結局、10,000個程度が同時に実行されます。

あなたのスクリプトはその時間の間に実際に完了していないので、より早く「終了」するようです。たった10,000のバックグラウンドジョブを作成し、フォアグラウンドジョブを終了しました。

これはまた、あなたの場合は開こうとすることを意味します。のみある程度同時に接続してください。相手が処理できるタスクによっては、一部が失敗する可能性があります。それだけでなく、順番に実行されるという保証もなく、実際にはそうではないことがほとんど確実であるため、最終結果/tmp/me/dump.txtは誰でも推測できます。

出力が正しく行われていることを確認できますか?

答え2

nc(netcat)コマンドは高価で時間がかかります。リモートサーバーに接続し、データを送信し、応答を待ってから返す必要があります。

&を使用すると、基本的にバックグラウンドプロセス(「ジョブ」と呼ばれる)からコマンドを分岐します。それ自体では、より速く実行されません。ただし、これはループがブロックされなくなり、次の繰り返し(次のncを使用して)に進むことができることを意味します。

したがって、基本的に、これらのリモート接続をすべて並列に実行すると速度が向上します。それ以外の場合は、以前の接続が完了するのを待つ必要があります。

しかし、端末によっては、echoコマンドもループ速度を遅くします(時々書き込みバッファにスペースがあるのを待つ必要があります)。

関連情報