Làm thế nào điều này '&' ở cuối lệnh của tôi, làm cho kịch bản SO nhanh?


18

Trong khi giải quyết một số thách thức CTF trực tuyến, tôi đã gặp một tình huống mà tôi cần phải đánh bại máy chủ. Đây là mã tôi đã viết:

#!/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

Điều này là vô cùng, đau đớn chậm . Tôi cần thử kết hợp từ 1000 đến 9999 và điều này mất khoảng 5 giây cho mỗi 10 lần thử. Sau đó, làm theo lời khuyên, tôi đặt '&' ở cuối dòng này:

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

Và, nó đã thử 100 giây kết hợp trong vài giây. Tôi đã rất ngạc nhiên. Ai đó có thể giải thích logic cho tôi? '&' Đã làm gì?


3
Tôi đề nghị bạn đọc hướng dẫn sử dụng vỏ của bạn. &làm cho lệnh chạy trong nền, đó là tất cả. Nó không làm cho nó nhanh hơn hoặc bất cứ điều gì. Đọc bất cứ thứ gì bạn đang sử dụng (tôi giả sử bash).
Polemon

Nó làm cho nó chạy trong nền, bạn nên xem nó thực sự đã hoàn thành.
DisplayName

7
Bạn không muốn kiểm tra dưới 1000? Vui lòng sử dụngfor i in {1000..9999}
Walter A

2
Có thể nó đã làm cho kịch bản chạy nhanh hơn vì các cổng hiện đang hết thời gian song song. Bạn nên bao gồm một waitở cuối, mặc dù.
Bratchley

Bạn đã nhìn vào nc -z localhost 1000-2000?
Walter A

Câu trả lời:


30

Thêm &sinh sản một quá trình nền.

Nếu bạn viết a; b, nó sẽ chạy lệnh a, đợi cho nó kết thúc, sau đó chạy lệnh b, theo trình tự.

Nếu bạn viết a & b, nó sẽ sinh ra anhư một quá trình nền. Nó sẽ không đợi nó kết thúc, và nó sẽ bắt đầu chạy bngay lập tức. Nó sẽ chạy cả hai cùng một lúc.

Bạn có thể thấy những gì nó làm bằng cách thử nghiệm trong vỏ. Nếu bạn đã Xcài đặt, xtermlà một cách tốt để xem điều gì sẽ xảy ra: gõ

$ xterm

sẽ khiến một cửa sổ đầu cuối khác mở và cửa sổ đầu tiên sẽ đợi cho đến khi bạn đóng nó. Chỉ khi bạn đóng nó, bạn sẽ lấy lại vỏ của bạn. Nếu bạn gõ

$ xterm &

sau đó nó sẽ chạy nó trong nền và bạn sẽ lấy lại vỏ của mình ngay lập tức, trong khi xtermcửa sổ cũng sẽ vẫn mở.

Vì vậy, nếu bạn viết

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

nó tạo kết nối, gửi chuỗi, lưu trữ những gì xuất hiện trong tệp và chỉ sau đó chuyển sang tiếp theo.

Thêm &làm cho nó không chờ đợi. Nó sẽ kết thúc chạy tất cả mười ngàn trong số họ ít nhiều đồng thời.

Kịch bản của bạn dường như "kết thúc" nhanh hơn, bởi vì nó có thể không thực sự kết thúc trong thời gian đó. Nó chỉ thực hiện mười nghìn công việc nền, và sau đó kết thúc tiền cảnh.

Điều này cũng có nghĩa là, trong trường hợp của bạn, nó sẽ cố gắng mở mười nghìn kết nối ít nhiều cùng một lúc. Tùy thuộc vào những gì đầu kia có thể xử lý, một số trong số họ có thể thất bại. Không chỉ vậy, nhưng không có gì đảm bảo rằng họ sẽ chạy theo thứ tự, trên thực tế họ gần như chắc chắn sẽ không, vì vậy những gì thực sự sẽ xảy ra /tmp/me/dump.txtlà đoán của bất cứ ai.

Bạn đã kiểm tra xem đầu ra có đúng không?


2
Vâng, tôi đã giải quyết thử thách. Máy chủ sẽ phản hồi với mật khẩu nếu mã chính xác được cung cấp cho nó. Tôi đã thực thi lệnh này để kiểm tra 'dump.txt': $ cat dump.txt | sort | uniq -u .. và dòng chứa mật khẩu chính xác đã được tiết lộ cho tôi.
họcX

16
@intellikid: Tôi không có ý thô lỗ, nhưng nó đã hoạt động nhờ may mắn. Không chỉ thứ tự không quan trọng, phản hồi của máy chủ còn nhỏ hơn ncbộ đệm ghi. Nếu đây không phải là trường hợp, phản hồi của máy chủ rất có thể đã được xen kẽ. Tức là, nếu bạn đã có bộ đệm ghi là 1 byte, và các phản hồi là 11112222, bạn có thể đã thấy một cái gì đó giống như 11221212thay vì tách biệt gọn gàng 1111 2222.
bến tàu

Vâng, tôi nhận ra rằng. Đó là lý do tại sao tôi chơi những trò chơi này. Tôi học ở mỗi cấp độ. Cảm ơn bạn đã giúp đỡ học tập.
họcX

2

Lệnh nc (netcat) rất tốn kém, thời gian khôn ngoan. Nó cần kết nối với máy chủ từ xa, gửi dữ liệu, chờ phản hồi và trả lại.

Bằng cách sử dụng & về cơ bản bạn đang thực hiện lệnh đó trong một quy trình nền (nó được gọi là "công việc"). Chính nó không làm cho nó chạy nhanh hơn. Nhưng nó có nghĩa là vòng lặp của bạn không còn bị chặn nữa và có thể thực hiện lần lặp tiếp theo (với nc tiếp theo).

Về cơ bản, việc tăng tốc của bạn được gây ra bằng cách thực hiện song song tất cả các kết nối từ xa này nếu không chúng sẽ phải chờ kết nối trước đó hoàn thành.

Btw, tùy thuộc vào thiết bị đầu cuối của bạn, các lệnh echo cũng có thể làm chậm vòng lặp của bạn (đôi khi chúng cần phải đợi cho đến khi có khoảng trống trong bộ đệm ghi).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.