Perilaku Netcat / socat dengan perpipaan dan UDP?

16

Saya kira ini dekat dengan linux - Netcat berhenti mendengarkan lalu lintas UDP - Pengguna Super , tapi saya pikir saya lebih baik bertanya

Sejauh versi netcat saya menggunakan Ubuntu 11.04 dan defaultnya netcat, yang saya duga adalah openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Ini yang saya temukan aneh: case pertama berfungsi seperti yang diharapkan - Saya membuka server UDP dalam satu terminal:

$ sudo nc -ul 5000

... dan di terminal lain saya memulai koneksi klien UDP baru - dan saya mengetik hellotiga kali, menekan ENTER setelah masing-masing:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... dan kembali ke terminal server, sudah dicetak hellotiga kali, seperti yang diharapkan:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Sejauh ini bagus, semua bekerja seperti yang diharapkan. Namun, katakanlah saya mencoba sekarang sama dengan memasukkan input ke klien; jadi buat dulu server UDP dalam satu terminal:

$ sudo nc -ul 5000

... dan yang lain, menyalurkan beberapa data ke ncsebagai klien UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... setelah perintah klien, shell akan macet seolah menunggu input - jadi saya ketik hellodan ENTER dua kali lagi; tetapi server hanya mendaftarkan yang pertama hello(yang disalurkan melalui echo). Lebih jauh lagi, bahkan jika Anda menekan Ctrl-C, dan mencoba untuk mengulangi klien echo hello | nc -u 127.0.0.1 5000perintah, server akan masih tetap memiliki dilaporkan hanya pertama hello:

$ sudo nc -ul 57130 
hello
^C

... dan hanya setelah menghentikan server dengan Ctrl-C dan menyalakannya kembali, seseorang dapat mengulangi echo hello | nc -u 127.0.0.1 5000perintah klien dan mengamatinya bekerja.

 

Apakah ini cara ncyang seharusnya berlaku? Saya berharap bahwa setidaknya panggilan berulang echo hello | nc -u 127.0.0.1 5000akan didaftarkan - tanpa harus me-restart server? Atau mungkin ada saklar baris perintah khusus untuk perilaku semacam itu?

EDIT: Saya menemukan presentasi PDF yang bagus ini: socat - Menangani semua Jenis Soket , yang berisi catatan netcatvs berikut socat:

netcat - Batasan
● satu-shot saja (berakhir setelah soket tutup)
...
Contoh 1: Penggantian netcat
...
● Klien UDP dengan port sumber:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Server TCP:
nc -l -p 8080
socat - tcp-l: 8080, gunakan kembali
...

... Namun, saya cukup banyak mendapatkan perilaku yang sama seperti di atas, jika saya mengganti perintah server dengan " socat - udp4-listen:5000,reuseaddr" - dan baris klien dengan " socat - udp:127.0.0.1:5000" ... Dengan input yang disalurkan, " echo hello | socat - udp:127.0.0.1:5000", satu-satunya perbedaan adalah bahwa di sini perintah paling tidak ada setelah kata hellodikirim - namun, sekali lagi, berturut-turut menjalankan perintah ini tidak akan menyebabkan penerimaan di server, sampai server dimulai ulang.

sdaau
sumber

Jawaban:

23

Ok, saya pikir setidaknya saya punya sesuatu dengan socat- yaitu, opsi forkperlu ditambahkan ke baris server:

$ socat - udp4-listen:5000,reuseaddr,fork

... dan kemudian, di terminal lain, kita dapat memanggil echopemipaan ke socatgaris klien beberapa kali pada baris perintah, karena akan keluar segera ( well, setelah setengah detik :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... dan kembali ke terminal pertama, kita dapat melihat bahwa server telah berhasil menunjukkan ketiganya hello:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Perhatikan bahwa meskipun dengan server fork-ed socat, saluran echo "hello" | nc -u 127.0.0.1 5000masih akan 'mengunci' seolah-olah menunggu input pengguna; Namun, sekarang setelah Ctrl-C dan menjalankan kembali perintah, yaitu

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... server fork-ed socatakan menampilkan tiga hellos tanpa perlu di-restart ..

 

Tampaknya, openBSD netcatini tidak memiliki forkopsi - tetapi saya tidak yakin apakah itu memiliki yang sesuai dengannya ..

Bagaimanapun, semoga ini membantu seseorang,
Cheers!

sdaau
sumber
4

Netcat Anda hanya membaca output dari gema stdout ketika Anda menggunakan pipa, itu tidak "terhubung" ke keyboard lagi. Untuk mendapatkan respons yang Anda harapkan, Anda dapat menambahkan tiga "halo" Anda ke file

cat [myfile] | nc -u 127.0.0.1 5000
Serigala tua
sumber
Hai @ OldWolf - terima kasih banyak atas jawaban Anda! Saya mencoba saran Anda (juga dengan cara yang agak berbelit-belit, " cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), namun, sementara saya melihat tiga hellos, teka-teki apa yang masih ada: perintah itu juga akan mengurutkan "kunci", seolah menunggu input yang diketik dari pengguna, dan setelah Ctrl-C dan memutarnya kembali, server tidak akan melihat data apa pun sampai dimulai ulang !? Itulah yang ingin saya ketahui lebih baik - tepuk tangan!
sdaau
2
nc sedang menunggu di EOF yang, dalam hal ini, itu tidak sampai Anda mengirim sinyal keluar ke program.
OldWolf
Ahh, begitu - terima kasih banyak atas penjelasannya, @OldWolf! Tampaknya socatbisa mengatasinya dengan forkopsi ... Terima kasih lagi, tepuk tangan!
sdaau
3

Jika Anda melakukan strace dari nc yang mendengarkan, itu akan menunjukkan bahwa netcat sedang menunggu koneksi, dan setelah mendapatkannya, akan terhubung ke host dan port tersebut, mengabaikan semua yang lain. Anda perlu menambahkan '-k' untuk terus berjalan dan '-w 0' ke waktu habis setiap koneksi setelah 0 detik. Socat adalah pilihan yang lebih baik, saya pikir.

pdragon
sumber