Redirecionar stdin e stdout para portas

10

Eu gostaria de pegar um programa Pque lê de stdin& grava para stdout, mas conecta-o ncou o que quer que ele leia de uma determinada porta e gera saída para outra porta.

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

Como faço para gravar de volta para dizer a porta 60606?

Yimin Rong
fonte
Sua pergunta não é clara, como indicado. Você quer dizer que alguém pode abrir 2 conexões TCP com sua máquina, uma para a porta 50505 e outra para a porta 50506, enviar dados sobre o primeiro destinado a ser alimentado Pe esperar ler a saída da Psegunda conexão TCP? Por que a tag UDP?
Stéphane Chazelas
Sim! Tanto quanto UDPacho que queria ports, mas essa não era uma palavra-chave existente, pensei TCPe acrescentei UDPo reflexo.
precisa

Respostas:

12

Você quer dizer que alguém pode abrir 2 conexões TCP em sua máquina, uma na porta 50505 e outra na porta 60606, enviar dados sobre o primeiro destinado a ser alimentado a P e esperar ler a saída de P na segunda conexão TCP, então isso seria:

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

Ou com socat:

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

Para Penviar sua saída de volta para a mesma conexão:

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

Você não precisa nctrabalhar com portas. bashpode fazer isso sozinho:

O Bash lida com vários nomes de arquivos, especialmente quando eles são usados ​​em redirecionamentos, conforme descrito na tabela a seguir:

/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
fonte
3
/dev/tcpgeralmente está desativado e não pode ser usado para ouvir . Você precisa zshse deseja um shell que possa criar soquetes TCP de escuta.
Stéphane Chazelas
@ StéphaneChazelas Eu tenho que admitir que nunca tentei. Ele não diz nada sobre essa restrição na página de manual, não é?
Hauke ​​Laging
Bem, como você faria isso? Um soquete de ouvinte é uma porta para criar mais soquetes de aceitação; os redirecionamentos não funcionam tão bem para isso. O zsh usa um built-in para isso ( ztcp -lpara ouvir e ztcp -aaceitar conexões no soquete de audição).
Stéphane Chazelas