Pegar um redirecionamento direto a / dev / tty
Pergunta
Eu estou trabalhando em um controlador de aplicação para um programa que é um texto cuspir diretamente para / dev / tty.
Este é um controlador de aplicativo de produção, que deve ser capaz de capturar todo o texto vai para o terminal. Geralmente, este não é um problema. Nós simplesmente redirecionar stdout e stderr. Esta aplicação particular está fazendo chamadas diretas para ecoar e redirecionar o resultado para / dev / tty (echo "some text" > /dev/tty
). Redirecionamentos via meu controlador de aplicação não estão a travar o texto.
Eu tenho a fonte para esta aplicação, mas não estou em posição de modificá-lo, nem é a ser mais mantido. Todas as ideias sobre como travar e / ou jogar fora a saída?
Solução
Não consigo bastante determinar se o programa screen
mencionado por @flolo vai fazer o que você precisa ou não. Pode, mas eu não tenho certeza se há um recurso de registro embutido, que parece ser o que você precisa.
Provavelmente é um programa lá fora já a fazer o que você precisa. Eu tinha nomear sudosh
como uma possibilidade.
Se você acabar precisando de escrever o seu próprio, você provavelmente vai precisar usar um pseudo-tty (PTY) e ter o seu controlador de sit aplicação entre conexão terminal real do usuário e do dispositivo pty, onde ele pode logar tudo o que você precisa para iniciar sessão. Isso não é trivial. Você pode encontrar informações sobre isso em Rochkind de " Avançada UNIX Programação, 2a ed " livro, e sem dúvida outros livros semelhantes (Stevens' 'Programação avançada no UNIX Ambiente' livro é um candidato provável, mas eu não tenho uma cópia para verificar se).
Outras dicas
A solução clássica para o controlo de uma aplicação como este é Esperar , que define-se pseudo-terminais, faz login e unidades da aplicação controlada a partir de um script. Ele vem com um monte de scripts de exemplo para que você provavelmente só pode adaptar um para atender às suas necessidades.
Isto é o que eu fiz em python
import pty, os
pid, fd = pty.fork()
if pid == 0: # In the child process execute another command
os.execv('./my-progr', [''])
print "Execv never returns :-)"
else:
while True:
try:
print os.read(fd,65536),
except OSError:
break