내 명령이 끝날 때이 ‘&’는 어떻게 스크립트를 그렇게 빨리 만들었습니까? echo “a

일부 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

이것은 엄청나게 아 pain습니다 . 나는 1000에서 9999까지의 조합을 시도해야했고 10 회 시도마다 약 5 초가 걸렸습니다. 그런 다음 조언에 따라이 줄의 끝에 ‘&’를 넣습니다.

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

그리고 몇 초 안에 수백 가지의 조합을 시도했습니다. 나는 매우 놀랐다. 누군가 나에게 논리를 설명해 주시겠습니까? ‘&’는 무엇을 했습니까?



답변

추가 &하면 백그라운드 프로세스가 생성됩니다.

을 쓰면 a; bcommand a를 실행하고 완료 될 때까지 기다렸다가 command b를 차례로 실행 합니다.

를 쓰면 백그라운드 프로세스로 a & b생성 a됩니다. 완료 될 때까지 기다리지 않고 b즉시 실행을 시작 합니다. 한 번에 둘 다 실행됩니다.

셸에서 실험하여 수행하는 작업을 확인할 수 있습니다. X설치 한 경우 xterm어떻게되는지 확인하는 좋은 방법입니다.

$ xterm

다른 터미널 창이 열리고 첫 번째 터미널 창이 닫힐 때까지 기다립니다. 닫을 때만 껍질을 되 찾을 수 있습니다. 입력하면

$ xterm &

그런 다음 백그라운드에서 실행되고 쉘도 즉시 다시 가져오고 xterm창은 열린 상태로 유지됩니다.

그래서 당신이 쓰는 경우

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

연결하고 문자열을 보내고 파일에 나오는 것을 저장 한 다음 다음으로 이동합니다.

를 추가하면 &기다리지 않습니다. 10 만 개를 동시에 또는 거의 동시에 실행하게됩니다.

스크립트는 실제로 그 시간 안에 완료되지 않았기 때문에 더 빨리 “종료”하는 것 같습니다. 방금 10 만 건의 배경 작업을 한 다음 포 그라운드 작업을 끝냈습니다.

이것은 또한 귀하의 경우 한 번에 만 개 이상의 연결 을 열려고 시도한다는 것을 의미합니다 . 다른 쪽 끝이 처리 할 수있는 내용에 따라 일부는 실패 할 수 있습니다. 그뿐만 아니라 순서대로 실행된다는 보장이 없습니다. 실제로 거의 확실하지 않을 것이므로 실제로 결국 /tmp/me/dump.txt사람의 추측입니다.

출력이 올바른지 확인 했습니까?


답변

nc (netcat) 명령은 시간이 많이 소요됩니다. 원격 서버에 연결하고 데이터를 보내고 응답을 기다렸다가 반환해야합니다.

&를 사용하면 기본적으로 백그라운드 프로세스에서 해당 명령을 포크합니다 ( “작업”이라고 함). 그 자체로는 더 빨리 실행되지 않습니다. 그러나 이것은 루프가 더 이상 차단되지 않았으며 다음 반복 (다음 nc로)을 이미 수행 할 수 있음을 의미합니다.

따라서 기본적으로 속도 향상은 이전의 연결이 완료되기를 기다려야하는 모든 원격 연결을 병렬로 만들어서 발생합니다.

Btw, 터미널에 따라 echo 명령도 루프 속도를 늦출 수 있습니다 (쓰기 버퍼에 공간이 생길 때까지 기다려야 할 수도 있습니다).


답변