Saya mencoba mengirim perintah ke port tcp menggunakan netcat
dan mem-pipe respons
ketika saya menjalankan netcat
dan 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 netcat
dapat mencetak teks tanggapan?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
versi; dan pada ujung remote adatelegram-cli
di mesin yang sama.netcat
menerima EOF pada STDIN, bahwa ia segera menutup kedua sisi soket daripada melakukan setengah-dekat dan menunggu sisi jauh untuk menutup ujungnya. Jikasocat
ada pilihan, saya akan sangat merekomendasikannya. Hanya ada satusocat
, jadi Anda tidak memiliki masalah portabilitas dengan ada selusin rasa yang berbeda, itu berperilaku jauh lebih waras, dan sangat dapat dikonfigurasi.Jawaban:
Seperti yang dikatakan @Patrick, masalah ini biasanya karena
netcat
keluar sebelum respons diberikan. Anda mengatasinya dengan menambahkan-q 2
ke baris perintah, yaitu, katakannetcat
untuk bertahan sekitar 2 detik setelah mendeteksi EOF pada input standar. Jelas Anda bisa membuatnya menunggu beberapa detik juga.sumber
-q 2
bekerja tetapi apakah ini bisa dipercaya? itu membuat permintaan web saya tidak yakin 2s selalu cukup! Bisakah saya ?-w
opsi untuk bermain. Ini semua ada diman nc
halaman tentunya.invalid option -- 'q'
nc
keluar segera daripada menunggu jawaban? Jika koneksi masih terbuka, harus ada opsi untuk membuatnyanc
menunggu untuk menutup, tidak hanya untuk stdin untuk mengakhiriGunakan ini:
Masalahnya adalah bahwa
nc
akan menutup koneksi segera setelah stdin ditutup, yang sangat cepat untukmy_command
string 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
cat
dengan-
sebagai argumen kedua: Itu membuatcat
mendengarkan pada stdin untuk lebih banyak konten untuk pipa setelah mengirim konten dari argumen pertama. Argumen pertama hanya mendapatkanecho
perintah melaluicat
- itu juga bisa berupa file dengan perintah Anda alacat < file - | ...
.Atau lakukan ini:
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
cat
atauwhile
loop dannc
terus berjalan sampai Anda menekan^C
atau^D
pada 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 dannc
setelah 1 detik, tetapicat
akan 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
nc
klien dan proses pemipaan ke dalamnya.Jawaban ini didasarkan pada jawaban ini untuk pertanyaan pengguna super identik .
sumber
{ echo my_command; cat;}
akan melakukan hal yang sama dan mungkin dianggap lebih mudah dimengerti.Versi openbsd-netcat yang berbeda unik, perlu kombinasi yang berbeda dari
-w <seconds>
,-q <seconds>
,-N
dan 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:
Tetapi ia bekerja dengan -N ditambahkan ke server atau klien.
sumber
Saya tahu ini agak lama tetapi tidak ada jawaban lain yang bekerja untuk saya dan ini memang:
Perhatikan
-N
: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.
sumber