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


45

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


5
コマンドの実行後に別のttyでコンテンツをキャプチャする必要が生じる場合があることを理解していますが、1オンスの予防には1ポンドの治療に値するため、別の端末からアクセスしたいコマンドの使用を開始する前screenまたはtmux開始する前に常に検討してください。
13

また、前に準備できれば、tmateはローカルだけでなくインターネット上でも動作する素晴らしい候補者になるでしょう。(オプションの書き込みアクセス権があります)
rugk

回答:


23

という1つのツールに出会いましたttylog。こちらのCPAN 入手できるPerlプログラムです。いくつか注意点がありますが、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に戻ってstuffと入力すると、TERM#2に表示されます。

端末のSS

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


まさに私が探していたものです(過去に使用しましたが、名前を忘れて覚えられませんでした)。おかげで、一時的にダーティオプション(gdbおよび出力レプリケーション)を使用しました。
pruzinat

はい、これgdbは私が出会った最初のオプションでした。過去に自分で使用しましたが、少なくとも私にとってはハッキーです。これはあなたを助けてくれてうれしい!
slm

1
ttylogに関するはかかわらず、正しいプロセスにアタッチように見えることはできません-缶誰もが私の質問に答える:serverfault.com/questions/560972/...
LittleBobbyTables

21

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

rootとして、これらのデバイスをcatするだけで(例:cat / dev / vcs2)、スナップショットを撮るなど、対応するVT(例:F2の/ dev / tty2)に何があるかを確認できます。vcsa *はvcs *と異なり、端末(画面)の寸法に関する情報が含まれています。ターミナルに割り当てられたメモリから収集された、画面に表示される文字のスナップショットにすぎないことに注意してください。したがって、見やすく、解析しやすい出力を期待しないでください。

欠点は、情報のフラッシュが速すぎると、キャプチャが困難になる可能性があることです。複数の画面いっぱいをたどる必要がある場合は、おそらくtail -f / dev / vcs1が機能します(自分で試していない)。最初に単純にファイルにリダイレクトするのが最も簡単な場合があります。端末の寸法は同じであるため、VT(F1〜F6)を使用して確認することをお勧めします。私の経験では、vcsa *ではなくvcs *デバイスを使用するのが最善です。

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

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


sshからtty1に入力を注入する方法はありますか?たとえば、Debianを実行しているraspberry piで作業する必要がありますが、問題はUSBポートが1つしかないため、wifiアダプターによって占有されるため、tty1を使用するためにキーボードを物理的に接続できないことです。実行プロセス中にシャットダウンするスクリプトを実行する必要があるためwlan0、実際にはこのスクリプトが失敗する場所をデバッグしようとするcatch-22状況があります。usbハブを使用できないと仮定します...どういうわけかcharsを/ dev / tty1にパイプする方法はありますか?
スティーブンルー14年

2
まあ。/dev/tty1ルートとしてパイプすることはできますが、これは文字を入力せずに画面に表示することです
スティーブンルー14年

1
これが単なるノイズの場合は申し訳ありません。実際には100%関連しているわけではありません。しかし、私はと上記のコメントで私の質問に答え、この
スティーブン・呂

18

見る:

man 1 script

例えば:

script -f /dev/tty1

これを探していました。添付しようとしてscreen失敗しました。できます。
sdkks

5

tty各ターミナルでコマンドを使用して、それらを識別します。

$ tty
/dev/pts/0

$ tty
/dev/pts/1

これらのTTYを想定して、最初の標準出力を2番目にリダイレクトするには、最初の端末でこれを実行します。

exec 1>/dev/pts/1

注:これで、すべてのコマンド出力がpts / 1に表示されます

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

exec 1>/dev/pts/0

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


2

これは私のために働いた:

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

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

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

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

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


1

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

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


1

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

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

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

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


アイデアのおかげで、ラズベリーでは単に「 '' watch cat / dev / vcs ''」をしなければなりませんでした。「コンソール」の使用を忘れて仮想コンソールで開始したプロセスを見るために。そして、私はちょうどgnome-terminalを調整して、これを80文字幅になるように実行しました。
axkibe

0

2つのターミナルを開きます。ttyそれぞれを入力すると、IDが取得されます/dev/pts/nº

次に、最初に入力script -f /dev/pts/nºofSecondTerminalし、2番目に入力すると反対script -f /dev/pts/nºofFirstTerminalになり、リンクされます

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.