Entrada de redirecionamento de um terminal para outro

7

Eu fiz ssh em uma caixa linux e estou usando dvtm e bash (embora eu também tenha tentado isso com a tela do Gnu e o bash). Eu tenho dois terminais, atual / dev / pts / 29 e / dev / pts / 130. Eu quero redirecionar a entrada de um para o outro.

Pelo que entendi, em / dev / pts / 130 eu posso digitar:

cat </dev/pts/29

E quando eu digito / dev / pts / 29 os caracteres que eu digito devem aparecer em / dev / pts / 130. No entanto, o que acaba acontecendo é que todos os outros caracteres que eu digito são redirecionados. Por exemplo, se eu digitar "olá", recebo isto:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo

Isso é realmente frustrante, já que preciso fazer isso para redirecionar o io de um processo em execução no gdb (tentei executar / dev / pts / # e configurar inferior-tty / dev / pts / # e ambos resultaram no comportamento mencionado anteriormente). Estou fazendo algo errado, ou isso é um bug no bash / screen / dvtm?

    
por Niki Yoshiuchi 26.05.2010 / 20:17

1 resposta

8

Em seu exemplo simplificado, você tem dois processos (seu shell e o gato ) tentando ler do lado “escravo” do tty. O resultado é que um processo recebe alguns dos personagens, o outro recebe os outros.

O que você quer dizer com "redirecionar a entrada de um [terminal] para o outro"? Na sua situação real, quais processos estão tentando ler de cada terminal? O que você quer fazer com sua entrada capturada depois de tê-la? O que, exatamente , você está realmente tentando realizar?

Para mim, "redirecionar o io de um processo em execução no gdb" parece mais como reabrir o stdin / stdout / stderr dentro de um processo que já está em execução.

Você pode alterar stdin / stdout / stderr de um processo em execução com (entre outras coisas ) GDB. Uma resposta para “Redirecionar STDERR / STDOUT de um processo APÓS ter sido iniciado, usando a linha de comando?” mostra como isso pode ser feito. Você gostaria de substituir um nome de caminho tty por /dev/null na resposta e provavelmente deseja manipular stdin também, mas a técnica ainda é aplicável.

Você deve ser capaz de fazer seu exemplo simplificado funcionar de forma robusta, mas não estou convencido de que ele faça o que você realmente quer fazer (lembre-se que um pseudo terminal é na verdade um par de dispositivos, como duas extremidades de um tubo bidirecional; mas todo o seu exemplo interage com as metades 'escravas').

A chave para consertar seu exemplo é fazer com que todos, exceto um dos processos concorrentes, interrompam (temporariamente) a leitura do terminal. Se, como o seu exemplo, você tem um shell rodando no lado do qual você gostaria de capturar dados, então você pode fazer algo assim:

(
    s="$(stty -g)"
    exec 3<&0
    trap 'stty "$s" 0<&3;exit' 0 INT QUIT

    cat <<EOM
In some other terminal, run the command

    cat <$(tty)

Press ^C or ^\ to quit.
EOM

    stty raw isig brkint susp '' dsusp ''
    while true; do sleep 3600; done </dev/null
)
    
por 26.05.2010 / 22:43