Rediriger stdin et stdout vers les ports

10

Je voudrais prendre un programme Pqui lit à partir de stdinet écrit sur stdout, mais le connecter à ncou quoi que ce soit tel qu'il lit à partir d'un certain port et sort sur un autre port.

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

Comment puis-je l'écrire pour dire le port 60606?

Yimin Rong
la source
Votre question n'est pas claire comme indiqué. Vous voulez dire que quelqu'un peut ouvrir 2 connexions TCP à votre machine, une au port 50505 et une autre au port 50506, envoyer des données sur la première destinée à être alimentée Pet s'attendre à lire la sortie de Pla deuxième connexion TCP? Pourquoi la balise UDP?
Stéphane Chazelas
Oui! Pour autant que UDPje pense que je voulais ports, mais ce n'était pas un mot-clé existant, alors j'ai pensé TCP, et je pense que j'ai ajouté UDPpar réflexe.
Yimin Rong

Réponses:

12

Je veux dire que quelqu'un peut ouvrir 2 connexions TCP sur votre machine, une sur le port 50505 et une autre sur le port 60606, envoyer des données sur la première destinée à être envoyée à P et s'attendre à lire la sortie de P à partir de la deuxième connexion TCP, alors ce serait:

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

Ou avec socat:

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

Pour Prenvoyer sa sortie à la même connexion:

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

Vous n'avez pas besoin ncde travailler avec des ports. bashpeut le faire lui-même:

Bash gère plusieurs noms de fichiers spécialement lorsqu'ils sont utilisés dans des redirections, comme décrit dans le tableau suivant:

/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
la source
3
/dev/tcpest souvent désactivé et ne peut pas être utilisé pour écouter . Vous avez besoin zshsi vous voulez un shell capable de créer des sockets TCP à l'écoute.
Stéphane Chazelas
@ StéphaneChazelas Je dois admettre que je n'ai jamais essayé. Il ne dit rien sur cette restriction dans la page de manuel, n'est-ce pas?
Hauke ​​Laging
Eh bien, comment feriez-vous? Un socket d'écoute est une porte pour créer des sockets plus acceptantes, les redirections ne fonctionnent pas aussi bien pour cela. zsh utilise une fonction intégrée pour cela ( ztcp -lpour écouter et ztcp -aaccepter les connexions sur la prise d'écoute).
Stéphane Chazelas