netcat tidak mencetak respons

12

Saya mencoba mengirim perintah ke port tcp menggunakan netcatdan mem-pipe respons
ketika saya menjalankan netcatdan mengetik perintah saya, ia mencetak respons dengan benar, tetapi ketika saya meneruskan perintah dari sebuah pipa, ia mengirimkan perintah dengan benar tetapi tidak mencetak respons

Jadi, ini berfungsi dengan benar:

netcat  localhost 9009

sementara ini hanya mengirim perintah tetapi tidak mencetak respons:

echo 'my_command' | netcat  localhost 9009

Mengapa?
Bagaimana saya netcatdapat mencetak teks tanggapan?

RYN
sumber
ini mungkin terjadi pada Anda
Jeff Schaller
@JeffSchaller: tidak! sayangnya menggunakan perintah itu tidak membantu! kali ini ia memblokir selamanya!
RYN
Netcat mana yang Anda gunakan? Sayangnya ada selusin variasi yang berbeda dari alat netcat, dan mereka semua tidak berperilaku sama. Juga, apa yang ada di ujung remote?
Patrick
@ Patrick: netcat saya adalah OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)versi; dan pada ujung remote ada telegram-clidi mesin yang sama.
RYN
Saya pikir saya menemukan halaman manual untuk netcat itu, tetapi saya tidak melihat bendera yang akan mengendalikan apa yang saya duga sedang terjadi. Saya menduga bahwa sekali netcatmenerima EOF pada STDIN, bahwa ia segera menutup kedua sisi soket daripada melakukan setengah-dekat dan menunggu sisi jauh untuk menutup ujungnya. Jika socatada pilihan, saya akan sangat merekomendasikannya. Hanya ada satu socat, jadi Anda tidak memiliki masalah portabilitas dengan ada selusin rasa yang berbeda, itu berperilaku jauh lebih waras, dan sangat dapat dikonfigurasi.
Patrick

Jawaban:

8

Seperti yang dikatakan @Patrick, masalah ini biasanya karena netcatkeluar sebelum respons diberikan. Anda mengatasinya dengan menambahkan -q 2ke baris perintah, yaitu, katakan netcatuntuk bertahan sekitar 2 detik setelah mendeteksi EOF pada input standar. Jelas Anda bisa membuatnya menunggu beberapa detik juga.

Ralph Rönnquist
sumber
Terima kasih; -q 2bekerja tetapi apakah ini bisa dipercaya? itu membuat permintaan web saya tidak yakin 2s selalu cukup! Bisakah saya ?
RYN
1
Gunakan angka yang lebih besar untuk membuatnya menunggu lebih lama, atau angka negatif untuk membuatnya menunggu tanpa batas. Ada juga -wopsi untuk bermain. Ini semua ada di man nchalaman tentunya.
Ralph Rönnquist
5
katanyainvalid option -- 'q'
phil294
Saya pikir pertanyaan tindak lanjut yang baik adalah: mengapa nckeluar segera daripada menunggu jawaban? Jika koneksi masih terbuka, harus ada opsi untuk membuatnya ncmenunggu untuk menutup, tidak hanya untuk stdin untuk mengakhiri
theferrit32
6

Gunakan ini:

cat <(echo command) - | nc host port

Masalahnya adalah bahwa ncakan menutup koneksi segera setelah stdin ditutup, yang sangat cepat untuk my_commandstring sederhana , dan dengan demikian tidak pernah mendapat kesempatan untuk menerima respons. (Jika Anda mem-pipe file yang sangat besar, Anda akan melihat bahwa itu mungkin mendapat respons sebelum selesai mengirim file).

Masukkan catdengan -sebagai argumen kedua: Itu membuat catmendengarkan pada stdin untuk lebih banyak konten untuk pipa setelah mengirim konten dari argumen pertama. Argumen pertama hanya mendapatkan echoperintah melalui cat- itu juga bisa berupa file dengan perintah Anda ala cat < file - | ....

Atau lakukan ini:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

Ini mengirimkan #karakter tanpa batas pada baris ke-2 dari input. Menggunakan #karya untuk bash seperti remote yang akan mengabaikan ini sebagai komentar. Saya memilih waktu tunggu kecil 10 milidetik di sini, sehingga bereaksi lebih cepat saat sambungan berakhir. YMMV.

Kelemahannya bisa berupa itu catatau whileloop dan ncterus berjalan sampai Anda menekan ^Catau ^Dpada shell. Itu benar-benar tergantung pada ujung jarak jauh.

Menambahkan timeout menggunakan -w 1(OSX netcat) atau -i 1(nmap's ncat) membuatnya menutup koneksi dan ncsetelah 1 detik, tetapi catakan tetap berjalan sampai Anda memasukkan beberapa karakter dan pipa terputus (saya pikir).

Namun, ini berfungsi jika sisi jarak jauh akan secara otomatis menutup koneksi setelah menerima dan menangani perintah - ini juga akan mengakhiri ncklien dan proses pemipaan ke dalamnya.

Jawaban ini didasarkan pada jawaban ini untuk pertanyaan pengguna super identik .

Alexander Klimetschek
sumber
{ echo my_command; cat;}akan melakukan hal yang sama dan mungkin dianggap lebih mudah dimengerti.
G-Man Mengatakan 'Reinstate Monica'
1

Versi openbsd-netcat yang berbeda unik, perlu kombinasi yang berbeda dari -w <seconds>, -q <seconds>, -Ndan argumen yang berbeda bahkan perlu tergantung pada apa yang sedang berjalan di ujung lain dari koneksi. Menggunakan opsi batas waktu dengan versi atau server tertentu menyebabkan keterlambatan, dan tidak menggunakannya dapat menyebabkan penundaan yang sangat lama (tidak terbatas?). Dan saya akan mengharapkan quirks berbeda dengan gnu netcat, tetapi tidak tahu apakah mereka berbeda di antara versi itu.

Misalnya versi 1.130_3 dari archlinux membutuhkan waktu sangat lama (selamanya?) Ketika saya melakukan ini:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Tetapi ia bekerja dengan -N ditambahkan ke server atau klien.

Peter
sumber
1

Saya tahu ini agak lama tetapi tidak ada jawaban lain yang bekerja untuk saya dan ini memang:

echo 'test' | netcat -N $server $port

Perhatikan -N:

matikan soket jaringan setelah EOF pada input. Beberapa server meminta ini untuk menyelesaikan pekerjaan mereka.

Bekerja untuk saya di Windows dan Linux.

Catatan: Ini adalah salinan dari jawaban yang saya posting untuk pertanyaan rangkap .

Saya pikir ini bisa bermanfaat. Mod merasa bebas untuk mengedit / menghapus jika ini melanggar kebijakan atau sesuatu.

yannick1976
sumber