Precisa de script para redirecionar STDIN & STDOUT para pipes nomeados

1

Eu tenho um aplicativo que lança um auxiliar de autenticação (meu script) e usa STDIN / STDOUT para se comunicar.

Eu quero redirecionar STDIN e STDOUT desse script para dois pipes nomeados para interação com outro programa.

Por exemplo:

SCRIPT_STDIN > pipe1
SCRIPT_STDOUT < pipe2

Aqui está o fluxo que estou tentando realizar:

[Aplicativo] - > Lança o script auxiliar, escreve para os ajudantes STDIN, lê os ajudantes STDOUT (exemplo: STDIN: nome de usuário, senha; STDOUT: LOGIN_OK)
[Script auxiliar] - > Lê STDIN (dados do aplicativo), encaminha para o PIPE1; lê de PIPE2, escreve de volta para o aplicativo no STDOUT
[Outro processo] - > Lê da entrada PIPE1, processa e retorna resultados para o PIPE2

O comando cat quase pode fazer o que eu quero. Se houvesse uma opção para copiar STDIN para STDERR eu poderia fazer o cat fazer isso com um comando (assumindo a opção fictícia -e echos para STDERR ao invés de STDOUT):

cat -e PIPE2 2 > PIPE1 (leia do PIPE2 e escreva-o para STDOUT, copie a entrada, normalmente indo para STDERR para PIPE1)

    
por davidparks21 04.10.2010 / 03:34

2 respostas

0

Minha resposta anterior não foi uma solução ideal, como descobri mais tarde. Ele tem três falhas: uma que não fecha quando stdin é fechado (eof em stdin). Em segundo lugar, cat (e outros utilitários como tee e tal) têm algumas características bizarras quando se trata de fechar o final de leitura do pipe para o qual ele está gravando (se você fechar e reabrir a extremidade de leitura do pipe Ele irá começar a armazenar todos os dados e apenas liberá-lo quando este processo parar, claramente um stopper para mim). E, em terceiro lugar, o processo em segundo plano, neste caso, pode ser órfão.

Depois de lidar com esses problemas, aqui está meu novo script, que aborda todos os três problemas acima. Espero que seja bom para alguém.

#!/bin/ksh

#
# USAGE
# helper <path_to_CLIENT_TO_SERVER_pipe> <path_to_SERVER_TO_CLIENT_pipe>
#

CS=$1
SC=$2

exec 3>&0

trap 'exit;' CHLD

{
while read LINE; do             #STDIN -> CS
   print $LINE >>$CS;
done;
} <&3 &

while true; do                  #SC -> STDOUT
        read IN <$SC;
        retCode=$?
        if [[ $retCode -eq 0 ]]; then
                print $IN;
        else
                sleep 1;
        fi
done

Neste caso, temos apenas um processo em segundo plano, o único que lê stdin. Se stdin fechar, sairá e nós prenderemos isso e sairemos do script em primeiro plano. O script de primeiro plano nunca precisa sair porque está lendo de um canal, o que ele sempre deve fazer, independentemente do que acontece na outra extremidade desse pipe. O uso de leitura, embora menos eficiente, não apresenta problemas de armazenamento em buffer quando os processos externos que estão lendo / gravando para os pipes fornecidos são ativados ou desativados. Este script só existe quando stdin está fechado.

    
por 16.06.2011 / 11:12
1

Aqui está um script que finalmente faz o que eu quero. Ele lê STDIN e envia para o PIPE1, e pega do PIPE2 e envia para o STDOUT.

#!/bin/ksh
exec 3>../pipes/PIPE1
exec 4<../pipes/PIPE2
{ cat; } <&4 >&1 &
{ cat; } <&0 >&3
wait

O objetivo é redirecionar a entrada / saída de um aplicativo auxiliar para dois canais que podem ser manipulados por um aplicativo de terceiros (esse é um típico auxiliar de autenticação).

    
por 04.10.2010 / 18:46