Cung cấp nội dung của tệp văn bản dưới dạng lệnh tới telnet


10

Với lệnh telnet docs.python.org 80, tôi có thể thực hiện một yêu cầu HTTP thủ công http://docs.python.org/2/license.html, bằng cách nhập yêu cầu thực tế.

Bây giờ, thay vì nhập trực tiếp, tôi muốn cung cấp yêu cầu từ tệp văn bản.

Tôi đã thử điều này:

cat request.txt|telnet docs.python.org 80


request.txt :

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(Bạn phải hoàn thành tệp với một dòng trống hoặc bạn sẽ nhận được yêu cầu xấu!)


Nhưng kết nối đến máy chủ bị đóng ngay lập tức.

Làm thế nào tôi nên đúng ống request.txt tới telnet docs.python.org 80?


biên tập:

Thật tốt khi biết điều đó; nếu bạn sử dụng HEADthay vì GET, bạn sẽ nhận được phản hồi giống như khi bạn thực hiện một GETyêu cầu, ngoại trừ nội dung thư.
Vì vậy, sử dụng HEADnếu bạn chỉ muốn kiểm tra các tiêu đề HTTP. (tức là nội dung của phản hồi không làm lộn xộn đầu ra vỏ của bạn.)


Bạn có thể bao gồm lệnh thực tế bạn chạy thủ công để chúng tôi có thể so sánh? Khi tôi chạy GETbạn đã đăng, tôi gặp 408 Request Time-outlỗi. Ngoài ra, wget http://docs.python.org/2/license.htmlkhông phải là một lựa chọn?
terdon

Các lệnh là chính xác. Tôi nghĩ rằng bạn đang thực hiện kết nối với máy chủ ngay khi bạn nhập telnet docs.python.org 80, vì vậy bạn sẽ phải nhanh chóng nhập hai dòng đó (sao chép dán nếu không hoàn hảo.) Trong vài giây hoặc máy chủ sẽ trả về lỗi hết thời gian.
Bentley4

Đây là các lệnh chính xác:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4

1
Tôi nghĩ lý do tại sao bạn cần nhập <ENTER>lần thứ hai vào cuối là vì giao thức HTTP yêu cầu thêm một dòng trống sau các tiêu đề yêu cầu. Xem phần thông báo yêu cầu của bài viết wiki HTTP
Bentley4

1
Chết tiệt, về mặt lý thuyết, bạn sẽ có thể làm được telnet < request.txtnhưng tôi không thể làm cho GETlệnh hoạt động được.
terdon

Câu trả lời:


21

Sử dụng netcat (lệnh nc) thay vì "telnet", vì vậy

yêu cầu mèo | nc docs.python.org 80

Telnet là một hack nhanh chóng và dễ dàng, nhưng rõ ràng netcat là công cụ chính xác cho công việc.


Làm thế nào là Telnet 'nhanh hơn' và 'dễ dàng hơn' sau đó là netcap? Tôi không thấy bất kỳ sự khác biệt sử dụng trong trường hợp này.
Bentley4

Chắc chắn không phải trong trường hợp này, nhưng tôi nghĩ mọi người (đọc Tôi, và rõ ràng là bạn !!!) có xu hướng sử dụng telnet bởi vì đó là điều đầu tiên chúng tôi học được, và dĩ nhiên, nó có sẵn trên Windows và Linux, nơi tôi tin rằng netcat không được cài đặt sẵn trong Windows.
davidgo

5

Tôi thực sự không có bất kỳ kinh nghiệm nào telnetnhưng nó lấy đầu vào từ chuyển hướng tập tin:

telnet < abc.txt

Tôi có thể lấy nó để kết nối với máy chủ chính xác như sau:

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign host.

Có lẽ bạn có thể tìm ra cách để nó chấp nhận GETlệnh nhưng tôi không thể. Một cách khác là sử dụng expecttập lệnh:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

Sau đó, bạn có thể lưu tập lệnh dưới dạng telnet.exp, làm cho nó thực thi và chạy nó:

./telnet.exp > output.html

Thật tuyệt, tôi không biết expect! Tôi đã chọn câu trả lời của davidgo vì đây chỉ là giải pháp tốt nhất cho trường hợp này. Tôi không thấy bất kỳ sự khác biệt sử dụng nào giữa netcap và telnet cho những gì tôi muốn đạt được. Cảm ơn vì nỗ lực dù sao Terdon, nếu tôi có thể nâng cao câu trả lời của bạn nhiều hơn, tôi sẽ làm.
Bentley4

1
@ Bentley4 không có vấn đề gì, sử dụng nclà giải pháp tốt hơn, bạn nên chấp nhận nó.
terdon

Tôi không thấy làm thế nào interactlà đúng cách để kết thúc expectkịch bản đó .
2rs2ts

@ 2rs2ts Tôi biết rất ít về kỳ vọng, bạn có thể đúng nhưng tôi không thể nói vì nhận xét của bạn không cho tôi biết lý do tại sao bạn nghĩ nó sai. Hiểu biết của tôi là interact"trao quyền kiểm soát quy trình hiện tại cho người dùng, do đó tổ hợp phím được gửi đến quy trình hiện tại và thiết bị xuất chuẩn và thiết bị xuất chuẩn của quy trình hiện tại được trả về" (đó là từ man expect). Vì vậy, interactlà cách để cung cấp cho người dùng một cách thực sự sử dụng kết nối telnet.
terdon

Vì câu hỏi ban đầu là về việc cung cấp nội dung của tệp telnetchứ không phải tương tác với nó, tôi nghĩ bạn nên kết thúc bằng close -i $spawn_idhoặc một cái gì đó tương tự. Sau đó, kịch bản sẽ thoát. Với interacttôi thực sự không thể thoát ra được telnet, và phải đóng thiết bị đầu cuối của tôi. Khá là khổ sở (mặc dù nó có thể là một phần lỗi của tôi.)
2rs2ts
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.