Nota: ao seguir esta solução, digite os comandos em uma única sessão de shell (ou use um único script), a menos que seja dito o contrário. Isso ocorre porque ele usa variáveis e descritores de arquivos, eles não estão diretamente disponíveis fora de sua sessão original.
Crie um fifo temporário. O caminho certo para criar um arquivo temporário é com mktemp
. Infelizmente não pode criar fifos. Pode criar um diretório temporário embora:
tmpd='mktemp -d'
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later
Alternativamente, você pode criar um fifo nomeado à mão em algum local fixo ou ad-hoc. Depende de você.
Crie um processo em segundo plano que leia o fifo e passe os dados para um servidor:
nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$! # PID may be useful later
Preste atenção se nc
não sair prematuramente. Assumindo que não há problema com a conexão em si nem com o servidor, o comando de fundo acima permanecerá conectado até que você termine de enviar o primeiro grupo de dados através do fifo. Mas você quer que ele fique aberto e aceite várias gravações, então abra o fifo e não o feche (ainda):
exec 3> "$tmpf"
Agora você pode enviar o que quiser através do fifo e a conexão de fundo persiste:
echo abcd >&3 # sends text
echo -e '\x80' >&3 # sends "binary"
cat /etc/issue >&3 # sends file
cat >&3 # type whatever you want, terminate with Ctrl+D
Qualquer um desses comandos pode ser invocado com o caminho para o fifo, em vez de &3
, se você conhecer o caminho. Conhecendo o caminho, você pode escrever para o fifo da mesma ou de outra outra sessão da shell:
cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D
Ou você pode abrir um descritor em outra sessão de maneira semelhante à original. Seja qual for a forma como você escreve para o fifo, o nc
irá passá-lo para o servidor remoto em uma única conexão.
Mas cuidado com as condições da corrida. Usar um único descritor dentro de uma única sessão de shell é uma boa maneira de evitá-los.
Depois de passar os dados necessários, termine o nc
e feche o descritor na sessão original do shell:
kill $ncpid
exec 3>&-
Note que em algumas circunstâncias o único comando é suficiente para fazer o background nc
exit; depende do que você fez e do que você ainda está fazendo com o fifo. Por esse motivo, optei por matar explicitamente o nc
.
Remova o diretório temporário e seu conteúdo (ou seja, o fifo):
rm -r "$tmpd"
Nota final:
Não é necessário colocar nc
em segundo plano. Você pode executá-lo em um terminal, escrever para o fifo (conhecendo seu caminho) de outro. Desta forma, você pode monitorar facilmente seu estado. Adapte esta solução às suas necessidades.