Eu preciso conectar na saída do terminal atualmente em execução (tty1) do terminal virtual e capturá-lo (executando o servidor X).
Eu preciso conectar na saída do terminal atualmente em execução (tty1) do terminal virtual e capturá-lo (executando o servidor X).
Respostas:
Me deparei com essa ferramenta chamada ttylog
. É um programa Perl disponível no CPAN aqui . Ele tem algumas ressalvas, uma delas que eu só conseguia descobrir como conectar a um terminal que foi criado como parte de alguém que está entrando na minha caixa. O outro é que você precisa executá-lo com privilégios elevados (ou seja, root ou sudo).
Mas funciona!
Primeiro ssh em sua caixa no TERMO 1:
TERM#1% ssh saml@grinchy
Observe o tty deste novo terminal:
TERM#1% tty
/dev/pts/3
Agora em outro terminal (TERM # 2), execute este comando:
TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]
Agora volte para o TERM # 1 e digite material, ele aparecerá no TERM # 2.
Todos os comandos que tentei (top, sl, etc.) funcionaram sem incidentes ttylog
.
gdb
foi a primeira opção que me deparei, eu a usei no passado, mas é hacky, pelo menos para mim. Fico feliz que isso ajudou você!
De fato é. Os dispositivos / dev / vcs * e / dev / vcsa * correspondem aos dispositivos / dev / tty * (os terminais virtuais). F1 = tty1 = vcs1 / vcsa1 e assim por diante. O vcs / vcsa é como tty para o terminal virtual "atual".
Como root, você pode simplesmente catear esses dispositivos (por exemplo, cat / dev / vcs2) e ver o que está no VT correspondente (por exemplo, / dev / tty2 ou o F2) como tirar uma foto instantânea. vcsa * difere de vcs * por incluir informações sobre as dimensões do terminal (a tela). Lembre-se, é apenas um instantâneo bruto dos personagens, como eles aparecem na tela - coletados a partir da memória alocada no terminal -, portanto, não espere resultados agradáveis e facilmente analisáveis.
A desvantagem é que, se as informações passarem rápido demais, pode ser difícil capturá-las. Talvez tail -f / dev / vcs1 funcione, se você precisar seguir vários screenfulls (ainda não tentei)? Pode ser mais fácil simplesmente redirecioná-lo para um arquivo primeiro. Também pode ser uma boa ideia usar um VT (F1-F6) para examiná-lo, pois os terminais terão as mesmas dimensões. Na minha experiência, é melhor usar os dispositivos vcs * - não os vcsa * -.
Se isso não funcionar, talvez um dos pacotes "big brotherish" que permite que um administrador fique de olho na atividade em um terminal possa funcionar.
PS: Esqueci de perguntar qual sistema operacional você usa. Isso é para Linux, embora dispositivos semelhantes provavelmente existam em outros sistemas operacionais também. Tente pesquisar por "memória do console virtual" entre as páginas de manual dos dispositivos.
wlan0
, na verdade, tenho uma situação catch-22 tentando depurar onde esse script está falhando. Suponha que eu não possa usar um hub usb ... existe uma maneira de canalizar caracteres para / dev / tty1 de alguma forma?
/dev/tty1
como root, mas tudo isso faz é exibir os caracteres para a tela, não inseri-los
Use o tty
comando em cada terminal para identificá-los:
$ tty
/dev/pts/0
$ tty
/dev/pts/1
Supondo que esses TTYs, para redirecionar o stdout do primeiro para o segundo, execute isso no primeiro terminal:
exec 1>/dev/pts/1
Nota: Agora toda saída de comando será exibida em pts / 1
Para restaurar o comportamento padrão stdout de pts / 0:
exec 1>/dev/pts/0
Veja este vídeo para uma demonstração.
Isso funcionou para mim:
Usando um teclado no computador "A" (ou seja, o computador físico a ser controlado), execute: screen -q
Conecte-se ssh
do computador "B" ao computador "A".
Na sessão ssh, digite: screen -ls
para obter um ID de sessão ao qual se conectar (4 dígitos na linha que contém tty ).
Conecte-se à sessão acima com: screen -x <session id>
... usando o número de identificação da sessão recebido do screen -ls
comando acima.
Qualquer coisa digitada em qualquer "sessão" acontecerá nas duas "sessões"; portanto, por exemplo, a digitação screen -d
encerrará AMBAS as sessões.
Outra abordagem é usar o screen
utilitário gnu na sua máquina local. Chame-o com a -L
opção ou inicie sem essa opção e use a ^aH
sequência de comandos. Qualquer uma das abordagens faz com que todas as entradas e saídas sejam registradas em um arquivo chamado screenlog.x
onde x é o número da tela.
Isso é útil, pois nada mais precisa ser instalado na máquina remota.
Como não iniciei o tty1 com tela, este script ajudou:
Eu usei a resposta de Baard Kopperud acima. "128" é uma linha do meu tty1. O sono pode ser definido como um número apropriado.
#!/bin/bash
while true
do
sudo tail -c 128 /dev/vcs1 && echo ""
sleep 10
done
Eu usei isso no terminador e dimensionei a coluna para que o pergaminho seja uma linha de texto.
Abra dois terminais. Digite tty
cada um e você obterá o ID como/dev/pts/nº
Então no primeiro você digita script -f /dev/pts/nºofSecondTerminal
e no segundo você faz o oposto script -f /dev/pts/nºofFirstTerminal
para que eles fiquem ligados
Parabéns! Ambos os terminais emitem e recebem o mesmo material. Precisa de um terço? Bem, você estudou combinações? Você precisará de 6 script -f
comandos. Ainda mais tty? Em breve...
screen
outmux
antes de iniciar um comando que você possa acessar de outro terminal .