Basicamente, o que você quer fazer é conectar STDOUT do netcat ao STDIN do bash e STDOUT do bash ao STDIN do netcat.
O Bash tem vários métodos de lançar comandos, mas apenas uma maneira de iniciar um comando e poder ler o comando e escrever nele. Bash chama isso de coproc .
Então, vamos dar uma olhada no roteiro final que nos permitirá fazer o que queremos e depois vamos dissecá-lo.
#!/bin/bash
coproc netcat -l -p 8765
exec bash <&${COPROC[0]} >&${COPROC[1]} 2>&1
Assim, a primeira linha lança netcat
em segundo plano, atribui STDOUT de netcat
a um descritor de arquivo cujo número é armazenado ${COPROC[0]}
e STDIN de netcat
a um descritor de arquivo cujo número está armazenado em ${COPROC[1]}
Então, agora precisamos redirecionar esses descritores de arquivos para STDIN / STDOUT / STDERR do bash. No entanto, quando o bash está executando um script, ele está lendo os comandos do arquivo de script e não há como dizer a ele para alternar para a leitura de um descritor de arquivo. Então, re-exec bash com STDIN conectado a ${COPROC[0]}
, STDOUT conectado a ${COPROC[1]}
, e STDERR também conectado a ${COPROC[1]}
.