Redirecionar o stdin para vir de um terminal diferente usando Bash
Pergunta
Estou me perguntando como alguém iria redirecionar o stdin de um script da atual sessão do Xtert IE/dev/pts/0 para um que também está executando o IE/dev/pts/1 usando o bash? Eu tenho um script bash que abre 3 janelas X e quero obter informações de apenas uma dessas janelas e não consigo descobrir como fazê -lo. Qualquer ajuda é apreciada! obrigado.
EDITAR (Movido de baixo - OP enviou este esclarecimento como resposta)
Acho que deveria ter esclarecido o que queria fazer. Vou iniciar um script de um pty, digamos que é/dev/pts/3. Este script abrirá 3 Xterminals, digamos:/dev/pts/0,/dev/pts/1 e/dev/pts/2. Esses três novos PTYs são o que o usuário vai ver. O script pede alguma entrada ao usuário e eu quero que a entrada do usuário seja digitada em/dev/pty/1 e o programa deve obter suas informações a partir daí. No entanto, eu tentei fazer isso e não funciona. Aqui está um trecho do meu código.
exec</dev/pts/1
echo
echo "Would you like to search for more info?" 1>/dev/pts/1
read answer
case $answer in
y) echo "YES" ;;
n) echo "NO" ;;
*) echo "y/n only!";;
esac
A declaração do caso no final é apenas um pequeno espaço reservado para ver se a entrada realmente funcionou.
Solução
Eu suspeito que isso não é possível. Afaik, sem modificar algo no espaço do kernel, é impossível ler a entrada de um Tty (ou Pty) que não é o TTY atual. Mesmo a raiz não pode fazer isso. Passei algum tempo analisando isso e não consegui descobrir como fazê -lo, mas encontrei muitas fontes alegando que era impossível. Parece ter sido uma decisão de design para aumentar a segurança/privacidade dos usuários.
Outras dicas
Talvez você possa ajustar ttyecho
para suas necessidades?
# /dev/ttysXXX is the result of the tty command in another Terminal window
sudo ttyecho -n /dev/ttysXXX pwd
E talvez ttyecho
poderia ser combinado com netcat
(ou nc
) ou ncat
(que faz parte do NMAP) para se comunicar entre diferentes TTYs?
Para mais informações, veja:
Para responder à sua pergunta esclarecida, uma maneira simples é usar um FIFO (chamado Pipe) para o trabalho. Ao enviar terminal:
mkfifo ./myfifo
read var
echo "var" > myfifo
No terminal de recieding:
read line < ./myfifo
Para simplesmente imprimir mais um Xterm do seu, ao reciar o Xterm:
$ tty
/dev/pts/2
Ao enviar o Xterm:
$ echo howdy doody > /dev/pts/2
Ou de um script no envio de Xterm, redirecionando Stdin enquanto você perguntou:
$ cat > /dev/pts/2
Você deve ser o CHMOD das permissões para escrever para/dev/pts/2 se estiver fazendo isso entre os usuários.
Você não pode capturar o que é impresso dessa maneira no terminal de recebimento. Não existe um método de redirecionamento construído para capturar a entrada de outro terminal.
Se você deseja uma maneira automatizada para o envio do Xterm para descobrir o dispositivo de caracteres do recebimento, isso pode ser respondido de várias maneiras, dependendo do tipo de comunicação interprocessante que você deseja usar. Um hack simples seria que o receptor faça o TTY> FILE1 e o remetente para ecoar o que
Se você quiser tentar direcionar isso do receptor em vez do remetente, novamente você tem um problema de comunicação interprocessante que pode ser resolvido de várias maneiras.
É simples que você só precisa entender
ls -ls /dev /pts você verá
0 1 2 3 4 Suponha que você abra vários
Agora use um não 4 e digite gato </dev/pts/4 ou exec <cat/dev/pts/4
e digite algo em 4 o que você sabe agora o que acontece