명령 끝에 "&"가 있으면 어떻게 스크립트가 그렇게 빨라지나요?

명령 끝에 "&"가 있으면 어떻게 스크립트가 그렇게 빨라지나요?

온라인에서 일부 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 명령도 루프 속도를 늦춥니다(때때로 쓰기 버퍼에 공간이 생길 때까지 기다려야 함).

관련 정보