Comment puis-je me connecter à la sortie d'un terminal à partir d'un autre terminal?

45

J'ai besoin de connecter la sortie du terminal en cours d'exécution (tty1) à partir du terminal virtuel et de la capturer (serveur X en cours d'exécution).

pruzinat
la source
5
Bien que je comprenne que parfois il est nécessaire de capturer le contenu sur un autre terminal après l’exécution d’une commande, il vaut toujours mieux prévenir que guérir. Par conséquent, envisagez de commencer à utiliser screenou tmuxavant de lancer une commande à laquelle vous voudrez peut-être accéder depuis un autre terminal. .
Envoyé le
Et quand vous pourrez le préparer avant, peut-être que tmate serait aussi un bon candidat qui fonctionne même sur Internet et pas seulement au niveau local. (et dispose d'un accès en écriture facultatif)
rugk

Réponses:

23

Je suis tombé sur cet outil appelé ttylog. C'est un programme Perl disponible sur CPAN ici . Il y a quelques mises en garde, l'une d'entre elles étant que je ne pouvais comprendre que l'attachement à un terminal créé dans le cadre d'une personne ssh'ing dans ma boîte. L'autre étant que vous devez l'exécuter avec des privilèges élevés (c'est-à-dire root ou sudo).

Mais ça marche!

Par exemple

Premièrement SSH dans votre boîte en TERM # 1:

TERM#1% ssh saml@grinchy

Notez le terminal de ce nouveau terminal:

TERM#1% tty
/dev/pts/3

Maintenant, dans un autre terminal (TERM # 2), exécutez cette commande:

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]

Revenons maintenant à TERM n ° 1 et saisissez des éléments, ils apparaîtront dans TERM n ° 2.

ss des terminaux

Toutes les commandes que j'ai essayées, (top, ls, etc.) ont fonctionné sans incident ttylog.

slm
la source
Exactement ce que je cherchais (je l'ai utilisé dans le passé, mais j'ai oublié le nom et je ne pouvais pas m'en rappeler). Merci beaucoup, j'ai utilisé temporairement l'option dirty (Gdb et la réplication de sortie).
vendredi
Oui, gdbc’était la première option que j’ai trouvée, je l’avais moi-même utilisée par le passé, mais c’est un hacky, du moins pour moi. Heureux que cela vous a aidé!
slm
1
ttylog n'arrive pas à se rattacher au bon processus - n'importe qui peut-il répondre à ma question: serverfault.com/questions/560972/…
LittleBobbyTables
21

En effet, ça l'est. Les périphériques / dev / vcs * et / dev / vcsa * correspondent aux périphériques / dev / tty * (les terminaux virtuels). F1 = tty1 = vcs1 / vcsa1 et ainsi de suite. Le vcs / vcsa est comme tty pour le terminal virtuel "actuel".

En tant que root, vous pouvez simplement chatter ces périphériques (par exemple, cat / dev / vcs2) et voir ce qui se trouve sur le VT correspondant (par exemple, / dev / tty2 le sur F2) comme si vous preniez un instantané. vcsa * diffère de vcs * en ce sens qu’il inclut des informations sur les dimensions du terminal (l’écran). Remarquez, il ne s'agit que d'un instantané brut des caractères tels qu'ils apparaissent à l'écran - recueillis à partir de la mémoire allouée au terminal - ne vous attendez donc pas à une sortie agréable, facile à analyser.

L'inconvénient est que, si les informations défilent trop rapidement, elles peuvent être difficiles à capturer. Peut-être que tail -f / dev / vcs1 fonctionnera, si vous devez suivre plusieurs écrans (je n'ai pas essayé moi-même)? Il peut être plus simple de le rediriger vers un fichier en premier. Il peut également être judicieux d’utiliser un VT (F1-F6), car les terminaux auront les mêmes dimensions. D'après mon expérience, il est préférable d'utiliser les périphériques vcs *, et non vcsa *.

Si cela ne fonctionne pas, peut-être qu'un des paquets "big brotherish" permettant à un administrateur de surveiller l'activité sur un terminal peut fonctionner.

PS: J'ai oublié de demander quel système d'exploitation vous utilisez. Ceci est pour Linux, bien que des périphériques similaires existent probablement sur d'autres systèmes d'exploitation. Essayez de rechercher "mémoire de console virtuelle" parmi les pages de manuel des périphériques.

Baard Kopperud
la source
Est-il possible d'injecter une entrée dans tty1 à partir de ssh? Par exemple, je dois travailler avec une framboise qui exécute Debian, mais le problème est qu’elle n’a qu’un port USB, elle est prise en charge par l’adaptateur WiFi et je ne peux donc pas connecter physiquement un clavier pour utiliser tty1 avec elle. Étant donné que je dois exécuter un script qui, pendant le processus d'exécution, s'arrête wlan0, j'ai une situation de piège qui tente de déboguer où ce script échoue. Supposons que je ne puisse pas utiliser de hub USB ... est-il possible pour moi de rediffuser des caractères dans / dev / tty1?
Steven Lu
2
Bien. Je suis capable de diriger des trucs en /dev/tty1tant que root, mais tout ce que cela fait est d'afficher les caractères à l'écran, pas les entrer
Steven Lu
1
Désolé si c'est juste du bruit. ce n'est pas vraiment pertinent à 100%. Mais j'ai répondu à ma question dans le commentaire ci-dessus avec ceci
Steven Lu
18

Regarder:

man 1 script

par exemple:

script -f /dev/tty1
Robert
la source
Je cherchais ça. Essayer de joindre par screenéchoué lamentablement. Ça marche.
sdkks
5

Utilisez la ttycommande dans chaque terminal pour les identifier:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

En supposant que ces TTY, pour rediriger la sortie standard du premier vers le second, exécutez ceci dans le premier terminal:

exec 1>/dev/pts/1

Note: Maintenant, chaque sortie de commande sera affichée en pts / 1

Pour restaurer le comportement par défaut de la sortie standard de pts / 0:

exec 1>/dev/pts/0

Voir cette vidéo pour une démonstration.

Vitalie Ghelbert
la source
2

Cela a fonctionné pour moi:

  • En utilisant un clavier sur l’ordinateur "A" (c’est-à-dire l’ordinateur physique à contrôler), exécutez: screen -q

  • Connectez-vous sshde l'ordinateur "B" à l'ordinateur "A".

  • Dans la session ssh, tapez: screen -lspour obtenir un identifiant de session auquel vous connecter (4 chiffres sur la ligne contenant tty ).

  • Connectez-vous à la session ci-dessus avec: screen -x <session id>... en utilisant le numéro d’identifiant de session reçu de la screen -lscommande ci-dessus.

Tout ce qui est tapé dans l'une ou l'autre des "sessions" se produira dans les deux "sessions", ainsi, par exemple, la frappe screen -dtapera les DEUX sessions.

Ixx
la source
1

Une autre approche consiste à utiliser l' screenutilitaire gnu sur votre ordinateur local. Invoquez-le avec l' -Loption ou démarrez sans cette option et utilisez la ^aHséquence de commandes. Quelle que soit l'approche choisie, toutes les entrées et sorties sont consignées dans un fichier nommé screenlog.xoù x est le numéro d'écran.

C’est pratique car il n’ya rien d’extraordinaire à installer sur la machine distante.

Chris Johnson
la source
1

Puisque je n'ai pas commencé tty1 avec screen, ce script m'a aidé:

J'ai utilisé la réponse de Baard Kopperud ci-dessus. "128" est 1 ligne de mon tty1. Le sommeil peut être réglé sur un nombre approprié.

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

Je l'ai utilisé dans Terminator et dimensionné la colonne de sorte que le défilement est une ligne de texte.

Jeff T
la source
Merci pour l’idée, je devais tout simplement faire '' 'regarder cat / dev / vcs' ''. Et je viens d’ajuster mon gnome-terminal, je l’ai lu de manière à avoir 80 caractères de large.
axkibe
0

Ouvrez deux terminaux. Tapez ttydans chacun et vous obtiendrez son id comme/dev/pts/nº

Ensuite, dans le premier, vous tapez script -f /dev/pts/nºofSecondTerminalet dans le second, vous faites le contraire script -f /dev/pts/nºofFirstTerminalpour qu'ils soient liés

Félicitations! Les deux terminaux émettent et reçoivent les mêmes choses. Besoin d'un tiers? Eh bien, avez-vous étudié les combinaisons? Vous aurez besoin de 6 script -fcommandes. Encore plus tty? Bientôt...

Marcelo Teixeira Ruggeri
la source