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?


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

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.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.