Bagaimana saya bisa mengirim perintah ke netcat yang akan tetap hidup?

32
echo command | netcat host port

Ini menghasilkan perintah yang dikirim ke host jarak jauh dan beberapa data dibaca kembali. Tetapi setelah beberapa detik, koneksi ditutup. Parameter -w tidak mengubah apa pun. Saya menggunakan netcat v1.10 pada SuSE 10.1.

Chris
sumber
Apakah Anda yakin bukan host jarak jauh yang menutup koneksi?
grawity
Iya nih. Melakukan netcat dan kemudian secara manual mengetik hasil perintah di netcat tetap hidup tanpa batas.
Chris
Mengapa itu tetap hidup? itu hanya mencetak parameter gema dan kemudian mati?
M'vy
1
Saya ingin tetap hidup sehingga terus menerima data yang berasal dari server jauh.
Chris
2
Itu tidak benar. "netcat <host> <port>" membuka soket TCP dua arah.
Chris

Jawaban:

33

Ini berfungsi dengan ncperintah pada OS X (dengan asumsi perintah yang ingin Anda kirim ada dalam file):

cat file - | nc host port

(Pada dasarnya, catmembuang isi file di stdout dan kemudian menunggu Anda di stdin).

Dengan ekstensi, jika Anda ingin mengirim perintah dari shell itu sendiri, Anda bisa melakukan ini:

cat <(echo command) - | nc host port
Chaitanya Gupta
sumber
Ini bagus karena bekerja pada sistem tertanam tulang yang sangat telanjang, di mana netcat tidak memiliki semua opsi mewah.
SF.
{ echo command; cat;}akan melakukan hal yang sama, dan mungkin dianggap lebih mudah dimengerti.
G-Man Mengatakan 'Reinstate Monica'
1
Seperti yang saya lihat, netcatperintah akan menahan soket terbuka sampai ia melihat akhir input. Semua contoh ini menunjukkan ini tanpa benar-benar mengatakan banyak tentang mengapa . Saya berinteraksi dengan server yang menggunakan untuk jangka hanya menggunakan: . SocketTest adalah alat praktis yang dapat mendengarkan atau melayani pada port TCP atau UDP. SocketTest netcatcat - | nc localhost 8063
Akan
14

Dengan ncdi Ubuntu:

nc -q -1 host port

Dari halaman manual Ubuntunc :

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

Perhatikan bahwa ncopsi yang tersedia sangat bervariasi antar distribusi, jadi ini mungkin tidak bekerja pada Anda (OpenSUSE).

Suzanne Dupéron
sumber
13

Aku menemukannya:

echo command | netcat host port -

Rekan kerja saya tahu itu. Saya tidak melihat itu di dokumentasi sama sekali.

Chris
sumber
2

Saya tidak berpikir Anda akan mengelola ini dengan netcat atau socat. Saya baru saja melakukan mengutak-atik keduanya, dan socat tampak paling menjanjikan.

Saya berhasil mengatur socat untuk terhubung ke port TCP jarak jauh dan mendengarkan pada soket domain unix lokal (secara teori sehingga tautan dapat terus terjaga sepanjang waktu) tetapi segera setelah proses lokal dilepaskan dari soket unix (socat lain menghubungkan soket unix ke stdin / out) menutup sesi TCP socat.

Masalahnya di sini adalah bahwa setiap koneksi melalui netcat / socat membuat koneksi aliran TCP baru ke server, dan menutup sesi aliran TCP ketika ujung lokal terputus.

Saya pikir Anda mungkin harus menulis beberapa perangkat lunak proxy khusus untuk ini yang membuka koneksi TCP ke ujung jarak jauh dan kemudian mendengarkan secara lokal pada soket / pipa / fifo atau apa pun dan kemudian hanya mengirim data ke pipa TCP yang ada dan mengembalikan hasilnya.

Majenko
sumber
Dengarkan Matt Jenkins yang perkasa: D
M'vy
2

Mungkinkah koneksi ditutup di ujung soket yang lain?

Secara default, nctutup koneksi setelah selesai, jika Anda tidak secara eksplisit memintanya untuk tetap mendengarkan (dengan -kopsi):

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

Lihat man nc.1.


Saya berhasil mengalirkan data antara dua mesin seperti ini:

  • pengirim:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • penerima:

    nc -kl <port> 
    
Campa
sumber
1

Metode Georges bekerja dengan baik dari shell interaktif, tetapi tidak akan membantu dengan skrip, ketika Anda misalnya memanggil skrip Anda sebagai nohup ./script &.

Saya menemukan mengganti stdin dengan fifo boneka membantu.

 mkfifo dummy
 cat command.txt dummy | nc host port

Karena tidak ada yang pernah menulis ke fifo, setelah mengeluarkan file, catmenggantungnya tanpa batas.

SF.
sumber
0

socat's shut-nonepilihan harus membantu di sini:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

Anda mungkin juga perlu mengganti periode batas waktu default menggunakan -t <timeout>, jika tidak, soket akan ditutup setelah 0,5s. Opsi ini mengesampingkan perilaku default, yaitu:

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

Jadi, sebuah perintah seperti:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

akan menjaga soket terbuka selama 10 detik setelah mengirim 'bla'.

Jeremy
sumber
0

Perintah Anda berakhir, jika host jarak jauh menutup koneksi (atau tidak dapat dijangkau) atau perintah sebelum pipa diakhiri (sementara netcat masih mengirim sisa antrian inputnya).

allo
sumber