2009-03-13 44 views
14

Tôi đang cố gắng thử nghiệm với netcat để tìm hiểu thêm về cách hoạt động của HTTP. Tôi muốn kịch bản một số trong nó trong bash hoặc Perl, nhưng tôi đã đánh vào một khối vấp ngã sớm trong thử nghiệm của tôi.Thực hiện yêu cầu tiêu đề HTTP với netcat

Nếu tôi chạy netcat ngay từ dấu nhắc và nhập yêu cầu HEAD, nó hoạt động và tôi nhận được tiêu đề cho máy chủ web tôi đang thăm dò.

này hoạt động:

 [[email protected] ~]$ nc 10.1.1.2 80 
    HEAD/HTTP/1.0 

    HTTP/1.1 200 OK 
    MIME-Version: 1.0 
    Server: Edited out 
    Content-length: 0 
    Cache-Control: public 
    Expires: Sat, 01 Jan 2050 18:00:00 GMT 

    [[email protected] ~]$

Nhưng khi tôi đặt cùng một thông tin vào một tập tin văn bản và thức ăn cho netcat thông qua một đường ống hoặc qua chuyển hướng, để chuẩn bị cho kịch bản, nó không trả lại các tiêu đề.
Các tập tin văn bản bao gồm các yêu cầu HEAD và hai dòng mới:

HEAD/HTTP/1.0 

gửi cùng một thông tin qua vang hoặc printf không hoạt động hoặc.

$ printf "HEAD/HTTP/1.0\r\n"; |nc -n 10.1.1.2 80 
$ /bin/echo -ne 'HEAD/HTTP/1.0\n\n' |nc 10.1.1.2 80

Bất kỳ ý tưởng nào tôi đang làm sai? Không chắc chắn nếu đó là một vấn đề bash, một vấn đề echo, hoặc một vấn đề netcat.

Tôi đã kiểm tra lưu lượng truy cập qua Wireshark và yêu cầu thành công (được nhập thủ công) gửi dòng mới trong gói thứ hai, trong khi phương thức echo, printf và văn bản giữ dòng mới trong cùng một gói, nhưng tôi không chắc chắn nguyên nhân gây ra hành vi này.

+0

FYI, các \ r \ n trong printf là có mục đích; Tôi chuyển giữa \ r và \ n trong các kết hợp khác nhau để xem nó có thay đổi gì không - không có hiệu lực. – romandas

Trả lời

22

Bạn cần hai lô "\ r \ n" và cũng có thể yêu cầu netcat đợi phản hồi. printf "HEAD/HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 hoặc tương tự sẽ hoạt động.

+0

Điều này không hiệu quả đối với tôi. Tôi đã sao chép trực tiếp dòng của bạn, nhưng kết nối vẫn chấm dứt trước khi truyền tiêu đề. – romandas

+0

Sau đó, vấn đề là ở cuối máy chủ của bạn. printf "HEAD/HTTP/1.0 \ r \ n \ r \ n" | nc www.toothycat.net 80 hoạt động ở đây. – moonshadow

+0

Máy chủ không chấm dứt yêu cầu; nó được khởi xướng bởi khách hàng. Wireshark cho thấy khách hàng của tôi gửi gói FIN ngay sau gói yêu cầu HEAD, sau đó là ACK của máy chủ và chấm dứt một cách duyên dáng. Không chắc chắn nguyên nhân gây ra sự khác biệt. Bạn đang sử dụng phiên bản netcat nào? – romandas

7

Một cách khác là sử dụng quy ước được gọi là quy ước 'heredoc'.

$ nc -n -i 1 10.1.1.2 80 <<EOF 
> HEAD/HTTP/1.0 
> 
> EOF 
+0

Điều này hoạt động tốt hơn bao giờ hết – dotslash

2

Một cách khác để nc chờ phản hồi là thêm chế độ ngủ vào đầu vào. ví dụ.

(printf 'GET/HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80 
0

Bạn có thể sử dụng dưới lệnh netcat để làm webserver dụ của bạn:

MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}') 
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | sudo nc -l -p 80 ; done& 
+0

IP IPv4 được sử dụng cho cổng mặc định (bất kể giao diện nào; Linux): 'ip route show | grep -o 'src [\ .0-9] \ +' | uniq | cắt -d '' -f2' –

0

Dòng này cũng sẽ làm việc như tương đương:

echo -e "HEAD/HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80 
Các vấn đề liên quan