Come posso collegarmi all'uscita di un terminale da un altro terminale?


45

Devo collegarmi all'output del terminale attualmente in esecuzione (tty1) dal terminale virtuale e catturarlo (eseguendo il server X).


5
Mentre capisco che a volte sorge la necessità di acquisire contenuti su un altro tty dopo l'esecuzione di un comando, un'oncia di prevenzione merita una libbra di cura, quindi considera sempre di iniziare a utilizzare screeno tmuxprima di avviare un comando a cui potresti voler accedere da un altro terminale .
depquid

E quando puoi prepararlo prima, forse anche tmate sarebbe un bel candidato che lavora anche su Internet e non solo a livello locale. (e ha accesso in scrittura opzionale)
rugk

Risposte:


23

Mi sono imbattuto in questo strumento chiamato ttylog. È un programma Perl disponibile su CPAN qui . Ha un paio di avvertimenti, uno dei quali è che ho potuto solo capire come collegarmi a un terminale che è stato creato come parte di qualcuno che sta lanciando nella mia scatola. L'altro è che devi eseguirlo con privilegi elevati (cioè root o sudo).

Ma funziona!

Per esempio

Primo ssh nella tua scatola in TERM # 1:

TERM#1% ssh saml@grinchy

Nota questo nuovo terminale tty:

TERM#1% tty
/dev/pts/3

Ora in un altro terminale (TERM # 2) eseguire questo 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]

Ora torna a TERM # 1 e digita roba, verrà visualizzata in TERM # 2.

ss di terminali

Tutti i comandi che ho provato, (top, ls, ecc.) Hanno funzionato senza incidenti usando ttylog.


Esattamente quello che stavo cercando (l'ho usato in passato, ma ho dimenticato il nome e non riuscivo a ricordare). Mille grazie, ho temporaneamente usato l'opzione sporca (gdb e replica di output).
pruzinat,

Sì, è gdbstata la prima opzione che mi sono imbattuto, l'ho usato da solo in passato, ma è un po 'confuso, almeno per me. Sono contento che questo ti abbia aiutato!
slm

1
Sembra che ttylog non riesca a collegarsi al processo corretto - qualcuno può rispondere alla mia domanda: serverfault.com/questions/560972/…
LittleBobbyTabella

21

Certo che lo è. I dispositivi / dev / vcs * e / dev / vcsa * corrispondono ai dispositivi / dev / tty * (i terminali virtuali). F1 = tty1 = vcs1 / vcsa1 e così via. Il vcs / vcsa è come tty per il terminale virtuale "corrente".

Come root, puoi semplicemente cat questi dispositivi (ad esempio cat / dev / vcs2) e vedere cosa c'è sul VT corrispondente (ad esempio / dev / tty2 on su F2) come scattare un'istantanea. vcsa * differisce da vcs * in quanto include informazioni sulle dimensioni del terminale (lo schermo). Intendiamoci, è solo un'istantanea grezza dei personaggi che vengono visualizzati sullo schermo - raccolti dalla memoria allocata al terminale - quindi non aspettatevi un output piacevole e facilmente analizzabile.

Lo svantaggio è che se le informazioni passano troppo velocemente, potrebbe essere difficile catturarle. Forse tail -f / dev / vcs1 funzionerà, se hai bisogno di seguire diversi screenfulls (non ho provato me stesso)? Potrebbe essere più semplice reindirizzarlo prima su un file. Potrebbe anche essere una buona idea usare un VT (F1-F6) per guardarlo, poiché i terminali avranno le stesse dimensioni. Nella mia esperienza, è meglio usare i dispositivi vcs * - non vcsa * -.

Se ciò non funziona, forse potrebbe funzionare uno dei pacchetti "big brotherish" che consente all'amministratore di tenere d'occhio l'attività su un terminale.

PS: ho dimenticato di chiedere quale sistema operativo usi. Questo è per Linux, sebbene dispositivi simili probabilmente esistano anche su altri sistemi operativi. Prova a cercare "memoria della console virtuale" tra le pagine man dei dispositivi.


C'è un modo per iniettare input in tty1 da ssh? Ad esempio, devo lavorare con un raspberry pi che esegue Debian, ma il problema è che ha solo una porta USB, è occupata dall'adattatore wifi e quindi non posso collegare fisicamente una tastiera per usare tty1 con essa. Dal momento che ho bisogno di eseguire uno script che, durante il processo di esecuzione, si arresta wlan0, in realtà ho una situazione catch-22 che prova a eseguire il debug in cui questo script non riesce. Supponiamo che non riesca a usare un hub USB ... c'è un modo per me inoltrare i caratteri in / dev / tty1 in qualche modo?
Steven Lu

2
Bene. Sono in grado di reindirizzare le cose /dev/tty1come root ma tutto ciò che fa è visualizzare i personaggi sullo schermo, non inserirli
Steven Lu

1
Scusa se questo è solo rumore. non è rilevante al 100%. Ma ho risposto alla mia domanda nel commento sopra con questo
Steven Lu

18

guarda a:

man 1 script

per esempio:

script -f /dev/tty1

Lo stavo cercando. Cercare di attaccare screenfallito miseramente. Funziona.
sdkks,

5

Utilizzare il ttycomando in ciascun terminale per identificarli:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Supponendo che questi TTY, per reindirizzare il primo stdout al secondo, eseguirlo nel primo terminale:

exec 1>/dev/pts/1

Nota: ora ogni output di comando verrà mostrato su pts / 1

Per ripristinare il comportamento predefinito stdout di pts / 0:

exec 1>/dev/pts/0

Guarda questo video per una dimostrazione.


2

Questo ha funzionato per me:

  • Utilizzando una tastiera sul computer "A" (ovvero il computer fisico da controllare), eseguire: screen -q

  • Connettiti con sshdal computer "B" al computer "A".

  • Nella sessione ssh, digitare: screen -lsper ottenere un ID sessione a cui connettersi (4 cifre sulla riga che contiene tty ).

  • Connettiti alla sessione precedente con: screen -x <session id>... usando il numero ID della sessione ricevuto dal screen -lscomando sopra.

Tutto ciò che viene digitato in entrambe le "sessioni" accadrà in entrambe le "sessioni", quindi ad esempio digitando screen -dusciranno entrambe le sessioni.


1

Un altro approccio è quello di utilizzare l' screenutilità gnu sul tuo computer locale. Richiamalo con l' -Lopzione o avvia senza quell'opzione e usa la ^aHsequenza di comandi. Entrambi gli approcci fanno sì che tutti gli input e output vengano registrati in un file chiamato screenlog.xdove x è il numero dello schermo.

Questo è utile perché non è necessario installare nulla in più sul computer remoto.


1

Da quando non ho iniziato tty1 con lo schermo questo script mi ​​ha aiutato:

Ho usato la risposta di Baard Kopperud sopra. "128" è 1 riga del mio tty1. Il sonno può essere impostato su un numero appropriato.

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

Ho usato questo in terminatore e dimensionato la colonna in modo che lo scorrimento sia una riga di testo.


Grazie per l'idea, sul rasperry dovevo semplicemente fare '' 'watch cat / dev / vcs' '' Per guardare un processo che ho iniziato su una console virtuale dimenticando di usare 'screen'. E ho appena regolato il mio terminale gnomo in cui ho eseguito questa larghezza di 80 caratteri.
axkibe,

0

Apri due terminali. Digita ttyciascuno e otterrai il suo ID come/dev/pts/nº

Quindi nel primo si digita script -f /dev/pts/nºofSecondTerminale nel secondo si fa il contrario in script -f /dev/pts/nºofFirstTerminalmodo che vengano collegati

Congratulazioni! Entrambi i terminali trasmettono e ricevono le stesse cose. Ti serve un terzo? Bene, hai studiato le combinazioni? Avrai bisogno di 6 script -fcomandi. Ancora più tty? Presto...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.