ป้อนเนื้อหาของไฟล์ข้อความเป็นคำสั่งไปยัง telnet


10

ด้วยคำสั่งtelnet docs.python.org 80ฉันสามารถทำคำขอ HTTP ด้วยตนเองhttp://docs.python.org/2/license.htmlโดยพิมพ์คำขอจริง

ตอนนี้แทนที่จะพิมพ์แบบสดฉันต้องการฟีดคำขอจากไฟล์ข้อความ

ฉันลองสิ่งนี้:

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


request.txt :

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

(คุณต้องจบไฟล์ด้วยบรรทัดว่างมิฉะนั้นคุณจะได้รับคำขอที่ไม่ดี!)


แต่การเชื่อมต่อกับเซิร์ฟเวอร์จะปิดทันที

วิธีฉันควรต้องท่อrequest.txtเพื่อtelnet docs.python.org 80?


แก้ไข:

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


คุณสามารถรวมคำสั่งจริงที่คุณเรียกใช้ด้วยตนเองเพื่อให้เราเปรียบเทียบได้หรือไม่ เมื่อฉันเรียกใช้GETคุณโพสต์ฉันได้รับ408 Request Time-outข้อผิดพลาด นอกจากนี้wget http://docs.python.org/2/license.htmlไม่ได้เป็นตัวเลือก?
terdon

คำสั่งถูกต้อง ฉันคิดว่าคุณกำลังเชื่อมต่อกับเซิร์ฟเวอร์ในเวลาที่คุณเข้าtelnet docs.python.org 80มาดังนั้นคุณจะต้องรีบและพิมพ์สองบรรทัด (คัดลอกวางถ้า necc.) ภายในไม่กี่วินาทีหรือเซิร์ฟเวอร์จะส่งคืนข้อผิดพลาดการหมดเวลา
Bentley4

เหล่านี้เป็นคำสั่งที่ถูกต้อง:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley 4

1
ฉันคิดว่าเหตุผลที่คุณต้องพิมพ์<ENTER>ครั้งที่สองในตอนท้ายเพราะโพรโทคอล HTTP ต้องการบรรทัดว่างพิเศษหลังจากส่วนหัวของคำขอ ดูส่วนข้อความคำขอของบทความ HTTP wiki
Bentley4

1
ในทางทฤษฎีแล้วคุณน่าจะทำได้telnet < request.txtแต่ฉันไม่สามารถGETสั่งให้ทำงานได้
terdon

คำตอบ:


21

ใช้ netcat (คำสั่ง nc) แทน "telnet"

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

Telnet เป็นแฮ็คที่ง่ายและรวดเร็ว แต่ netcat เป็นเครื่องมือที่ถูกต้องสำหรับงาน


Telnet 'เร็วขึ้น' และ 'ง่ายขึ้น' อย่างไรแล้ว netcap ฉันไม่เห็นความแตกต่างในการใช้งานในกรณีนี้
Bentley4

ไม่แน่นอนสำหรับกรณีนี้ แต่ฉันคิดว่าผู้คน (อ่านฉันและเห็นได้ชัดว่าคุณ !!!) มีแนวโน้มที่จะใช้ telnet เพราะเป็นสิ่งแรกที่เราเรียนรู้และแน่นอนมีอยู่ใน Windows และ Linux ซึ่งฉันเชื่อว่า netcat ไม่ได้มาพร้อมกับ Windows
davidgo

5

ฉันไม่เคยมีประสบการณ์ใด ๆ มาก่อนtelnetแต่จะได้รับการป้อนข้อมูลจากการเปลี่ยนเส้นทางไฟล์:

telnet < abc.txt

ฉันสามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างถูกต้องดังต่อไปนี้:

$ 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.

บางทีคุณสามารถหาวิธีที่จะให้มันยอมรับGETคำสั่ง แต่ฉันทำไม่ได้ อีกทางเลือกหนึ่งคือการใช้expectสคริปต์:

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

จากนั้นคุณสามารถบันทึกสคริปต์เป็นtelnet.expทำให้ใช้งานได้และเรียกใช้:

./telnet.exp > output.html

เย็นผมไม่ทราบว่าของexpect! ฉันเลือกคำตอบของดาวิดเพราะมันเป็นทางออกที่ดีที่สุดสำหรับกรณีนี้ ฉันไม่เห็นความแตกต่างในการใช้งานระหว่าง netcap และ telnet สำหรับสิ่งที่ฉันต้องการให้บรรลุ ขอบคุณสำหรับความพยายามอย่างไรก็ตาม Terdon ถ้าฉันสามารถเอาชนะคำตอบของคุณได้มากขึ้น
Bentley4

1
@ Bentley4 ไม่มีปัญหาการใช้ncเป็นทางออกที่ดีกว่าคุณควรยอมรับมัน
terdon

ฉันไม่เห็นว่าวิธีที่interactถูกต้องในการจบexpectสคริปต์นั้นคืออะไร
2rs2ts

@ 2rs2ts ฉันรู้น้อยมากเกี่ยวกับความคาดหวังคุณอาจพูดถูก แต่ฉันไม่สามารถบอกได้เพราะความคิดเห็นของคุณไม่ได้บอกฉันว่าทำไมคุณคิดว่ามันผิด ความเข้าใจของฉันคือinteract"ให้การควบคุมกระบวนการปัจจุบันแก่ผู้ใช้เพื่อให้การกดแป้นถูกส่งไปยังกระบวนการปัจจุบันและ stdout และ stderr ของกระบวนการปัจจุบันจะถูกส่งกลับ" (มาจากman expect) ดังนั้นinteractเป็นวิธีการให้ผู้ใช้วิธีจริงโดยใช้การเชื่อมต่อ telnet
terdon

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