web-dev-qa-db-ja.com

別の端末から1つの端末の出力にフックするにはどうすればよいですか?

現在実行中のターミナル(tty1)の出力を仮想ターミナルからフックしてキャプチャ(Xサーバーを実行)する必要があります。

47
pruzinat

ttylogという1つのツールに出くわしました。 CPANで利用できるPerlプログラムです here 。いくつかの注意点があります。1つは、誰かが私のボックスにsshを押し込むことの一部として作成されたターミナルに接続する方法しか理解できなかったことです。もう1つは、昇格された特権(つまり、rootまたはSudo)で実行する必要があることです。

しかし、うまくいきます!

例えば

まず、TERM#1のボックスにSSHでログインします。

TERM#1% ssh saml@grinchy

この新しい端末のttyに注意してください:

TERM#1% tty
/dev/pts/3

別の端末(TERM#2)で次のコマンドを実行します。

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]

次にTERM#1に戻って入力します。TERM#2に表示されます。

ss of terminals

私が試したすべてのコマンド(top、lsなど)は、ttylogを使用して問題なく動作しました。

23
slm

確かにそうです。/dev/vcs *および/ dev/vcsa *デバイスは、/ dev/tty *デバイス(仮想端末)に対応します。 F1 = tty1 = vcs1/vcsa1など。 vcs/vcsaは、「現在の」仮想端末のttyに似ています。

Rootとして、これらのデバイスをcat(例:cat/dev/vcs2)し、対応するVT(例:F2の/ dev/tty2がon)の何がスナップショットを撮るように見えるかを確認できます。 vcsa *は、端末(画面)の寸法に関する情報を含むという点でvcs *とは異なります。ちなみに、端末に割り当てられたメモリから収集された、画面に表示される文字の生のスナップショットにすぎないので、ニースで簡単に解析可能な出力は期待しないでください。

欠点は、情報が速すぎて点滅しすぎると、取得が困難になる可能性があることです。おそらく、tail -f/dev/vcs1が機能します。最初にファイルにリダイレクトするのが最も簡単な場合があります。端子の寸法は同じであるため、VT(F1-F6)を使用して確認することもお勧めします。私の経験では、vcsa *ではなくvcs *デバイスを使用するのが最善です。

それが機能しない場合、おそらく管理者が端末でのアクティビティを監視できるようにする「ビッグブラザー」パッケージの1つが機能する可能性があります。

PS:使用しているOSを尋ねるのを忘れていました。これはLinux向けですが、他のOSにも同様のデバイスが存在する可能性があります。デバイスのマンページから「仮想コンソールメモリ」を検索してみてください。

21
Baard Kopperud

見る:

man 1 script

例えば:

script -f /dev/tty1

ソース

18
Robert

各端末でttyコマンドを使用して、それらを識別します。

$ tty
/dev/pts/0

$ tty
/dev/pts/1

これらのTTYを想定して、最初のstdoutを2番目にリダイレクトするには、これを最初のターミナルで実行します。

exec 1>/dev/pts/1

注:すべてのコマンド出力がpts/1に表示されるようになりました

Pts/0のデフォルトの動作stdoutを復元するには:

exec 1>/dev/pts/0

デモについては このビデオ を参照してください。

5

これは私のために働きました:

  • コンピューター "A"(つまり、制御対象の物理コンピューター)のキーボードを使用して、次のコマンドを実行します:screen -q

  • コンピューター "B"からコンピューター "A"にsshで接続します。

  • Sshセッションでscreen -lsと入力して、接続するセッションIDを取得します(ttyを含む行の4桁)。

  • screen -x <session id> ...を使用して上記のセッションに接続します。上記のscreen -lsコマンドから受け取ったセッションID番号を使用します。

いずれかの「セッション」で入力されたものは両方の「セッション」で発生するため、たとえば、screen -dと入力すると、両方のセッションが終了します。

2
Ixx

画面でtty1を起動しなかったので、このスクリプトは役に立ちました:

上記のBaard Kopperudからの回答を使用しました。 「128」は私のtty1の1行です。スリープは適切な数値に設定できます。

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

これをターミネーターで使用し、列のサイズを変更して、スクロールが1行のテキストになるようにしました。

1
Jeff T

別のアプローチは、ローカルマシンでgnu screenユーティリティを使用することです。 -Lオプションを指定して呼び出すか、そのオプションなしで起動して^aHコマンドシーケンスを使用します。どちらの方法でも、すべての入出力がscreenlog.xという名前のファイルに記録されます。ここで、xは画面番号です。

リモートマシンに特別なものをインストールする必要がないため、これは便利です。

1
Chris Johnson

2つのターミナルを開きます。それぞれにttyと入力すると、それがidとして/dev/pts/nºとして表示されます

次に、最初にscript -f /dev/pts/nºofSecondTerminalと入力し、2番目に反対のscript -f /dev/pts/nºofFirstTerminalを実行して、リンクされた

おめでとうございます!両方の端末が同じものを出力および受信します。 3番目が必要ですか?さて、あなたは組み合わせを勉強しましたか? 6つのscript -fコマンドが必要です。さらにttyですか?など...