สิ่งนี้ '&' ในตอนท้ายของคำสั่งของฉันทำให้สคริปต์เร็วขึ้น?


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

นี้เป็นอย่างเหลือเชื่อช้าเจ็บปวด ฉันต้องลองชุดค่าผสมจาก 1,000 ถึง 9999 และใช้เวลาประมาณ 5 วินาทีต่อการพยายาม 10 ครั้ง จากนั้นทำตามคำแนะนำฉันใส่ '&' ที่ท้ายบรรทัดนี้:

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

และมันลองชุดค่าผสม 100 ชุดภายในไม่กี่วินาที ฉันประหลาดใจมาก. มีคนอธิบายตรรกะให้ฉันได้ไหม '&' ทำอะไร


3
ฉันแนะนำให้คุณอ่านคู่มือเชลล์ของคุณ &ทำให้คำสั่งทำงานในพื้นหลังนั่นคือทั้งหมด มันไม่ได้ทำให้เร็วขึ้นหรืออะไร อ่านสิ่งที่เชลล์คุณใช้ (ฉันถือว่าทุบตี) คู่มือ
polemon

มันทำให้มันทำงานในพื้นหลังคุณควรดูว่ามันเสร็จจริง
DisplayName

7
คุณไม่ต้องการทดสอบที่ต่ำกว่า 1,000 ข้อ? กรุณาใช้for i in {1000..9999}
วอลเตอร์ A

2
มีความเป็นไปได้ที่มันจะทำให้สคริปต์ทำงานได้เร็วขึ้นเนื่องจากตอนนี้พอร์ตหมดเวลาขนานกัน อย่างไรก็ตามคุณควรรวม a waitในตอนท้ายด้วย
Bratchley

คุณมองไปที่nc -z localhost 1000-2000?
วอลเตอร์ A

คำตอบ:


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 .. และบรรทัดที่มีรหัสผ่านที่ถูกต้องถูกเปิดเผยให้ฉัน
learnerX

16
@intellikid: ฉันไม่ได้ตั้งใจที่จะหยาบคาย แต่มันทำงานผ่านโชคที่แท้จริง การสั่งซื้อไม่สำคัญไม่เพียง แต่การตอบสนองของเซิร์ฟเวอร์นั้นเล็กกว่าncบัฟเฟอร์การเขียนของ หากนี่ไม่ใช่กรณีดังกล่าวการตอบสนองของเซิร์ฟเวอร์น่าจะเป็นแบบ interleaved เช่นถ้าคุณได้มีการเขียน buffer 1 ไบต์และการตอบสนองได้1111และ2222คุณจะมีโอกาสได้เห็นสิ่งที่ต้องการมากกว่าการแยกออกจากกันอย่างเป็นระเบียบ11221212 1111 2222
marinus

ใช่ฉันรู้แล้ว นั่นคือเหตุผลที่ฉันเล่นเกมเหล่านี้ ฉันเรียนรู้ในแต่ละระดับ ขอขอบคุณที่ช่วยเหลือการเรียนรู้
learnerX

2

คำสั่ง nc (netcat) มีค่าใช้จ่ายและใช้เวลานาน จำเป็นต้องเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลส่งข้อมูลรอการตอบกลับและส่งคืน

เมื่อใช้ & คุณจะใช้คำสั่งนั้นในกระบวนการพื้นหลัง (โดยทั่วไปเรียกว่า "งาน") ด้วยตัวเองที่ไม่ได้ทำให้มันทำงานได้เร็วขึ้น แต่หมายความว่าลูปของคุณไม่ถูกบล็อกอีกต่อไปและสามารถทำการวนซ้ำครั้งถัดไป (ด้วย NC ถัดไป) แล้ว

การเร่งความเร็วของคุณนั้นเกิดจากการเชื่อมต่อระยะไกลทั้งหมดเหล่านี้ในแบบคู่ขนานมิฉะนั้นพวกเขาจะต้องรอให้การเชื่อมต่อก่อนหน้านี้เสร็จสมบูรณ์

Btw ขึ้นอยู่กับเทอร์มินัลของคุณคำสั่ง echo สามารถชะลอลูปของคุณได้ (บางครั้งพวกเขาต้องรอจนกว่าจะมีพื้นที่ว่างในบัฟเฟอร์การเขียน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.