Stdin ve stdout'u bağlantı noktalarına yönlendirin


11

Ben Pokuma stdinve yazma bir program almak istiyorum stdout, ama ncbelirli bir bağlantı noktasından okur ve başka bir bağlantı noktasına çıkışları öyle ya da ne olursa olsun bağlayın .

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

60606 numaralı bağlantı noktasını geri yazmayı nasıl alabilirim?


Sorunuz belirtildiği gibi belirsiz. Birisi makinenize 2, 50505 numaralı bağlantı noktasına, diğeri 50506 numaralı bağlantı noktasına açılabilir, ilk beslenmeye yönelik veri gönderebilir ve ikinci TCP bağlantısının Pçıktısını okumayı bekleyebilir P? Neden UDP etiketi?
Stéphane Chazelas

Evet! Bildiğim kadarıyla UDPistediğim gibi ports, ama bu mevcut bir anahtar kelime değildi, bu yüzden düşündüm TCPve sanırım UDPrefleks ekledim .
Yimin Rong

Yanıtlar:


12

Yani birisi makinenize 50505 numaralı bağlantı noktasına, diğeri 60606 numaralı bağlantı noktasına 2 TCP bağlantısı açabilir, P'ye beslenmesi amaçlanan ilk veriyi veri gönderebilir ve ikinci TCP bağlantısından P çıkışını okumayı bekleyebilir, o zaman bu olurdu:

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

Veya socat:

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

Çıkışını Paynı bağlantıya geri göndermek için:

socat tcp-listen:50505,reuseaddr exec:P

3

ncBağlantı noktalarıyla çalışmak için gerek yoktur . bashbunu kendisi yapabilir:

Bash, aşağıdaki tabloda açıklandığı gibi, yönlendirmelerde kullanıldıklarında çeşitli dosya adlarını özel olarak işler:

/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.

3
/dev/tcpgenellikle devre dışıdır ve dinlemek için kullanılamaz . zshDinleme tcp yuvaları oluşturabilecek bir kabuk istiyorsanız gerekir .
Stéphane Chazelas

@ StéphaneChazelas itiraf etmeliyim ki hiç denemedim. Man sayfasındaki bu kısıtlama hakkında hiçbir şey söylemiyor, değil mi?
Ağustos'ta Hauke ​​Laging

Peki, bunu nasıl yapardın? Bir dinleyici soketi, daha kabul edilebilir soketler oluşturmak için bir kapıdır, yönlendirmeler de işe yaramaz. zsh bunun için bir yerleşik kullanır ( ztcp -ldinleme ve ztcp -adinleme soketindeki bağlantıları kabul etmek için).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.