Tengo dos (UNIX) programas A y B que leen y escriben desde stdin/stdout.Entrada de conexión _and_output entre dos comandos en shell/bash
Mi primer problema es cómo conectar el stdout de A a stdin de B y el stdout de B al stdin de A. Es decir, algo así como A | B pero una tubería bidireccional. Sospecho que podría resolver esto por using exec to redirect pero no pude hacerlo funcionar. Los programas son interactivos, por lo que un archivo temporal no funcionaría.
El segundo problema es que me gustaría duplicar cada dirección y canalizar un duplicado mediante un programa de registro a stdout para que pueda ver el tráfico (en línea de texto) que pasa entre los programas. Aquí puedo salir con tee> (...) si puedo resolver el primer problema.
Ambos problemas parecen que deberían tener soluciones bien conocidas, pero no he podido encontrar nada.
Preferiría una solución de shell POSIX, o al menos algo que funcione en bash en cygwin.
Gracias a sus respuestas se me ocurrió la siguiente solución. Los comandos A/B usan nc para escuchar dos puertos. El programa de registro usa sed (con -u para procesamiento sin búfer).
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
Esta escucha para las conexiones al puerto 47001 y 47002 y ecos todo el tráfico a la salida estándar.
En la cáscara 2 do:
bash-3.2$ nc localhost 47001
En la cáscara 3 do:
bash-3.2$ nc localhost 47002
Ahora líneas entraron en la cáscara 2 se escribirá en la cáscara 3 y viceversa, y el tráfico registran en bombardear 1 , algo así como:
B->A: input to port 47001
A->B: input to port 47002
Lo anterior ha sido probado en Cygwin
Actualización: el script anterior dejó de funcionar después de unos días (!). Aparentemente puede un punto muerto. Algunas de las sugerencias en las respuestas pueden ser más confiables.
twinpipe también viene con un script de shell que utiliza el enfoque de canalización con nombre sugerido por otros. Gracias –