J'ai besoin de me connecter à la sortie du terminal en cours d'exécution (tty1) à partir du terminal virtuel et de le capturer (serveur X en cours d'exécution).
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 étant que je ne pouvais que comprendre comment attacher à un terminal qui avait été créé dans le cadre de quelqu'un qui se connectait 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!
Premier ssh dans votre box au 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]
Maintenant, revenez au TERM # 1 et tapez des trucs, cela apparaîtra dans le TERM # 2.
Toutes les commandes que j'ai essayées (top, ls, etc.) ont fonctionné sans incident en utilisant ttylog
.
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 "courant".
En tant que root, vous pouvez simplement catcher ces appareils (par exemple cat/dev/vcs2), et voir ce qui se trouve sur le VT correspondant (par exemple/dev/tty2 on on F2) comme prendre un instantané. vcsa * diffère de vcs * en ce qu'il inclut des informations sur les dimensions du terminal (l'écran). Attention, ce n'est qu'un instantané brut des personnages tels qu'ils apparaissent à l'écran - rassemblés à partir de la mémoire allouée au terminal - alors ne vous attendez pas à une sortie Nice, facilement analysable.
L'inconvénient est que si les informations passent trop vite, elles peuvent être difficiles à capturer. Peut-être que tail -f/dev/vcs1 fonctionnera, si vous devez suivre plusieurs captures d'écran (je ne l'ai pas essayé moi-même)? Il peut être plus simple de le rediriger tout d'abord vers un fichier. Il peut également être judicieux d'utiliser un VT (F1-F6) pour le regarder, 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 les vcsa * -.
Si cela ne fonctionne pas, peut-être qu'un des packages "big brotherish" qui permet à un administrateur de garder un œil sur l'activité sur un terminal peut fonctionner.
PS: j'ai oublié de demander quel OS vous utilisez. C'est pour Linux, bien que des appareils similaires existent probablement aussi sur d'autres systèmes d'exploitation. Essayez de rechercher "mémoire de console virtuelle" parmi les pages de manuel des périphériques.
Utilisez la commande tty
dans chaque terminal pour les identifier:
$ tty
/dev/pts/0
$ tty
/dev/pts/1
En supposant que ces ATS, pour rediriger la sortie standard du premier vers le second, exécutez ceci dans le premier terminal:
exec 1>/dev/pts/1
Remarque: Maintenant chaque sortie de commande apparaîtra sur pts/1
Pour restaurer le comportement par défaut stdout de pts/0:
exec 1>/dev/pts/0
Voir cette vidéo pour une démonstration.
Cela a fonctionné pour moi:
À l'aide d'un clavier sur l'ordinateur "A" (c'est-à-dire l'ordinateur physique à contrôler), exécutez: screen -q
Connectez-vous avec ssh
de l'ordinateur "B" à l'ordinateur "A".
Dans la session ssh, tapez: screen -ls
pour obtenir un identifiant de session auquel se 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'identification de session reçu du screen -ls
commande ci-dessus.
Tout ce qui est saisi dans l'une ou l'autre des "sessions" se produira dans les deux "sessions", par exemple, en tapant screen -d
quittera les DEUX sessions.
Comme je n'ai pas démarré tty1 avec screen, ce script 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
J'ai utilisé ceci dans le terminateur et j'ai dimensionné la colonne de sorte que le défilement est une ligne de texte.
Une autre approche consiste à utiliser l'utilitaire gnu screen
sur votre machine locale. Invoquez-le avec le -L
, ou commencez sans cette option et utilisez le ^aH
séquence de commandes. Dans les deux cas, toutes les entrées et sorties sont enregistrées dans un fichier nommé screenlog.x
où x est le numéro d'écran.
C'est pratique car rien de plus n'a besoin d'être installé sur la machine distante.
Ouvrez deux terminaux. Tapez tty
dans chacun et vous obtiendrez son id comme /dev/pts/nº
Ensuite, dans le premier, vous tapez script -f /dev/pts/nºofSecondTerminal
et dans la seconde vous faites le contraire script -f /dev/pts/nºofFirstTerminal
afin qu'ils soient liés
Félicitations! Les deux terminaux émettent et reçoivent le même contenu. Besoin d'un troisième? Eh bien, avez-vous étudié les combinaisons? Vous aurez besoin de 6 script -f
commandes. Encore plus tty? Bientôt...