Como conectar a saída de um terminal de outro terminal?


45

Eu preciso conectar na saída do terminal atualmente em execução (tty1) do terminal virtual e capturá-lo (executando o servidor X).


5
Embora eu entenda que às vezes surge a necessidade de capturar conteúdo em outro tty após a execução de um comando, uma grama de prevenção vale um quilo de cura, portanto, sempre considere começar a usar screenou tmuxantes de iniciar um comando que você possa acessar de outro terminal .
depquid

E quando você pode prepará-lo antes, talvez também o tmate seja um bom candidato que até trabalhe na Internet e não apenas local. (e tem acesso de gravação opcional)
rugk

Respostas:


23

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!

Por exemplo

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.

ss de terminais

Todos os comandos que tentei (top, sl, etc.) funcionaram sem incidentes ttylog.


Exatamente o que eu estava procurando (eu o usei no passado, mas esqueci o nome e não consegui me lembrar). Muito obrigado, usei temporariamente a opção suja (gdb e replicação de saída).
pruzinat

Sim, gdbfoi a primeira opção que me deparei, eu a usei no passado, mas é hacky, pelo menos para mim. Fico feliz que isso ajudou você!
Slm

1
ttylog não consigo anexar ao processo correto embora - resposta qualquer um pode a minha pergunta: serverfault.com/questions/560972/...
LittleBobbyTables

21

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.


Existe alguma maneira de injetar entrada no tty1 do ssh? Por exemplo, eu preciso trabalhar com um raspberry pi executando o Debian, mas o problema é que ele tem apenas uma porta USB, é ocupada pelo adaptador wifi e, portanto, não consigo conectar fisicamente um teclado para usar o tty1 com ele. Como preciso executar um script que, durante o processo de execução, seja encerrado 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?
Steven Lu

2
Bem. Eu sou capaz de coisas tubo para /dev/tty1como root, mas tudo isso faz é exibir os caracteres para a tela, não inseri-los
Steven Lu

1
Desculpe se isso é apenas ruído. não é realmente 100% relevante. Mas eu respondi a minha pergunta no comentário acima com isso
Steven Lu

18

Olhe para:

man 1 script

por exemplo:

script -f /dev/tty1

Eu estava procurando por isso. Tentando anexar por screenfalhou miseravelmente. Funciona.
Sdkks

5

Use o ttycomando 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.


2

Isso funcionou para mim:

  • Usando um teclado no computador "A" (ou seja, o computador físico a ser controlado), execute: screen -q

  • Conecte-se sshdo computador "B" ao computador "A".

  • Na sessão ssh, digite: screen -lspara 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 -lscomando acima.

Qualquer coisa digitada em qualquer "sessão" acontecerá nas duas "sessões"; portanto, por exemplo, a digitação screen -dencerrará AMBAS as sessões.


1

Outra abordagem é usar o screenutilitário gnu na sua máquina local. Chame-o com a -Lopção ou inicie sem essa opção e use a ^aHsequência de comandos. Qualquer uma das abordagens faz com que todas as entradas e saídas sejam registradas em um arquivo chamado screenlog.xonde x é o número da tela.

Isso é útil, pois nada mais precisa ser instalado na máquina remota.


1

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.


Obrigado pela idéia, no rasperry eu simplesmente tive que fazer '' 'watch cat / dev / vcs' '' Para assistir a um processo, iniciei em um console virtual esquecendo o uso de 'screen'. E eu acabei de ajustar meu terminal gnome. Corri isso para ter 80 caracteres de largura.
Axkibe 13/09/17

0

Abra dois terminais. Digite ttycada um e você obterá o ID como/dev/pts/nº

Então no primeiro você digita script -f /dev/pts/nºofSecondTerminale no segundo você faz o oposto script -f /dev/pts/nºofFirstTerminalpara 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 -fcomandos. Ainda mais tty? Em breve...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.