Stdin und stdout zu Ports umleiten

9

Ich möchte ein Programm nehmen P, das von stdin& schreibt stdout, aber es verbindet ncoder was auch immer, so dass es von einem bestimmten Port liest und an einen anderen Port ausgibt.

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

Wie kann ich es zurückschreiben, um Port 60606 zu sagen?

Yimin Rong
quelle
Ihre Frage ist wie angegeben unklar. Sie meinen, jemand kann 2 TCP-Verbindungen zu Ihrem Computer öffnen, eine zu Port 50505 und eine zu Port 50506, Daten über die erste senden, die eingespeist werden soll, Pund erwarten, dass die Ausgabe Pder zweiten TCP-Verbindung gelesen wird ? Warum das UDP-Tag?
Stéphane Chazelas
Ja! Soweit UDPich denke, ich wollte ports, aber das war kein existierendes Schlüsselwort, also dachte ich TCP, und ich denke, ich fügte UDPaus Reflex hinzu.
Yimin Rong

Antworten:

11

Ich meine, jemand kann 2 TCP-Verbindungen zu Ihrem Computer öffnen, eine zu Port 50505 und eine zu Port 60606, Daten über die erste senden, die an P weitergeleitet werden soll, und erwarten, dass die Ausgabe von P von der zweiten TCP-Verbindung gelesen wird. dann wäre das:

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

Oder mit socat:

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

Um Pdie Ausgabe an dieselbe Verbindung zurückzusenden:

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

Sie brauchen nicht nc, um mit Ports zu arbeiten. bashkann das selbst machen:

Bash behandelt mehrere Dateinamen speziell, wenn sie in Umleitungen verwendet werden, wie in der folgenden Tabelle beschrieben:

/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
quelle
3
/dev/tcpist oft deaktiviert und kann nicht zum Hören verwendet werden . Sie benötigen zsheine Shell, die abhörende TCP-Sockets erstellen kann.
Stéphane Chazelas
@ StéphaneChazelas Ich muss zugeben, ich habe es nie versucht. Es sagt nichts über diese Einschränkung in der Manpage aus, oder?
Hauke ​​Laging
Wie würdest du das machen? Ein Listener-Socket ist eine Tür, um mehr akzeptierende Sockets zu erstellen. Umleitungen funktionieren dafür nicht so gut. zsh verwendet dafür eine integrierte Funktion ( ztcp -lzum Abhören und ztcp -azum Akzeptieren von Verbindungen an der Abhörbuchse ).
Stéphane Chazelas