Usei socal para criar um servidor proxy entre 2 soquetes UNIX: /var/a.sock , /var/b.sock
client -> /var/a.sock -> MY_COMMAND -> /var/b.sock -> MY_COMMAND -> /var/a.sock ->client
.
Os comandos a seguir funcionam bem apenas para
client -> /var/a.sock -> /var/b.sock -> /var/a.sock -> client
.
socat UNIX-LISTEN:/var/a.sock,fork 'UNIX-CONNECT:/var/b.sock
Eu preciso de mais uma coisa. Para substituir AAAA por BBBB antes de enviar
Como posso fazer isso, por favor?
Poderia ser algo como:
O exterior
socat
, a cada conexão de entrada em/var/a.sock
bifurcações, um filho no qual, como de costume, estabelece uma comunicação bidirecional entre 2 endereços:Sem o
nofork
, o que seria lido do soquete seria gravado em um par de soquetes, cujo outro lado é o stdin do shell, enquanto o stdout do shell seria o mesmo par de soquetes e o socat leria o que vem da outra extremidade e enviaria para o soquete aceito.Com
nofork
, eliminamos o intermediário, o stdin e o stdout do shell são diretamente o soquete aceito como uma otimização.Aqui, o código do shell executa outro
socat
comando, que conecta-
o akaSTDIO
, que ésocat
o próprio stdin e stdout com um soquete de conexão ao/var/b.sock
. Issosocat
é stdin é pré-processado porsed
, enquanto sua saída é pós-processada por outrosed
.Cuidado
-u
¹ não é uma opção padrão; se o seu não for compatível, você pode mudar paraperl
(perl -pe 'BEGIN{$| = 1}; s/AAAA/BBB/g'
).Se os dados trocados por esses soquetes não forem baseados em linha, você poderá usar
perl
em vez desed
e ler por pedaços de até 8KiB:Contanto que os dados
a.sock
não cheguem mais rápido do queperl
(e o destinatário emb.sock
) possa lidar com eles, e que não sejam enviados em lotes maiores que 8 KB, seria improvável que uma mensagem fosse cortada no meio de um arquivoAAAA
.¹ para evitar buffer de saída; embora no caso do GNU
sed
também faça com que ele leia sua entrada um byte por vez, o que não é prejudicial, embora desnecessário aqui.