Mengumpankan konten file teks sebagai perintah ke telnet

10

Dengan perintah itu telnet docs.python.org 80, saya bisa melakukan permintaan HTTP manual http://docs.python.org/2/license.html, dengan mengetikkan permintaan aktual.

Sekarang, alih-alih mengetiknya secara langsung, saya ingin memberi makan permintaan dari file teks.

Saya mencoba ini:

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


request.txt :

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

(Anda harus menyelesaikan file dengan baris kosong atau Anda akan mendapatkan permintaan yang buruk!)


Tetapi koneksi ke server segera ditutup.

Bagaimana saya harus mem- pipe request.txt dengan benar telnet docs.python.org 80?


edit:

Itu baik untuk diketahui; jika Anda menggunakan HEADalih-alih GET, Anda akan mendapatkan respons yang sama seperti jika Anda melakukan GETpermintaan, kecuali untuk badan pesan.
Jadi, gunakan HEADjika Anda hanya ingin memeriksa tajuk HTTP. (Yaitu Agar isi dari tanggapan tidak mengacaukan keluaran shell Anda.)

Bentley4
sumber
Bisakah Anda memasukkan perintah aktual yang Anda jalankan secara manual sehingga kami dapat membandingkan? Ketika saya menjalankan GETposting Anda, saya mendapatkan 408 Request Time-outkesalahan. Juga, wget http://docs.python.org/2/license.htmlbukankah sebuah opsi?
terdon
Perintahnya benar. Saya pikir Anda membuat koneksi dengan server saat Anda masuk telnet docs.python.org 80, jadi Anda harus bergegas dan mengetikkan dua baris tersebut (salin tempel jika perlu.) Dalam beberapa detik atau server akan mengembalikan kesalahan batas waktu.
Bentley4
Ini adalah perintah yang tepat:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4
1
Saya pikir alasan mengapa Anda perlu mengetik <ENTER>yang kedua kali pada akhirnya adalah karena protokol HTTP memerlukan baris kosong tambahan setelah header permintaan. Lihat bagian pesan permintaan dari artikel wiki HTTP
Bentley4
1
Sialan, secara teoritis, Anda seharusnya bisa melakukan telnet < request.txttetapi saya tidak bisa mendapatkan GETperintah untuk bekerja.
terdon

Jawaban:

21

Gunakan netcat (perintah nc) daripada "telnet", jadi

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

Telnet adalah peretasan cepat dan mudah, tetapi netcat, tampaknya, adalah alat yang tepat untuk pekerjaan itu.

davidgo
sumber
Bagaimana Telnet lebih cepat dan lebih mudah dari netcap? Saya tidak melihat perbedaan penggunaan dalam hal ini untuk kasus ini.
Bentley4
Tentu saja tidak untuk kasus ini, tapi saya pikir orang (baca Saya, dan ternyata Anda !!!) cenderung menggunakan telnet karena ini adalah hal pertama yang kami pelajari, dan, tentu saja, tersedia di Windows dan Linux, di mana saya percaya netcat tidak diinstal sebelumnya di bawah Windows.
davidgo
5

Saya tidak benar-benar memiliki pengalaman dengan telnettetapi butuh input dari pengalihan file:

telnet < abc.txt

Saya dapat menghubungkannya ke server dengan benar sebagai berikut:

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

Mungkin Anda bisa mencari cara untuk menerima GETperintah tapi saya tidak bisa. Alternatifnya adalah dengan menggunakan expectskrip:

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

Anda kemudian dapat menyimpan skrip sebagai telnet.exp, membuatnya dapat dieksekusi dan menjalankannya:

./telnet.exp > output.html
terdon
sumber
Keren, saya tidak tahu expect! Saya memilih jawaban davidgo karena itu hanya solusi terbaik untuk kasus ini. Saya tidak melihat perbedaan penggunaan antara netcap dan telnet untuk apa yang ingin saya capai. Terima kasih atas upaya Terdon, jika saya dapat meningkatkan jawaban Anda, saya akan melakukannya.
Bentley4
1
@ Bentley4 tidak masalah, menggunakan ncadalah solusi yang lebih baik, Anda harus menerimanya.
terdon
Saya gagal melihat bagaimana cara interactyang tepat untuk mengakhiri expectskrip itu.
2rs2ts
@ 2rs2ts Saya tahu sedikit tentang harapan, Anda mungkin benar tetapi saya tidak bisa mengatakannya karena komentar Anda tidak memberi tahu saya mengapa menurut Anda itu salah. Pemahaman saya adalah bahwa interact"memberikan kontrol terhadap proses saat ini kepada pengguna, sehingga penekanan tombol dikirim ke proses saat ini, dan stdout dan stderr dari proses saat ini dikembalikan" (itu dari man expect). Jadi, interactadalah cara untuk memberikan pengguna cara untuk benar-benar menggunakan koneksi telnet.
terdon
Karena pertanyaan aslinya adalah tentang memberi makan isi file ke dalam telnetdaripada berinteraksi dengan itu saya pikir Anda harus berakhir dengan close -i $spawn_idatau sesuatu seperti itu. Maka skrip akan keluar. Dengan interactsaya sebenarnya tidak dapat keluar telnetsama sekali, dan harus menutup terminal saya. Cukup menyedihkan (meskipun mungkin sebagian salah saya.)
2rs2ts