Redirect stdin dan stdout ke porta

10

Saya ingin mengambil program Pyang membaca dari stdin& menulis ke stdout, tetapi sambungkan ke ncatau apa pun yang dibaca dari port tertentu dan output ke port lain.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

Bagaimana saya membuatnya menulis kembali untuk mengatakan port 60606?

Yimin Rong
sumber
Pertanyaan Anda tidak jelas seperti yang dinyatakan. Maksud Anda seseorang dapat membuka 2 koneksi TCP ke mesin Anda, satu ke port 50505 dan yang lain ke port 50506, mengirim data pada yang pertama dimaksudkan untuk diumpankan ke Pdan berharap untuk membaca output dari Pkoneksi TCP kedua? Mengapa tag UDP?
Stéphane Chazelas
Iya! Sejauh UDP, saya pikir saya ingin ports, tetapi itu bukan kata kunci yang ada, jadi saya pikir TCP, dan saya pikir saya menambahkan UDPrefleks.
Yimin Rong

Jawaban:

12

Maksud saya seseorang dapat membuka 2 koneksi TCP ke mesin Anda, satu ke port 50505 dan yang lain ke port 60606, mengirim data pada yang pertama dimaksudkan untuk diumpankan ke P dan berharap untuk membaca output P dari koneksi TCP kedua, maka itu akan menjadi:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

Atau dengan socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

Untuk Pmengirim outputnya kembali ke koneksi yang sama:

socat tcp-listen:50505,reuseaddr exec:P
Stéphane Chazelas
sumber
3

Anda tidak perlu ncbekerja dengan port. bashdapat melakukannya sendiri:

Bash menangani beberapa nama file secara khusus ketika mereka digunakan dalam pengalihan, seperti yang dijelaskan dalam tabel berikut:

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.
Hauke ​​Laging
sumber
3
/dev/tcpsering dinonaktifkan dan tidak dapat digunakan untuk mendengarkan . Anda perlu zshjika Anda ingin shell yang dapat membuat soket tcp mendengarkan.
Stéphane Chazelas
@ StéphaneChazelas saya harus mengakui bahwa saya tidak pernah mencoba. Itu tidak mengatakan apa-apa tentang pembatasan ini di halaman manual, bukan?
Hauke ​​Laging
Nah, bagaimana Anda akan melakukannya? Soket pendengar adalah pintu untuk menciptakan lebih banyak soket penerima, pengalihan tidak berfungsi dengan baik untuk itu. zsh menggunakan bawaan untuk itu ( ztcp -luntuk mendengarkan dan ztcp -amenerima koneksi pada soket mendengarkan).
Stéphane Chazelas